WA 70求调
查看原帖
WA 70求调
1420231
yy0707楼主2024/11/27 22:25
#include<bits/stdc++.h>
using namespace std;
template<typename T>
struct sequence{
	private:
		mt19937 random;
		struct node{
			T v,sum,tag;int s,p;node*l,*r;
			void update(){
				sum=v,s=1;
				if(l)sum+=l->sum,s+=l->s;
				if(r)sum+=r->sum,s+=r->s;
			}void push(){
				if(!tag)return;
				if(l)l->tag+=tag,l->v+=tag,l->sum+=l->s*tag;
				if(r)r->tag+=tag,r->v+=tag,r->sum+=r->s*tag;
				tag=0,update();
			}
		}*root;
		node*newnode(T v){
			node*p=new node;p->v=v,p->sum=v,
			p->tag=0,p->s=1,p->p=random(),
			p->l=p->r=0;return p;
		}void split(node*p,int k,node*&l,node*&r){
			if(!p)return void(l=r=0);
			p->push();int s=p->l?p->l->s:0;
			if(s+1<=k)split(p->r,k-s-1,p->r,r),l=p;
			else split(p->l,k,l,p->l),r=p;
			p->update();
		}node*merge(node*l,node*r){
			if(!l||!r)return l?l:r;
			l->push(),r->push();
			if(l->p>r->p)return l->r=merge(l->r,r),l->update(),l;
			return r->l=merge(l,r->l),r->update(),r;
		}
	public:
		sequence():root(0),random(time(0)){}
		void insert(int k,T v){
			node*x,*y;split(root,k,x,y),
			root=merge(merge(x,newnode(v)),y);
		}void apply(int l,int r,T v){
			node*x,*y,*z;split(root,r,y,z),
			split(y,l-1,x,y),y->tag+=v,y->v+=v;
			root=merge(merge(x,y),z);
		}T prod(int l,int r){
			node*x,*y,*z;split(root,r,y,z),
			split(y,l-1,x,y);T res=y?y->sum:0;
			root=merge(merge(x,y),z);return res;
		}T operator[](int k){
			node*x,*y,*p;split(root,k,x,y);
			p=x;while(p&&p->r)p=p->r;
			T res=p?p->v:0;root=merge(x,y);return res;
		}
};sequence<int>a;
int n,m,t,x,y,k;
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++)cin>>x,a.insert(i,x);
	for(int i=1;i<=m;i++){
		cin>>t;
		if(t==1)cin>>x>>y>>k,a.apply(x,y,k);
		else cin>>x>>y,cout<<a.prod(x,y)<<'\n';
		// for(int i=1;i<=n;i++)cout<<a[i]<<' ';cout<<'\n';
	}
}

用Treap做的,估计是下传时出了问题

2024/11/27 22:25
加载中...