「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 的想象又多 ...
随机推荐
- docker 卸载旧版本
列出docker安装过的相关包: sudo yum list installed | grep docker 删除相关安装包 sudo yum -y remove docker-ce.x86_64su ...
- flex整页布局
使用flex进行整页的三列布局,flex:1下的子元素无法铺满父级.给flex:1元素,添加stretch拉伸 display: flex; align-content: stretch; align ...
- 获得npm server 上 package 的版本信息
通过这个命令可以获取package 的历史版本信息 npm view packagename versions
- 【Day1】3.数据类型
视频地址(全部) https://edu.csdn.net/course/detail/26057 课件地址(全部) https://download.csdn.net/download/gentl ...
- Win10带有网络连接的安全模式怎么开启?
安全模式是在Windows系统中不加载第三方设备驱动程序的情况下启动电脑,从而可以方便的检测与修复电脑系统的错误,比如在安全模式下可以删除某些顽固的文件.查杀病毒.修复系统故障.卸载恶意软件等.不过在 ...
- Samba set of user authentication and file access rights
This series is compatible with Linux certification exam LPIC. A typical Linux user-level topics omit ...
- 一篇文章让你彻底明白__getattr__、__getattribute__、__getitem__的用法与执行原理
__getattr__ 在Python中,当我们试图访问一个不存在的属性的时候,会报出一个AttributeError.但是如何才能避免这一点呢?于是__getattr__便闪亮登场了 当访问一个不存 ...
- MySQL 安装与基本概念
Mysql版本 第一条产品线:5.0.xx及升级到5.1.xx的产品系列,这条产品线继续完善与改进其用户体验和性能,同时增加新功能,这条路线可以说是MySQL早期产品的延续系列,这一系列的产品发布情况 ...
- getAttribute和getParameter的简单区别
getAttribute表示从request范围取得设置的属性,必须要先setAttribute设置属性,才能通过getAttribute来取得,设置与取得的为Object对象类型 getParame ...
- 分析bug是前端还是后端的
如何分析一个bug是前端还是后端的? 平常提bug的时候,前端开发和后端开发总是扯皮,不承认是对方的bug 这种情况很容易判断,先抓包看请求报文,对着接口文档,看请求报文有没问题,有问题就是前端发的数 ...