fhqtreap只过了样例求调
查看原帖
fhqtreap只过了样例求调
308800
Polynswin楼主2024/7/30 16:53

rt,不启用回收空间pt30,只有#3WA,其他RE/MLE
但现在除了样例全WA没搞懂什么意思

#include<bits/stdc++.h>
#define mmt(a,b) memset(a,b,sizeof(a))
#define test(x) cout<<#x<<" = "<<x<<endl
#define file(x) freopen(x".in","r",stdin);freopen(x".out","w",stdout)
#define endl '\n'
#define enter putchar(endl)
//#define int long long
using namespace std;
inline void read(int &x);
inline void ffout(int x);
inline void ffout(string b);
inline void ffout(int x,char b);
inline void ffout(int x,string b);
inline void print(string name,int a[],int r);
const int inf=0x3f3f3f3f,N=5e5+10,maxn = 4e6 + 5;
int n,m, nd_top, root, cnt;
int nodeless[N], num[N];
struct fhq_treap
{
	int l,r , val, rnd, sizet, cov_val, sum, mpre, msuf, msum;
	bool rev_tag, cov_tag;
}tr[N];
#define ls tr[k].l
#define rs tr[k].r

int push_node(int x)
{
//	int i =  nd_top ? nodeless[nd_top--] : ++cnt;
	int i = ++cnt;
	tr[i].l = tr[i].r = 0;
	tr[i].msum = tr[i].sum = tr[i].val = x;
	tr[i].mpre = tr[i].msuf = max(x,0);
	tr[i].sizet = 1; tr[i].rnd = rand(); 
	return i;
}
void node_out(int k)
{
	if(!k)return;
	nodeless[++nd_top] = k;
	node_out(ls); node_out(rs);
}
void pushup(int k)
{
	if(!k)return;
	tr[k].sum = tr[ls].sum + tr[rs].sum + tr[k].val;
	tr[k].sizet = tr[ls].sizet + tr[rs].sizet + 1;
	
	tr[k].mpre = max({ tr[ls].mpre, tr[ls].sum + tr[k].val + tr[rs].mpre, 0 });
	tr[k].msuf = max({ tr[rs].msuf, tr[ls].msuf + tr[k].val + tr[rs].sum, 0 });
	tr[k].msum = max({ tr[ls].msum, tr[rs].msum, tr[k].val, tr[ls].msuf + tr[k].val + tr[rs].mpre, 0});
}
void down_tagc(int k)
{
	if(!tr[k].cov_tag) return;
	
	int t = tr[k].val = tr[k].cov_val;
	int s = tr[k].sum = t * tr[k].sizet;
	tr[k].mpre = tr[k].msuf = max(0,s);
	tr[k].msum = max(t,s);
	
	if(ls)tr[ls].cov_tag = true, tr[ls].cov_val = t;
	if(rs)tr[rs].cov_tag = true, tr[rs].cov_val = t;
	tr[k].cov_tag = false; tr[k].cov_val = 0;
}
void down_tagr(int k)
{
	if(!tr[k].rev_tag) return;
	
	swap(ls,rs);
	swap(tr[k].mpre, tr[k].msuf);
	
	if(ls)tr[ls].rev_tag ^= 1;
	if(rs)tr[rs].rev_tag ^= 1;
	tr[k].rev_tag = false;
	
}
void pushdown(int k)
{
	if(!k)return;
	down_tagr(k); down_tagr(ls); down_tagr(rs);
	down_tagc(k); down_tagc(ls); down_tagc(rs); 
}
void split(int k, int x, int &l, int &r)
{
	if(!k)
	{
		l = r = 0;
		return;
	}
	pushdown(k);
	if(tr[ls].sizet < x)
	{
		l = k;
		split(rs, x-tr[ls].sizet-1, rs, r);
	}
	else
	{
		r = k;
		split(ls, x, l, ls);
	}
	pushup(k);
}
void split2(int k, int tot, int &x, int &y, int &z)
{
	int l = k, r = k + tot - 1;
	split(root, r, x, z);
	split(x, l-1, x, y);
}
int merge(int x, int y)
{
	if(!x || !y) return x+y;
	if(tr[x].rnd < tr[y].rnd)
	{
		pushdown(x);
		tr[x].r = merge(tr[x].r, y);
		pushup(x);
		return x;
	}
	else
	{
		pushdown(y);
		tr[y].l = merge(x, tr[y].l);
		pushup(y);
		return y;
	}
}
int build(int l, int r)
{
	if(l == r) return push_node(num[l]);
	int mid = l+r >> 1;
	return merge( build(l,mid), build(mid+1,r) );
}
void insert(int k, int tot)
{
	int x,y;
	split(root, k, x, y);
	int z = build(1, tot);
	root = merge( merge(x,z), y );
}
void del(int k, int tot)
{
	int x,y,z;
	split2(k, tot, x, y, z);
	node_out(y);
	root = merge(x,z);
}
void reverse(int k, int tot)
{
	int x,y,z;
	split2(k, tot, x, y, z);
	tr[y].rev_tag ^= 1;
	down_tagr(y);
	root = merge(merge(x, y), z);
}
void makesame(int k, int tot, int c)
{
	int x,y,z;
	split2(k, tot, x, y, z);
	tr[y].cov_tag = true; 
	tr[y].cov_val = c;
	down_tagc(y);
	root = merge(merge(x, y), z);
}
int getsum(int k, int tot)
{
	int x,y,z;
	split2(k, tot, x, y, z);
	int ans = tr[y].sum;
	root = merge(merge(x, y), z);
	return ans;
}
void output(int p) {
    if (!p) return;
    pushdown(p);
    output(tr[p].l);
    ffout(tr[p].val, ' ');
    output(tr[p].r);
}
signed main()
{
	int i,j;
//	srand(time(0));
	read(n);read(m);
	for(i=1; i<=n; ++i)
	{
		int x;
		read(x);
		root = merge(root, push_node(x) );
	}
	while(m--)
	{
//		output(root);
		string op;
		int k,tot;
		cin>>op;
		if(op == "INSERT")
		{
//		test(op);
			read(k);read(tot);
			for(i=1; i<=tot; ++i)
				read(num[i]);
			insert(k, tot);
		}
		if(op == "DELETE")
		{
//		test(op);
			read(k);read(tot);
			del(k, tot);
		}
		if(op == "MAKE-SAME")
		{
//		test(op);
			int c;
			read(k);read(tot);read(c);
			makesame(k, tot, c);
		}
		if(op == "REVERSE")
		{
//		test(op);
			read(k);read(tot);
			reverse(k, tot);
		}
		if(op == "GET-SUM")
		{
//		test(op);
			read(k);read(tot);
			ffout(getsum(k, tot), endl);
		}
		if(op == "MAX-SUM")
			ffout(tr[root].msum,endl);
			
	}
	return 0;
}









inline void ffout(string b)
{
	int len=b.size();
    for(int i=0;i<len;++i)putchar(b[i]);
}
inline void read(int &x)
{
	int f=1;x=0;char ch=getchar();
	while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
	while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
	x=x*f;
}
inline void ffout(int x)
{
    if(x<0){x=-x; putchar('-'); }
    short sta[63],top=0;
    do{ sta[top++]=x%10; x/=10; }while(x);
    while(top) putchar(sta[--top]+'0');
}
inline void ffout(int x,char b)
{
    if(x<0){x=-x; putchar('-'); }
    short sta[63],top=0;
    do{ sta[top++]=x%10; x/=10; }while(x);
    while(top) putchar(sta[--top]+'0');
    putchar(b);
}
inline void ffout(int x,string b)
{
    if(x<0){x=-x; putchar('-'); }
    short sta[63],top=0;
    do{ sta[top++]=x%10; x/=10; }while(x);
    while(top) putchar(sta[--top]+'0');
    ffout(b);
}
inline void print(string name,int a[],int r)
{
	ffout(name);
	putchar(':');
	for(int i=1;i<=r;i++)
		ffout(a[i],' ');
	putchar(endl);
}





2024/7/30 16:53
加载中...