题目链接

戳我

\(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」 排序的更多相关文章

  1. 「HEOI2016/TJOI2016」排序

    「HEOI2016/TJOI2016」排序 题目大意 给定一个 \(1\) 到 \(n\) 的排列,每次可以对这个序列的一个区间进行升序/降序排序,求所有操作后第 \(q\) 个位置上的数字. 题解 ...

  2. 「HEOI2016/TJOI2016」序列

    题目链接 戳这 Solution 首先考虑最暴力的dp 我们设: \(f[i]\)表示选择\(i\)以后所能形成的满足条件的子序列的最大值 \(minx[i]\)表示\(i\)能转换为的最小值 \(m ...

  3. loj #2055. 「TJOI / HEOI2016」排序

    #2055. 「TJOI / HEOI2016」排序   题目描述 在 2016 年,佳媛姐姐喜欢上了数字序列.因而他经常研究关于序列的一些奇奇怪怪的问题,现在他在研究一个难题,需要你来帮助他. 这个 ...

  4. 洛谷 P2824 [HEOI2016/TJOI2016]排序 解题报告

    P2824 [HEOI2016/TJOI2016]排序 题意: 有一个长度为\(n\)的1-n的排列\(m\)次操作 \((0,l,r)\)表示序列从\(l\)到\(r\)降序 \((1,l,r)\) ...

  5. LibreOJ2241 - 「CQOI2014」排序机械臂

    Portal Description 给出一个\(n(n\leq10^5)\)个数的序列\(\{a_n\}\),对该序列进行\(n\)次操作.若在第\(i\)次操作前第\(i\)小的数在\(p_i\) ...

  6. [HEOI2016/TJOI2016]排序 线段树+二分

    [HEOI2016/TJOI2016]排序 内存限制:256 MiB 时间限制:6000 ms 标准输入输出 题目类型:传统 评测方式:文本比较 题目描述 在2016年,佳媛姐姐喜欢上了数字序列.因而 ...

  7. [Luogu P2824] [HEOI2016/TJOI2016]排序 (线段树+二分答案)

    题面 传送门:https://www.luogu.org/problemnew/show/P2824 Solution 这题极其巧妙. 首先,如果直接做m次排序,显然会T得起飞. 注意一点:我们只需要 ...

  8. 2021.12.09 [HEOI2016/TJOI2016]排序(线段树+二分,把一个序列转换为01串)

    2021.12.09 [HEOI2016/TJOI2016]排序(线段树+二分,把一个序列转换为01串) https://www.luogu.com.cn/problem/P2824 题意: 在 20 ...

  9. fir.im Weekly - 如何打造 Github 「爆款」开源项目

    最近 Android 转用 Swift 的传闻甚嚣尘上,Swift 的 Github 主页上已经有了一次 merge>>「Port to Android」,让我们对 Swift 的想象又多 ...

随机推荐

  1. tftp服务器的搭建和使用

    一.tftp介绍   TFTP(Trivial File Transfer Protocol,简单文件传输协议)是TCP/IP协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议,==提供不复 ...

  2. 如何将编译后的文件打包成jar文件

    如果需要修改像spring和dubbo中的jar包源码,修改后怎么打包呢? 如下: 1.win+r进入命令行: 2.找到需要打包的class文件: 3.jar -cvf [jar包的名字] [需要打包 ...

  3. maven入门-- part5 本地仓库,远程仓库,私服

    解读Maven在仓库中的存储路径: 1.基于groupId准备路径,将句点分隔符转成路径分隔符,就是将  "."  转换成 "/" ; example: org ...

  4. go语言入门(3)运算符及流程控制

    1,运算符 算数运算符:+   -   *   /   %   ++   -- 关系运算符:==    !=    <    >    <=    >== 逻辑运算符:按位与 ...

  5. java_day03_流程控制

    ch03 目标:表达式和流程控制 ---------------------------------------------- 1.实例变量和局部变量 程序的基本功能是处理数据,程序中需要使用变量来接 ...

  6. rsync 服务快速部署手册

    一.rsync服务端安装 1.查看rsync安装包 # rpm -qa rsync rsync-3.0.6-12.el6.x86_64 2.安装rsync 系统默认都会安装rsync软件包的,如果查看 ...

  7. 初次安装虚拟机WindowsServer2016

    因学习需要,安装windosServer2016,遇到了几个小坑,特地分享一下. 一.windows server 2016 登录 在登录是会出现 输入CTRL+ALT+DEL,才能响应进入用户界面, ...

  8. gulp connect.static is not a function

    npm install --save serve-static var serveStatic = require('serve-static');

  9. “联邦对抗技术大赛”9月开战 微众银行呼唤开发者共同“AI创新”

    “联邦对抗技术大赛”9月开战  微众银行呼唤开发者共同“AI创新”   从<第五元素>中的智能系统到<超体>中的信息操控,在科幻电影中人工智能已经发展到了极致.而在现实中,目前 ...

  10. SpringMVC配置文件详解:<context:annotation-config/>和<context:component-scan base-package=""/>和<mvc:annotation-driven />

    原文地址:https://www.cnblogs.com/lcngu/p/5080702.html Spring配置文件详解:<context:annotation-config/>和&l ...