请求帮忙hack (悬关)
查看原帖
请求帮忙hack (悬关)
373757
never_AK楼主2024/10/23 20:53

RT

调不出来,求hack (个人认为题目还是比较好理解的)

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e5 + 10;
struct node{
	int l,r,sum,tag;
	void clear(){
		l = r = sum = tag = 0;
		return ;
	}
}tree[((N << 5) + N) * 2];
int a[N];
int tot = N;
int nw;
int n,Q;
void pushup(int p){
	int lx = tree[p].l;
	int rx = tree[p].r;
	tree[p].sum = tree[lx].sum + tree[rx].sum;
	return ;
}
int insert(int p,int l,int r,int x,int u){
	if(p == 0)p = ++tot;
	if(l == r){
		tree[p].sum += u;
		return p;
	}
	int mid = l + r >> 1;
	int lx = tree[p].l;
	int rx = tree[p].r;
	if(x <= mid){
		tree[p].l = insert(lx,l,mid,x,u);
	}else{
		tree[p].r = insert(rx,mid + 1,r,x,u);
	}
	pushup(p);
	return p;
}
int repair(int p1,int p2,int l,int r,int b,int e,int u){
	if(p2 == 0)p2 = ++tot;
	if(l > e || r < b){
		tree[p2] = tree[p1];
		return p2;
	}
	if(b <= l && r <= e){
		tree[p2] = tree[p1];
		tree[p2].tag += u;
		tree[p2].sum += u * (r - l + 1);
		return p2;
	}
	int mid = l + r >> 1;
	int lx1 = tree[p1].l;
	int rx1 = tree[p1].r;
	int lx2 = tree[p2].l;
	int rx2 = tree[p2].r;
	tree[p2].l = repair(lx1,lx2,l,mid,b,e,u);
	tree[p2].r = repair(rx1,rx2,mid + 1,r,b,e,u);
	pushup(p2);
//	cout<<l<<' '<<r<<' '<<tree[p2].sum <<endl;
	return p2;
}
int solve(int p,int l,int r,int b,int e){
	if(p == 0)return 0;
	if(l > e || r < b)return 0;
	if(b <= l && r <= e)return tree[p].sum;
	int lx = tree[p].l;
	int rx = tree[p].r;
	int mid = l + r >> 1;
	int add = (min(e,r) - max(b,l) + 1) * tree[p].tag;
	return solve(lx,l,mid,b,e) + solve(rx,mid + 1,r,b,e) + add;
}
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	cin >> n >> Q;
	nw = 1;
	for(int i = 1;i <= n;i ++){
		cin >> a[i];
		insert(nw,1,n,i,a[i]);
	}
	while(Q--){
		char op;
		int l,r,u;
		cin >> op;
		if(op == 'Q'){
			cin >> l >> r;
			cout<<solve(nw,1,n,l,r)<<'\n';
		}else if(op == 'C'){
			cin >> l >> r >> u;
			nw++;
			tree[nw].clear();
			repair(nw - 1,nw,1,n,l,r,u);
		}else if(op == 'H'){
			cin >> l >> r >> u;
			cout<<solve(u + 1,1,n,l,r)<<'\n';
		}else{
			cin >> u;
			nw = u + 1;
		}
	}
	return 0;
} 
/*
10 3
1 2 3 4 5 6 7 8 9 10
C 3 6 3
C 3 6 3
Q 3 6
*/
2024/10/23 20:53
加载中...