求调
查看原帖
求调
600289
meowbot楼主2022/5/16 21:09

尝试用标记永久化,样例过了,测试点3TLE,其他都是WA

#include<iostream>
using namespace std;
const int N=1e6+1;
struct seg {
	int l,r;
	int add;
	long long sum;
} t[N<<2];
int n,m;
void build(int idx,int L,int R) {
	int mid=(L+R)/2;
	t[idx].l=L;
	t[idx].r=R;
	if(L!=R) {
		build(idx*2,L,mid);
		build(idx*2+1,mid+1,R);
	}
}
void update(int idx,int L,int R,int p) {
	if(t[idx].l==t[idx].r) {
		t[idx].sum+=p;
		return ;
	}
	if(t[idx].l>=L&&t[idx].r<=R) {
		t[idx].add=p;
		return ;
	}
	if((t[idx].l+t[idx].r)/2>=L) {
		update(idx*2,L,R,p);
	}
	if((t[idx].l+t[idx].r)/2+1<=R) {
		update(idx*2+1,L,R,p);
	}
	t[idx].sum=t[idx*2+1].sum+t[idx*2].sum;
}
long long query(int idx,int L,int R,int v) {
	long long res=v;
	int mid=(t[idx].l+t[idx].r)/2;
	if(t[idx].l==t[idx].r) {
		return res+t[idx].sum;
	}
	if(mid>=L) {
		res=query(idx*2,L,R,res+t[idx].add*(mid-L+1));
	}
	if(mid+1<=R) {
		res=query(idx*2+1,L,R,res+t[idx].add*(R-mid));
	}
	return res;
}
int main() {
	cin>>n;
	cin>>m;
	build(1,1,n);
	for(int i=1; i<=n; i++) {
		int leef;
		cin>>leef;
		update(1,i,i,leef);
	}

	for(int i=1; i<=m; i++) {
		int opt;
		cin>>opt;
		if(opt==2) {
			int l,r;
			cin>>l>>r;
			long long res=query(1,l,r,0);
			cout<<res<<endl;
		}
		if(opt==1) {
			int l,r,p;
			cin>>l>>r>>p;
			update(1,l,r,p);
		}
	}
	return 0;
}
2022/5/16 21:09
加载中...