「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 的想象又多 ...
随机推荐
- 安装sshpass
sshpass: 用于非交互的ssh 密码验证 ssh登陆不能在命令行中指定密码,也不能以shell中随处可见的,sshpass 的出现,解决了这一问题.它允许你用 -p 参数指定明文密码,然后直接 ...
- 【ES6 】const命令
本质 const实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址所保存的数据不得改动. 对于简单类型的数据(数值.字符串.布尔值),值就保存在变量指向的那个内存地址,因此等同于常量. ...
- css 单位
CSS 有几个不同的单位用于表示长度. 一些设置 CSS 长度的属性有 width, margin, padding, font-size, border-width, 等. 长度有一个数字和单位组成 ...
- Groovy--使用模板引擎和GroovyShell执行插值字符串
package curveJudge import groovy.text.SimpleTemplateEngine /** * Created by Jxy on 2019/8/26 17:16 * ...
- 小白进阶之Scrapy第六篇Scrapy-Redis详解(转)
Scrapy-Redis 详解 通常我们在一个站站点进行采集的时候,如果是小站的话 我们使用scrapy本身就可以满足. 但是如果在面对一些比较大型的站点的时候,单个scrapy就显得力不从心了. 要 ...
- fastadmin中上传配置
配置文件位于下图,默认代码如下 <?php //上传配置 return [ /** * 上传地址,默认是本地上传 */ 'rootpath' => '/uploads/', 'upload ...
- ios h5 长按放大镜效果关闭
对需要禁用的div或者body设置下面样式-webkit-user-select: none;
- 如何设置zencart买满多少免运费?
有时候会希望客户买满多少免运费,当订单总金额大于免运费的订单金额设值时,免运费.下面介绍一下zencart设置买满多少免运费: 1.进入后台–模块管理(Modules)–总额计算(Order Tota ...
- .net core 读取appsettings 的配置
{ "Logging": { "IncludeScopes": false, "LogLevel": { "Default&quo ...
- 【u-boot】u-boot中initf_dm()函数执行流程(转)
前部分设备模型初始化 为了便于阅读,删掉部分代码,只留关键的过程: static int initf_dm(void){ int ret; ret = dm_init_and_scan(t ...