• [洛谷P2824][题解][HEOI2016/TJOI2016]排序


    0.概览

    原题

    1.解法

    每次都排序太麻烦了,我们考虑如何转化。
    简化问题:给定一个只由0和1组成的序列,进行相同的操作和查询。
    对于01序列的排序,我们可以直接使用线段树区间修改实现(统计出1的个数后把一边赋为1一边赋为0)。
    这道简化问题与原题的唯一区别就是原题是一个排列。
    众所周知,求答案的题经常可以通过二分转化为较简单的判定,此题也不例外。
    我们二分一个答案(limt),每次将所有大于它的数置为1,小于它的数置为0。
    接下来?接下来就可以用简化问题的方法判定了!
    我们只要转化成01序列之后进行操作,最终(q)位置上的是1就满足条件。

    2.代码

    #define N 1000010
    int n,m,num[N],ans,q;
    struct Input {
    	int l,r,opt;
    }in[N];
    struct Node {
    	int l,r,wei,tag;
    }tr[N<<2];
    inline void Pushup(int k){
    	tr[k].wei=tr[ls].wei+tr[rs].wei;
    }
    void Build(int k,int l,int r,int limt){
    	tr[k].l=l,tr[k].r=r,tr[k].tag=0;
    	if(l==r){
    		tr[k].wei=num[l]>=limt;
    		return;
    	}
    	Build(ls,l,nmid,limt);
    	Build(rs,nmid+1,r,limt);
    	Pushup(k);
    }
    inline void Pushdn(int k){
    	if(tr[k].tag){
    		tr[ls].tag=tr[rs].tag=tr[k].tag;
    		if(tr[k].tag==1){
    			tr[ls].wei=tmid-tr[k].l+1;
    			tr[rs].wei=tr[k].r-tmid;
    		}else tr[ls].wei=tr[rs].wei=0;
    		tr[k].tag=0;
    	}
    }
    void Modify(int k,int l,int r,int num){
    	if(l<=tr[k].l&&tr[k].r<=r){
    		tr[k].wei=num*(tr[k].r-tr[k].l+1);
    		tr[k].tag=num?1:-1;
    		return;
    	}
    	Pushdn(k);
    	if(l<=tmid)Modify(ls,l,r,num);
    	if(tmid<r)Modify(rs,l,r,num);
    	Pushup(k);
    }
    int Query(int k,int l,int r){
    	if(l<=tr[k].l&&tr[k].r<=r){
    		return tr[k].wei;
    	}
    	Pushdn(k);
    	int res=0;
    	if(l<=tmid)res+=Query(ls,l,r);
    	if(tmid<r)res+=Query(rs,l,r);
    	return res;
    }
    int Queryp(int k,int pos){
    	if(Thispoint){
    		return tr[k].wei;
    	}
    	Pushdn(k);
    	if(pos<=tmid)return Queryp(ls,pos);
    	else return Queryp(rs,pos);
    }
    bool Check(int limt){
    	Build(1,1,n,limt);
    	for(rg int i=1;i<=m;i++){
    		int cnt=Query(1,in[i].l,in[i].r);
    		int ll=in[i].l,rr=in[i].r;
    		if(in[i].opt==0){
    			Modify(1,ll,rr-cnt,0);
    			Modify(1,rr-cnt+1,rr,1);
    		}else {
    			Modify(1,ll+cnt,rr,0);
    			Modify(1,ll,ll+cnt-1,1);
    		}
    	}
    	return Queryp(1,q);
    }
    int main(){
    	Read(n),Read(m);
    	for(rg int i=1;i<=n;i++)Read(num[i]);
    	for(rg int i=1;i<=m;i++){
    		Read(in[i].opt),Read(in[i].l),Read(in[i].r);
    	}
    	Read(q);
    	int l=1,r=n;
    	while(l<=r){
    		if(Check(nmid))ans=nmid,l=nmid+1;
    		else r=nmid-1;
    	}
    	cout<<ans<<endl;
    	return 0;
    }
    

    3.完结撒花

  • 相关阅读:
    magento模板中XML与phtml关系 [四]
    magento 好好玩
    凹凸曼的修改zencart 程序(经典!)
    首页商品图片显示错位,easy-popular批量上传
    1.7-BGP①
    1.6-路由的控制③
    1.6-路由的控制②
    1.6-路由的控制①
    1.5
    1.4-动态路由协议OSPF⑧
  • 原文地址:https://www.cnblogs.com/juruoajh/p/13826889.html
Copyright © 2020-2023  润新知