分块求助
  • 板块P2357 守墓人
  • 楼主_FILARET_
  • 当前回复2
  • 已保存回复2
  • 发布时间2020/5/12 22:11
  • 上次更新2023/11/7 02:34:18
查看原帖
分块求助
84121
_FILARET_楼主2020/5/12 22:11

RT, 样例过不了

#include <bits/stdc++.h>
using namespace std;
const int MAXN = 2e5 + 5;
int N, F, B;
int a[MAXN], sum[MAXN], add[MAXN];
int get(int x) {
	return (x + B - 1) / B;
}
void chg(int l, int r, int x) {
	int idl = get(l), idr = get(r);
	if(idl == idr) {
        for(int i = l ; i <= r ; i ++)
            a[i] += x;
        sum[idl] += (r - l + 1) * x;
    } else {
        for(int i = idl + 1 ; i <= idr - 1 ; i ++)
            add[i] += x;
        for(int i = l ; i <= idl * B ; i ++)
            a[i] += x;
        sum[idl] += (idl * B - l + 1) * x;
    	for(int i = (idr - 1) * B + 1 ; i <= r ; i ++)
            a[i] += x;
        sum[idr] += (r - (idr - 1) * B) * x;
    }
}
int ask(int l, int r) {
	int idl = get(l), idr = get(r);
	int ans = 0;
	if(idl == idr) {
        for(int i = l ; i <= r ; i ++)
            ans += a[i] + add[idl];
    } else {
        for(int i = idl + 1 ; i <= idr - 1 ; i ++) 
            ans += sum[i] + add[i] * B;
        for(int i = l ; i <= idl * B ; i ++)
            ans += a[i] + add[idl];
        for(int i = (idr - 1) * B + 1 ; i <= r ; i ++) 
            ans += a[i] + add[idr];
    }
	return ans;
}
int main() {
	cin >> N >> F; 
	N --;
	B = sqrt(N);
	for(int i = 0 ; i <= N ; i ++) {
		cin >> a[i];
		sum[get(i)] += a[i];
	}
	for(int i = 1 ; i <= F ; i ++) {
		int op, l, r, x;
		cin >> op;
		if(op == 1) {
			cin >> l >> r >> x;
			l --, r --;
			if(l == 0) {
				a[0] += x;
				l = 1;
			}
			chg(l, r, x);
		} else if(op == 2) {
			cin >> x;
			a[0] += x;
		} else if(op == 3) {
			cin >> x;
			a[0] -= x;
		} else if(op == 4) {
			cin >> l >> r;
			int ans = 0;
			if(l == 0) {
				ans += a[0];
				l = 1;
			}
			ans += ask(l, r);
			cout << ans << endl;
		} else if(op == 5) {
			cout << a[0] << endl;
		}
	}
	return 0;
}
2020/5/12 22:11
加载中...