莫名MLE求助
查看原帖
莫名MLE求助
377440
Y2y7m楼主2023/1/26 01:57
#include <bits/stdc++.h>

using namespace std;
#pragma optimize(2)
#define lson t[i].ch[0]
#define rson t[i].ch[1]
const int maxn=5e5+10;
int n,m;
int a[maxn];
struct fhq_treap
{
    int ch[2];
    int pri,val;
    int sz;
    int sum,maxl,maxr,mx;
    int lazyr,lazyc;
}t[maxn];
int sta[maxn],top;
int cnt,root;
int newnode(int x)
{
	int id;
	if(top) id=sta[top--];
	else id=++cnt;
	t[id].ch[0]=t[id].ch[1]=t[id].lazyr=0,t[id].lazyc=-1e5;
    t[id].pri=rand();
    t[id].val=t[id].sum=x;
    t[id].maxl=t[id].maxr=max(0,x),t[id].mx=x;
    t[id].sz=1;
    return cnt;
}
void update(int i)
{
    t[i].sz=t[lson].sz+t[rson].sz+1;
    t[i].maxl=max(max(t[lson].maxl,t[lson].sum+t[i].val+t[rson].maxl),0);
	t[i].maxr=max(max(t[rson].maxr,t[rson].sum+t[i].val+t[lson].maxr),0);
	t[i].mx=max(t[i].val,t[i].val+t[lson].maxr+t[rson].maxl);
	t[i].sum=t[lson].sum+t[rson].sum+t[i].val;
	if(lson) t[i].mx=max(t[i].mx,t[lson].mx);
	if(rson) t[i].mx=max(t[i].mx,t[rson].mx);
}
void reverse(int i)
{
	if(!i) return ;
	swap(lson,rson);
	swap(t[i].maxl,t[i].maxr);
	t[i].lazyr^=1;
}
void cover(int i,int x)
{
	t[i].sum=t[i].sz*x,t[i].val=t[i].lazyc=x;
	t[i].maxl=t[i].maxr=max(0,t[i].sum);
	t[i].mx=t[i].sum;
}
void pushdown(int i)
{
	if(!i) return ;
	if(t[i].lazyr)
	{
		if(lson) reverse(lson);
		if(rson) reverse(rson);
		t[i].lazyr=0;
	}
	if(t[i].lazyc>-1e5)
	{
		if(lson) cover(lson,t[i].lazyc);
		if(rson) cover(rson,t[i].lazyc);
		t[i].lazyc=-1e5;
	}
}
int merge(int x,int y)
{
    if(x==0||y==0)
        return x+y;
    if(t[x].pri<t[y].pri)
    {
    	pushdown(x);
        t[x].ch[1]=merge(t[x].ch[1],y);
        update(x);
        return x;
    }
    else
    {
    	pushdown(y);
        t[y].ch[0]=merge(x,t[y].ch[0]);
        update(y);
        return y;
    }
}
void split(int i,int k,int &x,int &y)
{
    if(i==0)
    {
        x=0,y=0;
        return ;
    }
    pushdown(i);
    if(t[lson].sz<k)
    {
        x=i;
        split(rson,k-t[lson].sz-1,rson,y);
    }
    else
    {
        y=i;
        split(lson,k,x,lson);
    }
    update(i);
}
void remove(int i)
{
	if(!i) return ;
	sta[++top]=i;
	remove(lson),remove(rson);
}
void del(int pos,int len)
{
    int x,y,z;
    split(root,pos-1,x,y);
    split(y,len,y,z);
    remove(y);
    root=merge(x,z);
}
int build(int l,int r)
{
	if(l==r) return newnode(a[l]);
	int mid=(l+r)/2;
	return merge(build(l,mid),build(mid+1,r));
}
int main()
{
	ios::sync_with_stdio(false);
    cin>>n>>m;
    for(int i=1;i<=n;i++) cin>>a[i];
    root=merge(root,build(1,n));
	char op[20];
	int x,y,d,tot;
	while(m--)
	{
		cin>>op+1;
		if(op[1]=='I')
		{
			cin>>x>>tot;
			int u,v;
			split(root,x,u,v);
			for(int i=1;i<=tot;i++) cin>>a[i];
			u=merge(u,build(1,tot));
			root=merge(u,v);
		}
		if(op[1]=='D')
		{
			cin>>x>>y;
			del(x,y);
		}
		if(op[1]=='R')
		{
			cin>>x>>y;
			int u,v,t;
			split(root,x-1,u,v);
			split(v,y,v,t);
			reverse(v);
			root=merge(merge(u,v),t);
		}
		if(op[1]=='G')
		{
			cin>>x>>y;
			int u,v,tmp;
			split(root,x-1,u,v);
			split(v,y,v,tmp);
			cout<<t[v].sum<<endl;
			root=merge(merge(u,v),tmp);
		}
		if(op[1]=='M')
		{
			if(op[3]=='K')
			{
				cin>>x>>y>>d;
				int u,v,t;
				split(root,x-1,u,v);
				split(v,y,v,t);
				cover(v,d);
				root=merge(merge(u,v),t);
			}
			else cout<<t[root].mx<<endl;
		}
	}
    return 0;
}
2023/1/26 01:57
加载中...