社区讨论

E题求条

灌水区参与者 2已保存回复 9

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
9 条
当前快照
1 份
快照标识符
@m307oomf
此快照首次捕获于
2024/11/02 21:41
去年
此快照最后确认于
2025/11/04 15:30
4 个月前
查看原帖
CPP
#include <bits/stdc++.h>

#define int long long

using namespace std;

const int N = 2e5 + 10;

int n, m, a[N];
int tr[N], tr2[N];
int cnt[N];

int lowbit(int x) {
    return x & -x;
}

void update(int x, int c) {
    for (int i = x; i <= m - 1; i += lowbit(i)) 
        tr[i] += c;
}

int query(int x) {
    int res = 0;
    for (int i = x; i; i -= lowbit(i)) 
        res += tr[i];
    return res;
}

void update2(int x, int c) {
    for (int i = x; i <= m - 1; i += lowbit(i)) 
        tr2[i] += c;
}

int query2(int x) {
    int res = 0;
    for (int i = x; i; i -= lowbit(i)) 
        res += tr2[i];
    return res;
}


signed main() {
	cin >> n >> m;
	for (int i = 1; i <= n; i++) {
	    cin >> a[i];
	    a[i] += a[i - 1];
	    cnt[a[i] % m]++;
	}
	int res = 0;
	for (int i = 1; i < m; i++)
	    res += cnt[i] * i;
	for (int i = 1; i <= n; i++) {
	    if ((a[i] % m == 0) || (a[i] % m == 1)) {
	        if (a[i] % m == 1) {
	            update(a[i] % m, a[i] % m), update2(a[i] % m, 1);
	        }
	        continue;
	    }
	    int tmp = query2(a[i] % m - 1) * (a[i] % m) - query(a[i] % m - 1);
	    res += tmp;
	    update(a[i] % m, a[i] % m), update2(a[i] % m, 1);
	}
	memset(tr, 0, sizeof tr);
	memset(tr2, 0, sizeof tr2);
	for (int i = n; i >= 1; i--) {
	    if ((a[i] % m == 0) || (a[i] % m == 1)) {
	        if (a[i] % m == 1) {
	            update(a[i] % m, a[i] % m), update2(a[i] % m, 1);
	        }
	        continue;
	    }
	    int tmp = query2(a[i] % m - 1) * (a[i] % m) - query(a[i] % m - 1);
	    res += m * query2(a[i] % m - 1) - tmp;
	    update(a[i] % m, a[i] % m), update2(a[i] % m, 1);
	}
	cout << res << '\n';
	return 0;
}

回复

9 条回复,欢迎继续交流。

正在加载回复...