fhq 0pts求条
查看原帖
fhq 0pts求条
760824
MornStar楼主2024/7/12 15:50

RT,样例输出完全随机。

感觉是 push_up 或 push_down 的问题。

#include<bits/stdc++.h>
using namespace std;
const int N=5e5+5,C=4e6+5,INF=0x3f3f3f3f;
vector<int>insv;
struct FHQ_treap{
	mt19937 rd;
	struct treap_node{int ls,rs,val,lsum,rsum,ans,sum,siz,into,swp,rnd;}t[N];
	int siz=0,rt=0,trash[C],cnt=0;
	FHQ_treap(){mt19937 p(std::random_device{}());rd=p;}
#define ls(x) t[x].ls
#define rs(x) t[x].rs
	void push_up(int x){
		t[x].siz=t[ls(x)].siz+t[rs(x)].siz+1;
		t[x].sum=t[ls(x)].sum+t[rs(x)].sum+t[x].val;
		t[x].lsum=max(t[ls(x)].lsum,t[ls(x)].sum+t[rs(x)].lsum+t[x].val);
		t[x].rsum=max(t[rs(x)].rsum,t[rs(x)].sum+t[ls(x)].rsum+t[x].val);
		t[x].ans=max(max(t[ls(x)].ans,t[rs(x)].ans),t[ls(x)].rsum+t[rs(x)].lsum+t[x].val);
	}
	void reverse(int p){
		swap(ls(p),rs(p)),swap(t[p].lsum,t[p].rsum);
		t[p].swp^=1;
	}
	void make_same(int p,int val){
		t[p].lsum=t[p].rsum=max(0,val),t[p].sum=t[p].siz*val;
		t[p].ans=max(val,t[p].sum);t[p].val=t[p].into=val;
	}
	void push_down(int p){
		if(t[p].into!=INF){
			make_same(ls(p),t[p].into);
			make_same(rs(p),t[p].into);
			t[p].into=INF;t[p].swp=0;
		}
		if(t[p].swp){
			reverse(ls(p));
			reverse(rs(p));
			t[p].swp=0;
		}	
	}
	void print(int p){
		if(!p)	return;
		push_down(p);
		print(ls(p)),cerr<<t[p].val<<" ",print(rs(p));
	}
	int new_node(int val,int num=0){
		if(cnt)	num=trash[cnt--];
		else	num=++siz;
		t[num]={0,0,val,0,0,val,val,1,INF,0,0},t[num].rnd=rd();	return num;
	}
	void split(int& L,int& R,int p,int rnk){
		if(!p)	return L=R=0,void();
		else{
			push_down(p);
			if(t[ls(p)].siz>=rnk)	R=p,split(L,ls(p),ls(p),rnk);
			else	L=p,split(rs(p),R,rs(p),rnk-t[ls(p)].siz-1);
			push_up(p);
		}
	}
	int merge(int L,int R){
		if(!L||!R)	return L+R;
		else{
			if(t[L].rnd>t[R].rnd){
				push_down(L),rs(L)=merge(rs(L),R),push_up(L);
				return L;
			}else{
				push_down(R),ls(R)=merge(L,ls(R)),push_up(R);
				return R;
			}
		}
	}
	void ins(int pos,vector<int>insv,int L=0,int R=0){
		split(L,R,rt,pos);
		for(auto it:insv)	L=merge(L,new_node(it));
		rt=merge(L,R);
	}
	void del_tree(int p){
		if(!p)	return;
		trash[++cnt]=p;
		del_tree(ls(p));
		del_tree(rs(p));
	}
	void del(int pos,int num,int L=0,int R=0,int mid=0){
		split(L,R,rt,pos-1),split(mid,R,R,num);
		del_tree(mid);
		rt=merge(L,R);
	}
	void reverse(int pos,int num,int L=0,int R=0,int mid=0){
		split(L,R,rt,pos-1),split(mid,R,R,num);
		reverse(mid);
		rt=merge(L,merge(mid,R));
	}
	void change(int pos,int num,int c,int L=0,int R=0,int mid=0){
		split(L,R,rt,pos-1),split(mid,R,R,num);
		make_same(mid,c);
		rt=merge(L,merge(mid,R));
	}
	int get_sum(int pos,int num,int L=0,int R=0,int mid=0,int ret=0){
		split(L,R,rt,pos-1),split(mid,R,R,num);
		ret=t[mid].sum;
		return rt=merge(L,merge(mid,R)),ret;
	}
}T;
int n,m;
string opt;
int main(){
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);
	cin>>n>>m;
	for(int i=1,p;i<=n;i++)	cin>>p,insv.push_back(p);
	T.ins(0,insv);
	for(int i=1,pos,tot,c;i<=m;i++){
		cin>>opt;
		if(opt[0]=='I'){
			cin>>pos>>tot;
			insv.clear();
			for(int j=1,p;j<=tot;j++)	cin>>p,insv.push_back(p);
			T.ins(pos,insv);
		}else if(opt[0]=='D'){
			cin>>pos>>tot;
			T.del(pos,tot);
		}else if(opt[2]=='K'){
			cin>>pos>>tot>>c;
			T.change(pos,tot,c);
		}else if(opt[0]=='R'){
			cin>>pos>>tot;
			T.reverse(pos,tot);
		}else if(opt[0]=='G'){
			cin>>pos>>tot;
			cout<<T.get_sum(pos,tot)<<"\n";
		}else{
			cout<<T.t[T.rt].ans<<"\n";
		}
		cerr<<"\n",T.print(T.rt);cerr<<"\n";
	}
}
2024/7/12 15:50
加载中...