zoukankan      html  css  js  c++  java
  • 序列终结者

    题目
    感觉没什么好说的
    模板题
    反正splay如果不翻转,可以线段树

    #include<bits/stdc++.h>
    #define re return
    #define MAX(a,b) (a)>(b)?(a):(b)
    #define inc(i,l,r) for(int i=l;i<=r;++i)
    const int maxn=50005;
    template<typename T>inline void rd(T&x)
    {
    	char c;bool f=0;
    	while((c=getchar())<'0'||c>'9')if(c=='-')f=1;
    	x=c^48;
    	while((c=getchar())>='0'&&c<='9')x=x*10+(c^48);
    	if(f)x=-x;
    }
    using namespace std;
    int rt,tot,n,m,fa[maxn],num[maxn],add[maxn],rev[maxn],mx[maxn],val[maxn],size[maxn];
    struct node{
    	int ch[2];
    }t[maxn];
    
    inline void pushup(int x)
    {
    	size[x]=1+size[t[x].ch[0]]+size[t[x].ch[1]];
    	mx[x]=max(val[x],max(mx[t[x].ch[0]],mx[t[x].ch[1]]));
    }
    inline void pushdown(int x)
    {
    	if(add[x]){
    		if(t[x].ch[0])add[t[x].ch[0]]+=add[x],val[t[x].ch[0]]+=add[x],mx[t[x].ch[0]]+=add[x];
    		if(t[x].ch[1])add[t[x].ch[1]]+=add[x],val[t[x].ch[1]]+=add[x],mx[t[x].ch[1]]+=add[x];
    		add[x]=0;
    	}
    	if(rev[x])
    	{
    		if(t[x].ch[0])rev[t[x].ch[0]]^=1;
    		if(t[x].ch[1])rev[t[x].ch[1]]^=1;
    		swap(t[x].ch[0],t[x].ch[1]);
    		rev[x]=0;
    	}
    }
    
    inline bool chk(int x){re t[fa[x]].ch[1]==x;}
    inline void rotate(int x)
    {
    	int y=fa[x],z=fa[y],k=chk(x),w=t[x].ch[k^1];
    	pushdown(y);pushdown(x);
    	t[z].ch[chk(y)]=x;fa[x]=z;
    	t[x].ch[k^1]=y;fa[y]=x;
    	t[y].ch[k]=w;fa[w]=y;
    	pushup(y);pushup(x);
    }
    
    inline void splay(int x,int goal=0)
    {
    	while(fa[x]!=goal)
    	{
    		int y=fa[x],z=fa[y];
    		if(z!=goal)chk(y)==chk(x)?rotate(y):rotate(x);
    		rotate(x);
    	}
    	if(!goal)rt=x;
    }
    
    inline int kth(int k)
    {
    	int u=rt;
    	while(1)
    	{
    		pushdown(u);
    		int y=t[u].ch[0];
    		if(k>1+size[y])k=k-1-size[y],u=t[u].ch[1];
    		else if(k<=size[y])u=t[u].ch[0];
    		else re u;
    	}
    	re 0;
    }
    inline int build(int l,int r,int f){
        if(l>r)return 0;
    	int x=++tot,mid=(l+r)>>1;
        fa[x]=f,val[x]=mx[x]=num[mid];
        t[x].ch[0]=build(l,mid-1,x);
    	t[x].ch[1]=build(mid+1,r,x);
        pushup(x);
    	re x;
    }
    int main()
    {
    	int l,r,opt,K;
    	rd(n);rd(m);
    	mx[0]=num[1]=num[n+2]=-2147483647;
    	//不能算入子序列和 
    	rt=build(1,n+2,0);
    	
    	inc(i,1,m)
    	{
    		rd(opt);rd(l);rd(r);
    		l=kth(l),r=kth(r+2);
    		splay(l,0);splay(r,l);
    		int v=t[t[rt].ch[1]].ch[0];
    		if(opt==1){
    			rd(K);
    			add[v]+=K;
    			val[v]+=K;
    			mx[v]+=K;
    		}
    		else if(opt==2)rev[v]^=1;
    		else printf("%d
    ",mx[v]);
    	}
    	re 0;
    }
    
  • 相关阅读:
    HDU 4122 Alice's mooncake shop
    win7 Visual Studio 2008 安装程序时出现“ 加载安装组件时遇到问题。取消安装。”处理方法
    [置顶] 《程序员,你伤不起》–读书笔记-序
    顺序查找的优化方法
    结构体的大小的计算与空间的优化--之基本类型
    poj 1836 Alignment
    HDU 4721 Food and Productivity (二分+树状数组)
    POJ 1724 最短路费用限制
    Java面试题之九
    Eclipse 支持jQuery 自动提示
  • 原文地址:https://www.cnblogs.com/lsyyy/p/11273008.html
Copyright © 2011-2022 走看看