首先用 Nexti 表示下一个与第 i 个颜色相同的点的坐标,然后枚举第一个数,通过 Next 数组可以知道第三个数,然后判断一下是否可以存在 y,如果存在的话,就加上这一组的和。
但是如果 color 数组很多都是一样的话,就被卡了,80pts。是否有优化的地步?
#include <iostream>
using namespace std;
const int N = 100010;
const int mod = 10007;
int n, m;
int sum = 0;
int num[N], color[N];
int Next[N], val[N];
int main() {
cin >> n >> m;
for (int i = 1; i <= n; i++) cin >> num[i];
for (int i = 1; i <= n; i++) {
cin >> color[i];
Next[val[color[i]]] = i, val[color[i]] = i;
}
for (int i = 1; i <= n; i++) {
int x = Next[i];
while (x) {
if ((x - i) % 2) { x = Next[x]; continue; }
sum += (i + x) % mod * (num[i] + num[x]) % mod, sum %= mod;
x = Next[x];
}
}
cout << sum << endl;
return 0;
}