You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
|
|
#include <bits/stdc++.h>
|
|
|
|
|
using namespace std;
|
|
|
|
|
|
|
|
|
|
const int N = 100010, mod = 10007;
|
|
|
|
|
|
|
|
|
|
int w[N]; // 第i个格子的数字
|
|
|
|
|
int c[N]; // 第i个格子的颜色
|
|
|
|
|
int s[N][2];
|
|
|
|
|
// s[i][0]:颜色为i、编号为偶数格子上数字的和
|
|
|
|
|
// s[i][1]:颜色为i、编号为奇数格子上数字的和
|
|
|
|
|
|
|
|
|
|
int cnt[N][2];
|
|
|
|
|
// cnt[i][0]:颜色为i、编号为偶数格子的个数
|
|
|
|
|
// cnt[i][1]:颜色为i、编号为奇数格子的个数
|
|
|
|
|
|
|
|
|
|
int main() {
|
|
|
|
|
int n, m;
|
|
|
|
|
cin >> n >> m;
|
|
|
|
|
for (int i = 1; i <= n; i++) cin >> w[i]; // 第i个格子的数字
|
|
|
|
|
// 预处理
|
|
|
|
|
for (int i = 1; i <= n; i++) { // 遍历每个格子
|
|
|
|
|
cin >> c[i]; // 格子颜色c[i]
|
|
|
|
|
/*
|
|
|
|
|
装入不同的组中,组划分是两个规则:
|
|
|
|
|
① 颜色必须相同
|
|
|
|
|
② 奇偶性必须相同
|
|
|
|
|
所以,c[i]相同的放到同一个颜色组内,并且,在同一个颜色组内,奇偶数还必须相同。
|
|
|
|
|
|
|
|
|
|
s[][]:随着i的不断向后遍历,s中记录了相同颜色,相同奇偶性的格子,数字的累加和
|
|
|
|
|
cnt[][]:记录每个分组中的格子个数
|
|
|
|
|
*/
|
|
|
|
|
s[c[i]][i % 2] = (s[c[i]][i % 2] + w[i]) % mod; // 累加分组内数字和
|
|
|
|
|
cnt[c[i]][i % 2]++; // 维护分组内格子个数
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int ans = 0;
|
|
|
|
|
for (int i = 1; i <= n; i++) // 枚举每个格子
|
|
|
|
|
/*
|
|
|
|
|
Q:这个格子在哪个分组里呢?
|
|
|
|
|
答:
|
|
|
|
|
(1) c[i] : 按颜色划分
|
|
|
|
|
(2) i % 2 : 按奇偶性划分
|
|
|
|
|
|
|
|
|
|
Q:这个分组中格子的数量是多少呢?
|
|
|
|
|
答: cnt[c[i]][i % 2]
|
|
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
ans = (ans + i * ((cnt[c[i]][i % 2] - 2) * w[i] % mod + s[c[i]][i % 2])) % mod;
|
|
|
|
|
|
|
|
|
|
printf("%d\n", ans);
|
|
|
|
|
return 0;
|
|
|
|
|
}
|