80 分求助,WA on #6#7
查看原帖
80 分求助,WA on #6#7
470348
oddy楼主2024/7/19 13:31

如题,翻遍了本题的提交记录也没找到像我这样的错误,感觉很奇怪。

我的提交记录:https://www.luogu.com.cn/record/167087639

我的代码思路是:用推式子的方法 O(1)O(1) 计算每个右端点对答案的贡献。需要用到的前缀和有:∑i,∑numi,∑(i⋅numi)\sum i, \sum num_i,\sum (i\cdot num_i)。

代码:

#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';
}
2024/7/19 13:31
加载中...