分块80分求助,#21WA了
  • 板块P2357 守墓人
  • 楼主hwx_1
  • 当前回复2
  • 已保存回复2
  • 发布时间2022/10/16 14:51
  • 上次更新2023/10/27 07:15:55
查看原帖
分块80分求助,#21WA了
461813
hwx_1楼主2022/10/16 14:51
#include<bits/stdc++.h>
#define gc getchar
#define pb push_back
using namespace std;

typedef long long ll;
typedef pair<int, int> pii;

const int N = 2e5 + 10, M = sqrt(N) + 10;

inline int read() {
	int x = 0; bool flag = 0; char ch = gc();
	for (;!isdigit(ch); ch = gc()) flag |= ch == '-';
	for (; isdigit(ch); ch = gc()) x = (x << 1) + (x << 3) + (ch ^ 48);
	return flag ? ~(x - 1) : x;
}

int n, m, len;
ll a[N];

namespace decompose {
	ll sum[M], add[M], leng[M];
	#define pos(x) x/len
	
	inline void change(int l, int r, int d) {
		int x = pos(l), y = pos(r);
		if (x == y) {
			for (int i = l; i <= r; i ++)
				a[i] += d, sum[x] += d;
			return ;
		}
		
		int i = l, j = r;
		while (pos(i) == x) a[i ++] += d, sum[x] += d;
		while (pos(j) == y) a[j --] += d, sum[y] += d;
		for (int k = pos(i); k <= pos(j); k ++)
			sum[k] += (ll)len * d, add[k] += d;
	}
	
	inline ll query(int l, int r) {
		ll res = 0;
		int x = pos(l), y = pos(r);
		if (x == y) {
			for (int i = l; i <= r; i ++)
				res += a[i] + add[x];
			return res;
		}
		
		int i = l, j = r;
		while (pos(i) == x) res += a[i ++] + add[x];
		while (pos(j) == y) res += a[j --] + add[y];
		for (int k = pos(i); k <= pos(j); k ++) res += sum[k];
		return res;
	}
}


int main() {
	using namespace decompose;
	n = read(), m = read(), len = sqrt(n);
	for (int i = 1; i <= n; i ++)
		sum[pos(i)] += a[i] = read(),
		leng[pos(i)] ++;
	
	int op, l, r, k;
	for (int i = 1; i <= m; i ++) {
		op = read();
		switch (op) {
			case 1 : l = read(), r = read(), k = read(); change(l, r, k); break;
			case 2 : k = read(); change(1, 1, k); break;
			case 3 : k = read(); change(1, 1, -k); break;
			case 4 : l = read(), r = read(); printf("%lld\n", query(l, r)); break;
			case 5 : printf("%lld\n", query(1, 1)); break;
		}
	}
	return 0;
}
2022/10/16 14:51
加载中...