P2042FHQtreap神秘错误玄关球跳
查看原帖
P2042FHQtreap神秘错误玄关球跳
1601965
fangtongsheng楼主2025/6/21 17:03

蒟蒻刚学OI,FHQ-treap求调。

本地能过样例,在线IDE会WA:

(输出-1 9 1 10)

悬2关。ORZ%%%%%%。

#include<bits/stdc++.h>
using namespace std;
namespace FastIO { // 快读
	inline int read() {
		int x=0;bool f=0;char ch=getchar();
		while(ch<'0'||ch>'9') {
			if(ch=='-') f=1;
			else f=0;
			ch=getchar();
		}
		while(ch>='0'&&ch<='9') {
			x=(x<<3)+(x<<1)+(ch^48);
			ch=getchar();
		}
		return f?-x:x;
	}
	void Wtt(int x) {
		if(x>9)
			Wtt(x/10);
		putchar(48+(x%10));
	}
	void pt(int x) {
		if(x>=0) Wtt(x);
		else putchar('-'),Wtt(-x);
	}
}
using namespace FastIO;


const int N = 500500;
int n,m;
struct fhq_treap { // FHQ treap
	int rot=0;
	int c[N];
	int rnd[N],ls[N],rs[N],siz[N],cnt=0;
	int prmax[N],sfmax[N];
	int sq[N],sum[N];
	int cov[N]; // cover ( replace )
	bool rev[N]; // reverse ( abcde -> edcba )
	
	int addpoint(int val) {
		cnt++;
		c[cnt]=val;
		rnd[cnt]=rand();
		prmax[cnt]=sfmax[cnt]=sq[cnt]=val;
		sum[cnt]=val;
		ls[cnt]=rs[cnt]=0;
		siz[cnt]=1;
		return cnt;
	}
	
	void pushup(int u) {
		sum[u]=sum[ls[u]]+sum[rs[u]]+c[u];
		siz[u]=siz[ls[u]]+siz[rs[u]]+1;
		prmax[u]=max(prmax[ls[u]],sum[ls[u]]+c[u]+prmax[rs[u]]);
		sfmax[u]=max(sfmax[rs[u]],sum[rs[u]]+c[u]+sfmax[ls[u]]);
		sq[u]=max(max(sq[ls[u]],sq[rs[u]]),sfmax[ls[u]]+c[u]+prmax[rs[u]]);
	}
	
	void pushcov(int u,int val) {
		c[u]=val;
		sum[u]=siz[u]*val;
		cov[u]=val;
		if(val>0) {
			sq[u]=prmax[u]=sfmax[u]=sum[u];
		} else {
			prmax[u]=sfmax[u]=sq[u]=val;
		}
	}
	
	void pushrev(int u) {
		swap(ls[u],rs[u]);
		swap(prmax[u],sfmax[u]);
		rev[u]^=1;
	}
	
	void pushdown(int u) {
		if(cov[u]) {
			if(ls[u]) pushcov(ls[u],cov[u]);
			if(rs[u]) pushcov(rs[u],cov[u]);
			cov[u]=0;
		}
		if(rev[u]) {
			if(ls[u]) pushrev(ls[u]);
			if(rs[u]) pushrev(rs[u]);
			rev[u]=0;
		}
	}
	
	
	
	int merge(int u,int v) {
		if(!u||!v) return u+v;
		pushdown(u),pushdown(v);
		if(rnd[u]>rnd[v]) {
			rs[u]=merge(rs[u],v);
			pushup(u);
			return u;
		} else {
			ls[v]=merge(u,ls[v]);
			pushup(v);
			return v;
		}
	}
	
	void split(int now,int k,int &u,int &v) {
		if(!now) {
			u=0,v=0;
			return;
		}
		pushdown(now);
		if(siz[ls[now]]<k) {
			u=now;
			split(rs[now],k-siz[ls[now]]-1,rs[now],v);
		} else {
			v=now;
			split(ls[now],k,u,ls[now]);
		}
		pushup(now);
	}
	
	void push_back(int x) {
		rot=merge(rot,addpoint(x));
	}
	
	void insert(int pos,int val) {
		int x,y;
		split(rot,pos-1,x,y);
		rot=merge(x,merge(addpoint(val),y));
	}
	
	void replace(int l,int r,int val) {
		int x,y,z;
		split(rot,l-1,x,y);
		split(y,r-l+1,y,z);
		pushcov(y,val);
		rot=merge(x,merge(y,z));
	}
	
	void reverse(int l,int r) {
		int x,y,z;
		split(rot,l-1,x,y);
		split(y,r-l+1,y,z);
		pushrev(y);
		rot=merge(x,merge(y,z));
	}
	
	void del(int pos,int num) {
		int x,y,z;
		split(rot,pos-1,x,y);
		split(y,num,y,z);
		rot=merge(x,z);
	}
	
	int query_sum(int l,int len) {
		int x,y,z;
		split(rot,l-1,x,y);
		split(y,len,y,z);
		int res=sum[y];
		rot=merge(x,merge(y,z));
		return res;
	} 
}tr;
char ss[40];
int main() {
	n=read(),m=read();
	for(int i=1;i<=n;i++) {
		int u=read();
		tr.push_back(u);
	}
	for(int i=1;i<=m;i++) {
		scanf(" %s",ss+1);
		if(ss[1]=='I') { //insert 
			int pos=read(),kk=read();
			for(int j=1;j<=kk;j++) tr.insert(pos+j,read());
		} else if(ss[1]=='D') { //delete
			int p=read(),t=read();
			tr.del(p,t); 
		} else if(ss[1]=='R') { //reverse 
			int p=read(),t=read(); 
			tr.reverse(p,p+t-1);
		} else if(ss[1]=='G') { // get-sum 
			int p=read(),t=read();
			pt(tr.query_sum(p,t)),putchar('\n');
		} else {
			if(ss[3]=='K') { // make-same
				int p=read(),t=read();
				tr.replace(p,p+t-1,read());
			} else { // max-sum
				pt(tr.sq[tr.rot]),putchar('\n');
			}
		}
	}
	return 0;
}
2025/6/21 17:03
加载中...