在2016年,佳媛姐姐喜欢上了数字序列。因而他经常研究关于序列的一些奇奇怪怪的问题,现在他在研究一个难题
,需要你来帮助他。这个难题是这样子的:给出一个1到n的全排列,现在对这个全排列序列进行m次局部排序,排
序分为两种:1:(0,l,r)表示将区间[l,r]的数字升序排序2:(1,l,r)表示将区间[l,r]的数字降序排序最后询问第q
位置上的数字。
标签:main 复杂 space 思路 log ++ pos name 长度
输出数据仅有一行,一个整数,表示按照顺序将全部的部分排序结束后第q位置上的数字。
#include<map> #include<set> #include<list> #include<deque> #include<cmath> #include<queue> #include<stack> #include<vector> #include<cstdio> #include<complex> #include<cstring> #include<cstdlib> #include<iostream> #include<algorithm> #define ls (o<<1) #define rs ((o<<1)|1) #define maxx 100010 #define RG register #define mid ((l+r)>>1) using namespace std; int tree[maxx*4],a[maxx],n,m,lazy[maxx*4];bool sub[maxx];int sum; struct ask{ int l,r,t; }b[maxx]; void build(int o,int l,int r){ if(l==r){tree[o]=(sub[l]==1);return;} build(ls,l,mid),build(rs,mid+1,r); tree[o]=tree[ls]+tree[rs]; } void down(int o,int l,int r){ if(lazy[o]!=-1)tree[rs]=(r-mid)*lazy[o],tree[ls]=(mid-l+1)*lazy[o]; if(lazy[o]!=-1)lazy[rs]=lazy[ls]=lazy[o];lazy[o]=-1; } void update(int o,int l,int r,int L,int R,int num){ if(l!=r)down(o,l,r); if(l>=L&&r<=R){tree[o]=num*(r-l+1),lazy[o]=num;return;} if(mid<L)update(rs,mid+1,r,L,R,num); else if(mid>=R)update(ls,l,mid,L,R,num); else update(rs,mid+1,r,L,R,num),update(ls,l,mid,L,R,num); tree[o]=tree[ls]+tree[rs]; } int query(int o,int l,int r,int L,int R){ if(l!=r)down(o,l,r); if(l>=L&&r<=R)return tree[o]; if(mid<L)return query(rs,mid+1,r,L,R); else if(mid>=R)return query(ls,l,mid,L,R); else return query(rs,mid+1,r,L,R)+query(ls,l,mid,L,R); }int pos; int main(){ scanf("%d%d",&n,&m);int l=66666666,r=-666666666; for(int i=1;i<=n;++i)scanf("%d",&a[i]),l=min(l,a[i]),r=max(r,a[i]); for(int i=1;i<=m;++i)scanf("%d%d%d",&b[i].t,&b[i].l,&b[i].r);scanf("%d",&pos); while(l<=r){memset(lazy,-1,sizeof(lazy)); for(RG int i=1;i<=n;++i)if(a[i]>mid)sub[i]=1;else sub[i]=0; build(1,1,n); for(RG int i=1;i<=m;++i){ sum=query(1,1,n,b[i].l,b[i].r); if(b[i].t){ if(sum)update(1,1,n,b[i].l,b[i].l+sum-1,1); if(sum!=b[i].r-b[i].l+1)update(1,1,n,b[i].l+sum,b[i].r,0); } else{ if(sum)update(1,1,n,b[i].r-sum+1,b[i].r,1); if(sum!=b[i].r-b[i].l+1)update(1,1,n,b[i].l,b[i].r-sum,0); } }int axx=query(1,1,n,pos,pos); if(!axx)r=mid-1;else l=mid+1; }cout<<l;return 0; }
BZOJ4552:[Tjoi2016&Heoi2016]排序
标签:main 复杂 space 思路 log ++ pos name 长度
原文地址:http://www.cnblogs.com/zzmmm/p/7141420.html