Files

53 lines
1.7 KiB
C++
Raw Permalink Normal View History

2025-08-30 18:35:01 +08:00
#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;
}