经验还是不够……

原题:

在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. asp.netmvc 三层搭建一个完整的项目

    接下来用 asp.net mvc 三层搭建一个完整的项目: 架构图: 使用的数据库: 一张公司的员工信息表,测试数据 解决方案项目设计: 1.新建一个空白解决方案名称为Company 2.在该解决方案 ...

  2. python之路-python字符编码

    编码的发展 py2的字符编码 py3的字符编码 编码的发展: 编码表:编码是信息从一种形式或格式转换为另一种形式的过程也称为计算机编程语言的代码简称编码.编码表记录着我们常见的明文所对应的计算机二进制 ...

  3. 【收集资料】OpenGL学习

    1.课本配套网站,有Sample Code和书中的图片等   http://math.ucsd.edu/~sbuss/MathCG/ 2.Visual C++的帮助系统可查阅基本OpenGL函数(不包 ...

  4. windows上dubbo-admin的安装

    dubbo-admin的安装 (1)先下载好zookeeper包,因为启动dubbo-admin时需要先启动zookeeper zookeeper:dubbo的注册中心(自己下载 ,找到bin目录下的 ...

  5. RabbitMQ 简单的消息发送与接收

    RabbitMQ是建立在AMQP(Advanced Message Queuing Protocol,高级消息队列协议)基础上的,而AMQP是建立在TCP协议之上的. 因此,RabbitMQ是需要建立 ...

  6. 每天CSS学习之border-collapse

    border-collapse是CSS2的一个属性,其作用是折叠表格(table)的边框.collapse翻译过来又折叠的意思. border-collapse有三个值: collapse:将表格和单 ...

  7. Toy Factory

    Factory is a design pattern in common usage. Please implement a ToyFactory which can generate proper ...

  8. OJ_查找二叉树

    #include<iostream>using namespace std;int n,m;int d[120];int t=1;int re;struct Node{ int data; ...

  9. L298 猴子进化过程

    The evolution of monkeys remains a mystery Why monkeys and apes took separate evolutionary paths has ...

  10. json_encode 处理后的数据是null

    原因: json_encode($str) 中的字符串 必须是 utf-8的格式: -------------------------------- 问题描述: 返回的json数据: <?php ...