Files
HuangHai 1f397eca87 'commit'
2025-08-30 18:35:01 +08:00

53 lines
1.7 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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;
}