# bzoj4552: [Tjoi2016&Heoi2016]排序

http://www.lydsy.com/JudgeOnline/problem.php?id=4552

#include<cstdio>
#include<iostream>
#include<algorithm>

using namespace std;

#define N 100001

int n,m,p;

int a[N],MID;

int sum0[N<<2],sum1[N<<2],flag[N<<2];

int tot0,tot1;

struct node
{
int ty,l,r;
}e[N];

{
x=0; char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)) { x=x*10+c-'0'; c=getchar(); }
}

void build(int k,int l,int r)
{
sum0[k]=sum1[k]=0;
flag[k]=-1;
if(l==r)
{
if(a[l]>=MID) sum1[k]++;
else sum0[k]++;
return;
}
int mid=l+r>>1;
build(k<<1,l,mid);
build(k<<1|1,mid+1,r);
sum0[k]=sum0[k<<1]+sum0[k<<1|1];
sum1[k]=sum1[k<<1]+sum1[k<<1|1];
}

void down(int k,int l,int mid,int r)
{
if(!flag[k])
{
sum0[k<<1]=mid-l+1;
sum1[k<<1]=0;
sum0[k<<1|1]=r-mid;
sum1[k<<1|1]=0;
}
else
{
sum1[k<<1]=mid-l+1;
sum0[k<<1]=0;
sum1[k<<1|1]=r-mid;
sum0[k<<1|1]=0;
}
flag[k<<1]=flag[k<<1|1]=flag[k];
flag[k]=-1;
}

void query(int k,int l,int r,int opl,int opr)
{
if(l>=opl && r<=opr)
{
tot0+=sum0[k];
tot1+=sum1[k];
return;
}
int mid=l+r>>1;
if(flag[k]!=-1) down(k,l,mid,r);
if(opl<=mid) query(k<<1,l,mid,opl,opr);
if(opr>mid) query(k<<1|1,mid+1,r,opl,opr);
}

void change(int k,int l,int r,int opl,int opr,int ty)
{
if(l>=opl && r<=opr)
{
if(!ty)
{
sum0[k]=r-l+1;
sum1[k]=0;
}
else
{
sum0[k]=0;
sum1[k]=r-l+1;
}
flag[k]=ty;
return;
}
int mid=l+r>>1;
if(flag[k]!=-1) down(k,l,mid,r);
if(opl<=mid) change(k<<1,l,mid,opl,opr,ty);
if(opr>mid) change(k<<1|1,mid+1,r,opl,opr,ty);
sum0[k]=sum0[k<<1]+sum0[k<<1|1];
sum1[k]=sum1[k<<1]+sum1[k<<1|1];
}

int ask(int k,int l,int r,int pos)
{
if(l==r) return sum1[k];
int mid=l+r>>1;
if(flag[k]!=-1) down(k,l,mid,r);
}

bool check(int mid)
{
MID=mid;
build(1,1,n);
for(int i=1;i<=m;++i)
{
tot0=tot1=0;
query(1,1,n,e[i].l,e[i].r);
if(!e[i].ty)
{
if(tot0) change(1,1,n,e[i].l,e[i].l+tot0-1,0);
if(tot1) change(1,1,n,e[i].r-tot1+1,e[i].r,1);
}
else
{
if(tot1) change(1,1,n,e[i].l,e[i].l+tot1-1,1);
if(tot0) change(1,1,n,e[i].r-tot0+1,e[i].r,0);
}
}
}

int main()
{
int l=1,r=n,mid,ans;
while(l<=r)
{
mid=MID=l+r>>1;
if(check(mid)) ans=mid,l=mid+1;
else r=mid-1;
}
cout<<ans;
}

## 4552: [Tjoi2016&Heoi2016]排序

Time Limit: 60 Sec  Memory Limit: 256 MB
Submit: 1478  Solved: 748
[Submit][Status][Discuss]

## Description

，需要你来帮助他。这个难题是这样子的：给出一个1到n的全排列，现在对这个全排列序列进行m次局部排序，排

，1 <= m <= 10^5

## Output

输出数据仅有一行，一个整数，表示按照顺序将全部的部分排序结束后第q位置上的数字。

6 3
1 6 2 5 3 4
0 1 4
1 3 6
0 2 4
3

## Sample Output

5

posted @ 2017-11-30 22:22  TRTTG  阅读(222)  评论(0编辑  收藏  举报