如题,翻遍了本题的提交记录也没找到像我这样的错误,感觉很奇怪。
我的提交记录:https://www.luogu.com.cn/record/167087639
我的代码思路是:用推式子的方法 O(1) 计算每个右端点对答案的贡献。需要用到的前缀和有:∑i,∑numi,∑(i⋅numi)。
代码:
#include <iostream>
#include <algorithm>
#define N 100005
#define P 10007
using namespace std;
int n, m, ans, a[N], b[N], id[N];
long long si, sx, sa, sax;
bool cmp(int &x, int &y) { // 按颜色、奇偶性对这些点排序,方便求前缀和
if(b[x] != b[y]) return b[x] < b[y];
if((x & 1) != (y & 1)) return (x & 1) < (y & 1);
return x < y;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cin >> n >> m;
for(int i = 1; i <= n; i++) cin >> a[i], a[i] %= P, id[i] = i;
for(int i = 1; i <= n; i++) cin >> b[i];
sort(id+1, id+n+1, cmp);
for(int i = 1; i <= n; i++) {
if((id[i] & 1) != (id[i-1] & 1))
si = sx = sa = sax = 0;
ans = (ans + sax + sx * a[id[i]]
+ sa * id[i] + si * id[i] % P * a[id[i]]) % P;
si++; sx = (sx + id[i]) % P;
sa = (sa + a[id[i]]) % P;
sax = (sax + id[i] * a[id[i]]) % P;
}
cout << ans << '\n';
}