经验还是不够……

原题:

在2016年,佳媛姐姐喜欢上了数字序列。因而他经常研究关于序列的一些奇奇怪怪的问题,现在他在研究一个难题
,需要你来帮助他。这个难题是这样子的:给出一个1到n的全排列,现在对这个全排列序列进行m次局部排序,排
序分为两种:1:(0,l,r)表示将区间[l,r]的数字升序排序2:(1,l,r)表示将区间[l,r]的数字降序排序最后询问第q
位置上的数字。
1 <= n, m <= 10^5
 
没思路,看题解
这个本应不看题解的,但是急于刷AC数就看了,果然还是要放下每日6题的任务?
正解是二分一个值,把序列中<=它的设为1,大于的设为0,然后建线段树
每次排序先查询区间中有多少个1,然后以1的个数为分界线,根据升序或降序把左边和右边分别buff成1或0
这样一番操作之后第x的位置的值就表示位置x上的数和当前二分的数的大小关系
然后根据这个二分就行了
暂时不能把这个方法延伸到更多的地方去,需要再思考
代码:
 #include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
const int oo=;
int rd(){int z=,mk=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-')mk=-; ch=getchar();}
while(ch>=''&&ch<=''){z=(z<<)+(z<<)+ch-''; ch=getchar();}
return z*mk;
}
struct dcd{int mk,x,y;}b[];
int n,m,a[],qst;
int v[],dt[];
int mn=oo,mx=;
void gtsgmttr(int x,int y,int l,int r){
dt[x]=-,v[x]=;
if(l==r){ v[x]=(y>=a[l]); return ;}
int md=(l+r)>>;
gtsgmttr(x<<,y,l,md),gtsgmttr(x<<|,y,md+,r);
v[x]=v[x<<]+v[x<<|];
}
void pshd(int x,int l,int r,int md){
if(dt[x]==-) return ;
v[x<<]=(md-l+)*dt[x],v[x<<|]=(r-md)*dt[x];
dt[x<<]=dt[x<<|]=dt[x];
dt[x]=-;
}
void mdf(int x,int l,int r,int z,int ll,int rr){
if(l>r) return ;
if(l==ll && r==rr){ v[x]=(r-l+)*z,dt[x]=z; return ;}
int md=(ll+rr)>>; pshd(x,ll,rr,md);
if(l<=md && r>md) mdf(x<<,l,md,z,ll,md),mdf(x<<|,md+,r,z,md+,rr);
else if(r<=md) mdf(x<<,l,r,z,ll,md);
else mdf(x<<|,l,r,z,md+,rr);
v[x]=v[x<<]+v[x<<|];
}
int qr(int x,int l,int r,int ll,int rr){
if(l==ll && r==rr) return v[x];
int md=(ll+rr)>>; pshd(x,ll,rr,md);
if(l<=md && r>md) return qr(x<<,l,md,ll,md)+qr(x<<|,md+,r,md+,rr);
else if(r<=md) return qr(x<<,l,r,ll,md);
else return qr(x<<|,l,r,md+,rr);
}
int sch(int x,int y,int ll,int rr){
if(y==ll && y==rr) return v[x];
int md=(ll+rr)>>; pshd(x,ll,rr,md);
if(y<=md) return sch(x<<,y,ll,md);
else return sch(x<<|,y,md+,rr);
}
bool chck(int x){
gtsgmttr(,x,,n);
//cout<<x<<endl;
//for(int i=1;i<=n;++i) printf("%d ",sch(1,i,1,n));
//cout<<endl;
int bwl;
for(int i=;i<=m;++i){
bwl=qr(,b[i].x,b[i].y,,n);
/*if(b[i].mk) mdf(1,b[i].x,b[i].x+bwl-1,0,1,n),mdf(1,b[i].x+bwl,b[i].y,1,1,n);
else mdf(1,b[i].x,b[i].y-bwl,1,1,n),mdf(1,b[i].y-bwl+1,b[i].y,0,1,n);*/
if(b[i].mk) mdf(,b[i].x,b[i].y-bwl,,,n),mdf(,b[i].y-bwl+,b[i].y,,,n);
else mdf(,b[i].x,b[i].x+bwl-,,,n),mdf(,b[i].x+bwl,b[i].y,,,n);
//for(int j=1;j<=n;++j) printf("%d ",sch(1,j,1,n));
//cout<<endl;
}
return sch(,qst,,n);
}
int bnrsch(){
int l=mn,r=mx,md;
while(l+<r) md=(l+r)>>,(chck(md) ? r : l)=md;
return chck(l) ? l : r;
}
int main(){//freopen("ddd.in","r",stdin);
cin>>n>>m;
for(int i=;i<=n;++i) a[i]=rd(),mn=min(mn,a[i]),mx=max(mx,a[i]);
for(int i=;i<=m;++i) b[i].mk=rd(),b[i].x=rd(),b[i].y=rd();
cin>>qst;
cout<<bnrsch()<<endl;
return ;
}

