标签:另一个 zoj amp 位置 mod 赋值 print main log
来自FallDream的博客,未经允许,请勿转载,谢谢。
#include<iostream> #include<cstdio> #define MN 100000 using namespace std; inline int read() { int x=0;char ch=getchar(); while(ch<‘0‘||ch>‘9‘)ch=getchar(); while(ch>=‘0‘&&ch<=‘9‘)x=x*10+ch-‘0‘,ch=getchar(); return x; } int a[MN+5],n,m,Mid,Res,Pos; struct op{int kind,l,r;}q[MN+5]; struct Tree{int l,r,tag,val,x;}T[MN*4+5]; void build(int x,int l,int r) { T[x].tag=0; if((T[x].l=l)==(T[x].r=r)){T[x].x=(a[l]<=Mid);return;} int mid=l+r>>1; build(x<<1,l,mid);build(x<<1|1,mid+1,r); T[x].x=T[x<<1].x+T[x<<1|1].x; } inline void Mark(int x,int v) { T[x].tag=1;T[x].val=v; T[x].x=(v?0:T[x].r-T[x].l+1); } inline void pushdown(int x) { Mark(x<<1,T[x].val); Mark(x<<1|1,T[x].val); T[x].tag=0; } void Modify(int x,int l,int r,int ad) { if(l>r) return; if(T[x].l==l&&T[x].r==r){Mark(x,ad);return;} if(T[x].tag) pushdown(x); int mid=T[x].l+T[x].r>>1; if(r<=mid) Modify(x<<1,l,r,ad); else if(l>mid) Modify(x<<1|1,l,r,ad); else Modify(x<<1,l,mid,ad),Modify(x<<1|1,mid+1,r,ad); T[x].x=T[x<<1].x+T[x<<1|1].x; } int Query(int x,int l,int r) { if(T[x].l==l&&T[x].r==r) return T[x].x; if(T[x].tag) pushdown(x); int mid=T[x].l+T[x].r>>1; if(r<=mid) return Query(x<<1,l,r); else if(l>mid) return Query(x<<1|1,l,r); else return Query(x<<1,l,mid)+Query(x<<1|1,mid+1,r); } int main() { n=read();m=read(); for(int i=1;i<=n;++i) a[i]=read(); for(int i=1;i<=m;++i) q[i].kind=read(),q[i].l=read(),q[i].r=read(); Pos=read();int l=1,r=n; while(l<=r) { Mid=l+r>>1; build(1,1,n); for(int i=1;i<=m;++i) { int x=Query(1,q[i].l,q[i].r); if(q[i].kind) Modify(1,q[i].l,q[i].r-x,1),Modify(1,q[i].r-x+1,q[i].r,0); else Modify(1,q[i].l,q[i].l+x-1,0),Modify(1,q[i].l+x,q[i].r,1); } if(Query(1,Pos,Pos)) Res=Mid,r=Mid-1; else l=Mid+1; } printf("%d\n",Res); return 0; }
[bzoj4552][Tjoi2016&Heoi2016]排序
标签:另一个 zoj amp 位置 mod 赋值 print main log
原文地址:http://www.cnblogs.com/FallDream/p/bzoj4552.html