CodeChef Chef and Churu 求调
  • 板块题目总版
  • 楼主_Z_F_R_
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/7/27 17:34
  • 上次更新2024/7/27 19:06:29
查看原帖
CodeChef Chef and Churu 求调
911417
_Z_F_R_楼主2024/7/27 17:34

rt,code(Failed on a hidden test case):

#include <bits/stdc++.h>
#define ll long long
#define ull unsigned long long
using namespace std;
ll Read() {
	int sig = 1;
	ll num = 0;
	char c = getchar();
	while(!isdigit(c)) {
		if(c == '-') {
			sig = -1;
		}
		c = getchar();
	}
	while(isdigit(c)) {
		num = (num << 3) + (num << 1) + (c ^ 48);
		c = getchar();
	}
	return num * sig;
}
void Write(ull x) {
	if(x < 0) {
		putchar('-');
		x = -x;
	}
	if(x >= 10) {
		Write(x / 10);
	}
	putchar((x % 10) ^ 48);
}
const int N = 100005, sqN = 325;
int n;
ll a[N];
struct Block {
	int bsiz, bcnt, bl[sqN], br[sqN], bid[N];
	ll sumib[N], sumob[sqN];
	void Build(int n) {
		bsiz = int(sqrt(n)), bcnt = (n + bsiz - 1) / bsiz;
		int i, j;
		for(i = 1; i <= bcnt; i++) {
			bl[i] = br[i - 1] + 1, br[i] = min(n, bl[i] + bsiz - 1);
			for(j = bl[i]; j <= br[i]; j++) {
				bid[j] = i;
			}
		}
		for(i = 1; i <= n; i++) {
			sumib[i] = a[i], sumob[bid[i]] += a[i];
		}
		for(i = 1; i <= bcnt; i++) {
			for(j = bl[i] + 1; j <= br[i]; j++) {
				sumib[j] += sumib[j - 1];
			}
			sumob[i] += sumob[i - 1];
		}
	}
	ll Query(int l, int r) {
		int lblock = bid[l], rblock = bid[r];
		if(lblock == rblock) {
			return sumib[r] - (l > bl[lblock] ? sumib[l - 1] : 0ll);
		}
		return sumib[br[lblock]] - (l > bl[lblock] ? sumib[l - 1] : 0ll) + sumib[r] + sumob[rblock - 1] - sumob[lblock];
	}
	ll Add(int x, ll d) {
		int block = bid[x], i;
		for(i = x; i <= br[block]; i++) {
			sumib[i] += d;
		}
		for(i = block; i <= bcnt; i++) {
			sumob[i] += d;
		}
		return d;
	}
}b2;
struct Func {
	int l, r;
}f[N];
struct Block_Func {
	int bsiz, bcnt, bl[sqN], br[sqN], bid[N], cnt[sqN][N];
	ull sum[sqN];
	void Build(int n) {
		bsiz = int(sqrt(n)), bcnt = (n + bsiz - 1) / bsiz;
		int i, j;
		for(i = 1; i <= bcnt; i++) {
			bl[i] = br[i - 1] + 1, br[i] = min(n, bl[i] + bsiz - 1);
			for(j = bl[i]; j <= br[i]; j++) {
				bid[j] = i, cnt[i][f[j].l]++, cnt[i][f[j].r + 1]--;
				sum[i] += b2.Query(f[j].l, f[j].r);
			}
		}
		for(i = 1; i <= bcnt; i++) {
			for(j = 1; j <= n; j++) {
				cnt[i][j] += cnt[i][j - 1];
			}
		}
	}
	void Add(int x, ll d) {
		ll dd = b2.Add(x, d);
		int i;
		for(i = 1; i <= bcnt; i++) {
			sum[i] += dd * cnt[i][x];
		}
	}
	ull Query(int l, int r) {
		int lblock = bid[l], rblock = bid[r], i;
		ull res = 0;
		if(lblock == rblock) {
			for(i = l; i <= r; i++) {
				res += b2.Query(f[i].l, f[i].r);
			}
			return res;
		}
		for(i = l; i <= br[lblock]; i++) {
			res += b2.Query(f[i].l, f[i].r);
		}
		for(i = bl[rblock]; i <= r; i++) {
			res += b2.Query(f[i].l, f[i].r);
		}
		for(i = lblock + 1; i < rblock; i++) {
			res += sum[i];
		}
		return res;
	}
}b;
int main() {
	int i, m;
	n = Read();
	for(i = 1; i <= n; i++) {
		a[i] = Read();
	}
	b2.Build(n);
	for(i = 1; i <= n; i++) {
		f[i].l = Read(), f[i].r = Read();
//		Write(b2.Query(f[i].l, f[i].r)), putchar('\n');
	}
	b.Build(n);
	m = Read();
	while(m--) {
		int op = Read();
		if(op == 1) {
			int x = Read();
			ll d = Read();
			b.Add(x, d);
		}
		else {
			int l = Read(), r = Read();
			Write(b.Query(l, r)), putchar('\n');
		}
	}
}
2024/7/27 17:34
加载中...