「HEOI2016/TJOI2016」 排序
题目链接
\(Solution\)
这道题在线的做法不会,所以这里就只讲离线的做法。
因为直接排序的话复杂度显然不对.但是如果数列为\(01\)串的话就可以让复杂度变成对的了
那么\(01\)串怎么做呢?
我们考虑用线段树维护这个东西.
假设我们要将\([l,r]\)排序
我们可以处理出\([l,r]\)中\(1\)的个数,我们令他为\(w\)
如果升序就将\([r-x+1,r]\)设为1,其余为\(0\)
如果降序就将\([l,l+x-1]\)设为1,其余为\(0\)
那么这个问题怎么变成上述情况呢?
我们二分最后的答案,令这个数为\(mid\)。
对于序列中的数,如果小于\(mid\)就为\(0\),大于\(mid\)就为\(1\)
然后操作根上述过程一样.
最后判断下\(q\)位置是否为\(1\)
是,\(l=mid+1\)
否,\(r=mid-1\)
现在来证明一下这个单调性。
如果\(q\)这个位置的数为\(1\),那么答案肯定为\(x+1,x+2,x+3...\)所以区间右移,反之亦然。
\(Code\)
#include<bits/stdc++.h>
#define rg register
#define file(x) freopen(x".in","r",stdin);freopen(x".out","w",stdout);
using namespace std;
int read(){
int x=0,f=1;char c=getchar();
while(c<'0'||c>'9') f=(c=='-')?-1:1,c=getchar();
while(c>='0'&&c<='9') x=x*10+c-48,c=getchar();
return f*x;
}
struct node {
int lazy,v;
}a[1000001];
int c[1000001];
void pushup(int k){
a[k].v=a[k<<1].v+a[k<<1|1].v;
}
void build(int k,int l,int r){
a[k].lazy=-1,a[k].v=0;
if(l==r)
return;
int mid=(l+r)>>1;
build(k<<1,l,mid);
build(k<<1|1,mid+1,r);
}
void pushdown(int k,int l,int r){
if(a[k].lazy==-1) return;
int mid=(l+r)>>1;
a[k<<1].v=(mid-l+1)*a[k].lazy;
a[k<<1|1].v=(r-mid)*a[k].lazy;
a[k<<1].lazy=a[k<<1|1].lazy=a[k].lazy;
a[k].lazy=-1;
}
void update(int k,int l,int r,int begin,int end,int v){
if(r<begin||l>end) return ;
if(r<=end&&l>=begin){
a[k].v=(r-l+1)*v;
a[k].lazy=v;
return ;
}
pushdown(k,l,r);
int mid=(l+r)>>1;
update(k<<1,l,mid,begin,end,v);
update(k<<1|1,mid+1,r,begin,end,v);
pushup(k);
}
int find(int k,int l,int r,int begin,int end){
if(r<begin&&l>end) return 0;
if(r<=end&&l>=begin) return a[k].v;
pushdown(k,l,r);
int mid=(l+r)>>1;
if(end<=mid)
return find(k<<1,l,mid,begin,end);
else if(begin>mid)
return find(k<<1|1,mid+1,r,begin,end);
else return find(k<<1,l,mid,begin,mid)+find(k<<1|1,mid+1,r,mid+1,end);
}
struct ans{
int opt,x,y;
}b[1000001];
int n,m,ans,l,r,q;
bool check(int x){
build(1,1,n);
for(int i=1;i<=n;i++)
update(1,1,n,i,i,c[i]>=x);
for(int i=1;i<=m;i++){
int opt=b[i].opt,x=b[i].x,y=b[i].y;
int w1=find(1,1,n,x,y),w0=y-x+1-w1;
if(opt==0)
update(1,1,n,x,y,1),update(1,1,n,x,x+w0-1,0);
else update(1,1,n,x,y,0),update(1,1,n,x,x+w1-1,1);
}
return find(1,1,n,q,q)==1;
}
int main(){
n=read(),m=read();
for(int i=1;i<=n;i++) c[i]=read();
for(int i=1;i<=m;i++) b[i].opt=read(),b[i].x=read(),b[i].y=read();
l=1,r=n,q=read();
while(l<=r){
int mid=(l+r)>>1;
if(check(mid)) l=mid+1,ans=mid;
else r=mid-1;
}
printf("%d",ans);
return 0;
}
「HEOI2016/TJOI2016」 排序的更多相关文章
- 「HEOI2016/TJOI2016」排序
「HEOI2016/TJOI2016」排序 题目大意 给定一个 \(1\) 到 \(n\) 的排列,每次可以对这个序列的一个区间进行升序/降序排序,求所有操作后第 \(q\) 个位置上的数字. 题解 ...
- 「HEOI2016/TJOI2016」序列
题目链接 戳这 Solution 首先考虑最暴力的dp 我们设: \(f[i]\)表示选择\(i\)以后所能形成的满足条件的子序列的最大值 \(minx[i]\)表示\(i\)能转换为的最小值 \(m ...
- loj #2055. 「TJOI / HEOI2016」排序
#2055. 「TJOI / HEOI2016」排序 题目描述 在 2016 年,佳媛姐姐喜欢上了数字序列.因而他经常研究关于序列的一些奇奇怪怪的问题,现在他在研究一个难题,需要你来帮助他. 这个 ...
- 洛谷 P2824 [HEOI2016/TJOI2016]排序 解题报告
P2824 [HEOI2016/TJOI2016]排序 题意: 有一个长度为\(n\)的1-n的排列\(m\)次操作 \((0,l,r)\)表示序列从\(l\)到\(r\)降序 \((1,l,r)\) ...
- LibreOJ2241 - 「CQOI2014」排序机械臂
Portal Description 给出一个\(n(n\leq10^5)\)个数的序列\(\{a_n\}\),对该序列进行\(n\)次操作.若在第\(i\)次操作前第\(i\)小的数在\(p_i\) ...
- [HEOI2016/TJOI2016]排序 线段树+二分
[HEOI2016/TJOI2016]排序 内存限制:256 MiB 时间限制:6000 ms 标准输入输出 题目类型:传统 评测方式:文本比较 题目描述 在2016年,佳媛姐姐喜欢上了数字序列.因而 ...
- [Luogu P2824] [HEOI2016/TJOI2016]排序 (线段树+二分答案)
题面 传送门:https://www.luogu.org/problemnew/show/P2824 Solution 这题极其巧妙. 首先,如果直接做m次排序,显然会T得起飞. 注意一点:我们只需要 ...
- 2021.12.09 [HEOI2016/TJOI2016]排序(线段树+二分,把一个序列转换为01串)
2021.12.09 [HEOI2016/TJOI2016]排序(线段树+二分,把一个序列转换为01串) https://www.luogu.com.cn/problem/P2824 题意: 在 20 ...
- fir.im Weekly - 如何打造 Github 「爆款」开源项目
最近 Android 转用 Swift 的传闻甚嚣尘上,Swift 的 Github 主页上已经有了一次 merge>>「Port to Android」,让我们对 Swift 的想象又多 ...
随机推荐
- unity 3D循环滚动效果
https://blog.csdn.net/qinyuanpei/article/details/52765356 https://blog.csdn.net/chongzi_daima/articl ...
- 查找和杀掉占用GPU显存的进程
用只有2个G的显卡跑数据就需要在训练之前先把无关进程杀掉,防止跑到一半显存满了 nvidia-smi:显示当前GPU中的线程 kill -9 PID:输入PID以结束线程
- O046、掌握Cinder 的设计思想
参考https://www.cnblogs.com/CloudMan6/p/5578673.html 从 volume 创建流程看 cinder-* 子服务如何协同工作 对于 Cinder ...
- Spring中常用的设计模式之:代理模式
看了tom老师讲的深入分析spring源码,讲的挺好,做个小总结 代理模式的定义: 为其他对象提供一种代理以控制对这个对象的访问.在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以 ...
- 12 Django之Cookie和Session
一.什么是Cookie Cookie的由来 大家都知道HTTP协议是无状态的. 无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接 ...
- Sql Server 导出数据库表结构的SQL查询语句
--导出数据库所有表 SELECT 表名 Then D.name Else '' End, 表说明 Then isnull(F.value,'') Else '' End, 字段序号 = A.colo ...
- WinForm - 不用自绘实现仿QQ2013
素材啥的都是一手整理的,绝对的原创.这是13年做的,虽然是个老项目了,可里面涉及的winform技术不会过时,所以就拿出来重温探讨下技术要点. 没使用任何自绘命令,可以说是非常容易理解与学习的. 效果 ...
- 如何在cmd命令行中运行Java程序
cmd运行java 有萌新问我怎么用cmd运行Java,他运行报错了,怎么办?如图是他的执行过程: 他说就这一个类,里面包含了main方法怎么会没有加载主类呢. 其实很简单,因为你执行的时候并不能直接 ...
- 分布式之协调服务Zookeeper专题第一讲
写在前面: 再谈架构演进: 1.单体架构->tomcat(war) 演进:水平拆分(服务拆分,(用户服务,订单服务,商品服务)) 涉及问题:1).服务通信(webservice) 2).三态问题 ...
- Oracle笔记(二) SQLPlus命令
对于Oracle数据库操作主要使用的是命令行方式,而所有的命令都使用sqlplus完成,对于sqlplus有两种形式. 一种是dos风格的sqlplus:sqlplus.exe; 另一种是window ...