Luogu P2824 [HEOI2016/TJOI2016]排序

Posted cjoiershiina-mashiro

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Luogu P2824 [HEOI2016/TJOI2016]排序相关的知识,希望对你有一定的参考价值。

Link
先二分答案,这样所有的数字就都变成了(0,1)
那么区间排序就相当于区间求和再区间覆盖了。

#include<bits/stdc++.h>
using namespace std;
#define N 100007
int read(){int x=0,c=getchar();while(!isdigit(c))c=getchar();while(isdigit(c))x=x*10+c-48,c=getchar();return x;}
int a[N],sum[N<<2],tag[N<<2],n,m;
struct node{int opt,l,r;}q[N];
#define ls p<<1
#define rs p<<1|1
#define mid ((l+r)>>1)
void pushup(int p){sum[p]=sum[ls]+sum[rs];}
void pushdown(int p,int l,int r)
{
    tag[ls]=tag[rs]=tag[p],(tag[p]==1? (sum[ls]=mid-l+1,sum[rs]=r-mid):(sum[ls]=sum[rs]=0)),tag[p]=0;
}
void build(int p,int l,int r,int x)
{
    if(l==r) return (void)(sum[p]=a[l]>=x,tag[p]=0);
    build(ls,l,mid,x),build(rs,mid+1,r,x),pushup(p),tag[p]=0;
}
void modify(int p,int l,int r,int L,int R,int x)
{
    if(L<=l&&r<=R) return (void)((tag[p]=x? 1:-1),sum[p]=(r-l+1)*x);
    if(R<l||r<L) return ;
    if(tag[p]) pushdown(p,l,r);
    if(L<=mid) modify(ls,l,mid,L,R,x);
    if(R>mid) modify(rs,mid+1,r,L,R,x);
    pushup(p);
}
int query(int p,int l,int r,int L,int R)
{
    if(L<=l&&r<=R) return sum[p];
    if(R<l||r<L) return 0;
    if(tag[p]) pushdown(p,l,r);
    return query(ls,l,mid,L,R)+query(rs,mid+1,r,L,R);
}
int ask(int p,int l,int r,int x)
{
    if(l==r) return sum[p];
    if(tag[p]) pushdown(p,l,r);
    return x<=mid? ask(ls,l,mid,x):ask(rs,mid+1,r,x);
}
int check(int x,int p)
{
    build(1,1,n,x);
    for(int i=1,v;i<=m;++i)
    v=query(1,1,n,q[i].l,q[i].r),q[i].opt? (modify(1,1,n,q[i].l,q[i].l+v-1,1),modify(1,1,n,q[i].l+v,q[i].r,0)):(modify(1,1,n,q[i].l,q[i].r-v,0),modify(1,1,n,q[i].r-v+1,q[i].r,1));
    return ask(1,1,n,p);
}
int main()
{
    n=read(),m=read();int i,l=1,r=n,p,ans;
    for(i=1;i<=n;++i) a[i]=read();
    for(i=1;i<=m;++i) q[i].opt=read(),q[i].l=read(),q[i].r=read();
    p=read();
    while(l<=r) check(mid,p)? (ans=mid,l=mid+1):(r=mid-1);
    return !printf("%d",ans);
}

以上是关于Luogu P2824 [HEOI2016/TJOI2016]排序的主要内容,如果未能解决你的问题,请参考以下文章

线段树合并P2824 [HEOI2016/TJOI2016]排序

线段树好题! P2824 [HEOI2016/TJOI2016]排序 题解

[Luogu 4092] HEOI/TJOI2016 树

luogu P2825 [HEOI2016/TJOI2016]游戏

「Luogu2824」[HEOI2016/TJOI2016]排序

luogu4113 [HEOI2012]采花