【BZOJ4552】【TJOI2016】【HEOI2016】排序的更多相关文章

  1. bzoj千题计划128:bzoj4552: [Tjoi2016&Heoi2016]排序

    http://www.lydsy.com/JudgeOnline/problem.php?id=4552 二分答案 把>=mid 的数看做1,<mid 的数看做0 这样升序.降序排列相当于 ...

  2. [BZOJ4552][TJOI2016&&HEOI2016]排序(二分答案+线段树/线段树分裂与合并)

    解法一:二分答案+线段树 首先我们知道,对于一个01序列排序,用线段树维护的话可以做到单次排序复杂度仅为log级别. 这道题只有一个询问,所以离线没有意义,而一个询问让我们很自然的想到二分答案.先二分 ...

  3. BZOJ4552 [Tjoi2016&Heoi2016]排序 【二分 + 线段树】

    题目链接 BZOJ4552 题解 之前去雅礼培训做过一道题,\(O(nlogn)\)维护区间排序并能在线查询 可惜我至今不能get 但这道题有着\(O(nlog^2n)\)的离线算法 我们看到询问只有 ...

  4. [bzoj4552][Tjoi2016][Heoi2016]排序

    Description 给出一个$1$到$n$的全排列,现在对这个全排列序列进行$m$次局部排序,排序分为$2$种: $1.(0,l,r)$表示将区间$[l,r]$的数字升序排序; $2.(1,l,r ...

  5. BZOJ4552: [Tjoi2016&Heoi2016]排序

    Description 在2016年,佳媛姐姐喜欢上了数字序列.因而他经常研究关于序列的一些奇奇怪怪的问题,现在他在研究一个难题 ,需要你来帮助他.这个难题是这样子的:给出一个1到n的全排列,现在对这 ...

  6. [bzoj4552][Tjoi2016&Heoi2016]排序-二分+线段树

    Brief Description DZY有一个数列a[1..n],它是1∼n这n个正整数的一个排列. 现在他想支持两种操作: 0, l, r: 将a[l..r]原地升序排序. 1, l, r: 将a ...

  7. BZOJ4552:[TJOI2016&HEOI2016]排序(线段树,二分)

    Description 在2016年,佳媛姐姐喜欢上了数字序列.因而他经常研究关于序列的一些奇奇怪怪的问题,现在他在研究一个难题,需要你来帮助他. 这个难题是这样子的:给出一个1到n的全排列,现在对这 ...

  8. 2018.08.01 BZOJ4552: [Tjoi2016&Heoi2016]排序(二分+线段树)

    传送门 线段树简单题. 二分答案+线段树排序. 实际上就是二分答案mid" role="presentation" style="position: relat ...

  9. BZOJ4552 Tjoi2016&Heoi2016排序 【二分+线段树】*

    Description 在2016年,佳媛姐姐喜欢上了数字序列.因而他经常研究关于序列的一些奇奇怪怪的问题,现在他在研究一个难题,需要你来帮助他.这个难题是这样子的:给出一个1到n的全排列,现在对这个 ...

  10. [BZOJ4552][Tjoi2016&Heoi2016]排序(二分答案+线段树)

    二分答案mid,将>=mid的设为1,<mid的设为0,这样排序就变成了区间修改的操作,维护一下区间和即可 然后询问第q个位置的值,为1说明>=mid,以上 时间复杂度O(nlog2 ...

随机推荐

  1. 【阅读笔记】《C程序员 从校园到职场》第四章 变量和函数

    参考: Contents: 一.数据类型(对基本数据类型进行重定义——规范化) 二.变量和函数  (命名规则,注意事项) 三.静态变量及其使用 一.数据类型(对基本数据类型进行重定义——规范化) 1. ...

  2. Hive/hbase/sqoop的基本使用教程~

    Hive/hbase/sqoop的基本使用教程~ ###Hbase基本命令start-hbase.sh     #启动hbasehbase shell      #进入hbase编辑命令 list  ...

  3. TensorFlow学习笔记——节点(constant、placeholder、Variable)

    一. constant(常量) constant是TensorFlow的常量节点,通过constant方法创建,其是计算图(Computational Graph)中的起始节点,是传入数据. 创建方式 ...

  4. js 判断某个元素是否隐藏或显示

    //判断某个元素是否显示 true:是 false:不是 var isVisible = $('#myDiv').is(':visible'); //判断某个元素是否隐藏 true:是 false:不 ...

  5. 每天CSS学习之!important

    通过在CSS属性后面跟上!important参数,就会让该属性的优先级变为最高,不管是在css文件,还是内联style中,就属后面跟了!important这个小弟的属性的优先级最高. 让我们来测试一下 ...

  6. Problem C: 平面上的点——Point类 (III)

    Description 在数学上,平面直角坐标系上的点用X轴和Y轴上的两个坐标值唯一确定.现在我们封装一个“Point类”来实现平面上的点的操作. 根据“append.cc”,完成Point类的构造方 ...

  7. 5.Python爬虫入门五之URLError异常处理

    大家好,本节在这里主要说的是URLError还有HTTPError,以及对它们的一些处理. 1.URLError 首先解释下URLError可能产生的原因: 网络无连接,即本机无法上网 连接不到特定的 ...

  8. Sample Credential Providers

        Windows Vista Sample Credential Providers Overview Contents Terms of Use Release Notes SampleCre ...

  9. mysql主从复制-读写分离

    mysql主从复制+读写分离 环境:mysql主:193.168.1.1mysql从:193.168.1.2amoeba代理:193.168.1.3########################## ...

  10. python 一行代码字符串转字典方法

    b = 'bid=Qzw9cKnyESM; ll="108288"; __yadk_uid=4YChvgeANLBEh4iV00n1tc0HQ8zpmSl1; __utmc=301 ...