又挂了QwQ
查看原帖
又挂了QwQ
68703
_Int_楼主2021/11/15 20:37
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
inline void in(int &x){
    x=0;int f=1;char c=getchar();
    while(c<'0'||c>'9')c=='-'&&(f=-1),c=getchar();
    while(c>='0'&&c<='9')x=(x<<1)+(x<<3)+c-'0',c=getchar();
    x*=f;
}
const int N=5e5+5,inf=1e9,tl=23333;
int n,m,root,b[N];
int idx[N],tot,top,rub[N];
struct node{
    int ch[2],siz,fa,val;
    int addtag,revtag,sum;
    int left,right,middle;
}a[N];
int mmax(int tmpx,int tmpy){
    return tmpx>tmpy?tmpx:tmpy;
}
void Pushup(int x){
    a[x].sum=a[x].val;a[x].siz=1;
    a[x].left=a[x].right=a[x].middle=a[x].val;
    if(a[x].ch[0])
    	a[x].sum+=a[a[x].ch[0]].sum,
    	a[x].siz+=a[a[x].ch[0]].siz;
    if(a[x].ch[1])
    	a[x].sum+=a[a[x].ch[1]].sum,
    	a[x].siz+=a[a[x].ch[1]].siz;
    a[x].middle=mmax(mmax(a[a[x].ch[0]].middle,a[a[x].ch[1]].middle),
    			a[a[x].ch[0]].right+a[x].val+a[a[x].ch[1]].left);
    a[x].left=mmax(a[a[x].ch[0]].left,a[a[x].ch[0]].sum+a[x].val+a[a[x].ch[1]].left);
    a[x].right=mmax(a[a[x].ch[1]].right,a[a[x].ch[1]].sum+a[x].val+a[a[x].ch[0]].right);
}
void Pushdown(int x){
    if(a[x].addtag!=tl){
    	if(a[x].ch[0]){
    		a[a[x].ch[0]].addtag=a[a[x].ch[0]].val=a[x].addtag;
    		a[a[x].ch[0]].sum=a[a[x].ch[0]].siz*a[x].addtag;
    		a[a[x].ch[0]].left=a[a[x].ch[0]].right=mmax(a[x].addtag,0);
    		a[a[x].ch[0]].middle=mmax(a[a[x].ch[0]].sum,a[x].addtag);
    	}
    	if(a[x].ch[1]){
    		a[a[x].ch[1]].addtag=a[a[x].ch[1]].val=a[x].addtag;
    		a[a[x].ch[1]].sum=a[a[x].ch[1]].siz*a[x].addtag;
    		a[a[x].ch[1]].left=a[a[x].ch[1]].right=mmax(a[x].addtag,0);
    		a[a[x].ch[1]].middle=mmax(a[a[x].ch[1]].sum,a[x].addtag);
    	}
    	a[x].addtag=tl;
    }
    if(a[x].revtag){
    	if(a[x].ch[0]){
    		a[a[x].ch[0]].ch[0]^=a[a[x].ch[0]].ch[1]^=a[a[x].ch[0]].ch[0]^=a[a[x].ch[0]].ch[1];
    		a[a[x].ch[0]].left^=a[a[x].ch[0]].right^=a[a[x].ch[0]].left^=a[a[x].ch[0]].right;
    		a[a[x].ch[0]].revtag^=1;
    	}
    	if(a[x].ch[1]){
    		a[a[x].ch[1]].ch[0]^=a[a[x].ch[1]].ch[1]^=a[a[x].ch[1]].ch[0]^=a[a[x].ch[1]].ch[1];
    		a[a[x].ch[1]].left^=a[a[x].ch[1]].right^=a[a[x].ch[1]].left^=a[a[x].ch[1]].right;
    		a[a[x].ch[1]].revtag^=1;
    	}
    	a[x].revtag=0;
    }
}
void Rotate(int x){
    int f=a[x].fa;
    int ff=a[f].fa;
    bool flag=(a[f].ch[1]==x);
    a[ff].ch[a[ff].ch[1]==f]=x;a[x].fa=ff;
    a[f].ch[flag]=a[x].ch[flag^1];a[a[x].ch[flag^1]].fa=f;
    a[x].ch[flag^1]=f;a[f].fa=x;
    Pushup(f);Pushup(x);
}
void Splay(int x,int t){
    while(a[x].fa!=t){
        int f=a[x].fa;
        int ff=a[f].fa;
        if(ff!=t)
            (a[f].ch[0]==x)^(a[ff].ch[0]==f)?Rotate(x):Rotate(f);
        Rotate(x);
    }
    if(!t)root=x;
}
int Find_kth(int x){
    int u=root;
    if(a[u].siz<x||x<0)
        return 0;
    while(1){
        Pushdown(u);
        if(x>a[a[u].ch[0]].siz+1){
            x-=a[a[u].ch[0]].siz+1;
            u=a[u].ch[1];
        }
        else if(a[a[u].ch[0]].siz>=x)u=a[u].ch[0];
        else return u;
    }
}
int Split(int k,int len){
    int x=Find_kth(k),y=Find_kth(k+len+1);
    Splay(x,0);Splay(y,x);
    return a[y].ch[0];
}
void Create_new_point(int x,int val){
    a[x].middle=a[x].sum=val;
    a[x].ch[0]=a[x].ch[1]=a[x].revtag=0;
    a[x].addtag=tl;
    a[x].left=a[x].right=mmax(val,0);
    a[x].siz=1;
}
void Build_new_tree(int l,int r,int fa){
    int mid=(l+r)/2;
    if(l==r)
    	Create_new_point(idx[mid],b[mid]);
    if(l<mid)Build_new_tree(l,mid-1,mid);
    if(mid<r)Build_new_tree(mid+1,r,mid);
    a[idx[mid]].val=b[mid];
    a[idx[mid]].fa=idx[fa];
    a[idx[mid]].addtag=tl;
    Pushup(idx[mid]);
    a[idx[fa]].ch[mid>=fa]=idx[mid];
}
int Get_empty_number(){
	if(!top)return ++tot;
	return rub[top--];
}
void Insert(int k,int len){
	for(int i=1;i<=len;i++)idx[i]=Get_empty_number();
	Build_new_tree(1,len,0);
	int subroot=(1+len)/2,x=Find_kth(k+1),y=Find_kth(k+2);
	Splay(x,0);Splay(y,x);
	a[subroot].fa=y;
	a[y].ch[0]=subroot;
	Pushup(y);Pushup(x);
}
void Clear_subtree(int x){
	if(a[x].ch[0])Clear_subtree(a[x].ch[0]);
	if(a[x].ch[1])Clear_subtree(a[x].ch[1]);
	rub[++top]=x;
	a[x].ch[0]=a[x].ch[1]=a[x].fa=a[x].val=0;
	a[x].left=a[x].right=a[x].middle=a[x].sum=0;
	a[x].addtag=tl;a[x].revtag=0;
}
void Delete(int k,int len){
	int x=Split(k,len);int y=a[x].fa;
	Clear_subtree(x);
	a[y].ch[0]=0;
	Pushup(y);Pushup(a[y].fa);
}
void Update(int k,int len,int val){
	int x=Split(k,len);int y=a[x].fa;
	if(x){
		a[x].addtag=a[x].val=val;
		a[x].sum=a[x].siz*val;
		a[x].left=a[x].right=mmax(a[x].sum,0);
		a[x].middle=mmax(a[x].sum,val);
	}
	Pushup(y);Pushup(a[y].fa);
}
void Reverse(int k,int len){
	int x=Split(k,len);int y=a[x].fa;
	if(a[x].addtag!=tl)return;
	a[x].ch[0]^=a[x].ch[1]^=a[x].ch[0]^=a[x].ch[1];
	a[x].left^=a[x].right^=a[x].left^=a[x].right;
	a[x].revtag^=1;
	Pushup(y);Pushup(a[y].fa);
}
int Query(int k,int len){
	int x=Split(k,len);
	return a[x].sum;
}
int Max_substr(){
	return a[root].middle;
}
int main(){
	freopen("test.in","r",stdin);
	freopen("test.out","w",stdout);
    in(n);in(m);
    a[0].middle=b[1]=b[n+2]=-inf;
    for(int i=2;i<=n+1;i++)
    	in(b[i]);
   	for(int i=1;i<=n+2;i++)
   		idx[i]=i;
    Build_new_tree(1,n+2,0);
    root=(n+3)/2;tot=n+2;
    while(m--){
    	string opt="";cin>>opt;
    	puts("XLY AK IOI");
    	cout<<opt<<endl;
    	puts("ZTQ AK IOI");
    	if(opt=="INSERT"){
    		int pos,ln;in(pos);in(ln);
    		for(int i=1;i<=ln;i++)in(b[i]);
    		Insert(pos,ln);
    	}
    	if(opt=="DELETE"){
    		int pos,ln;in(pos);in(ln);
    		Delete(pos,ln);
    	}
    	if(opt=="MAKE-SAME"){
    		int pos,ln,tp;in(pos);in(ln);in(tp);
    		Update(pos,ln,tp);
    	}
    	if(opt=="REVERSE"){
    		int pos,ln;in(pos);in(ln);
    		Reverse(pos,ln);
    	}
    	if(opt=="GET-SUM"){
    		int pos,ln;in(pos);in(ln);
    		printf("%d\n",Query(pos,ln));
    	}
    	if(opt=="MAX-SUM")
    		printf("%d\n",Max_substr());
    }
    return 0;
}
                                       ```
2021/11/15 20:37
加载中...