【题意概述】

  对一个1到n的排列做m次区间排序,最后询问位置q上面的数。

【题解】

  区间排序的效率是nlogn,所以暴力做的话效率是mnlogn,显然达不到要求。

  我们考虑二分答案。如果某个位置的数比mid小,就设为0,如果么某个位置的数大于等于mid,就设为1.  check的时候我们只需对01序列排序就好了,这个可以用线段树做到logn.

  如果排序后位置q的数为1,那么就表示原来这里的数大于等于mid,所以我们要挪动l,否则挪动r.

  总的时间复杂度为m*logn*logn

 #include<cstdio>
#include<cstring>
#include<algorithm>
#define LL long long
#define rg register
#define N 30010
#define ls (u<<1)
#define rs (u<<1|1)
#define len(x) (a[x].r-a[x].l+1)
using namespace std;
int n,m,v[N],l,r,mid,pos;
struct tree{
int l,r,c0,c1,num; bool same;
}a[N<<];
struct opt{
int l,r,type;
}b[N];
inline int read(){
int k=,f=; char c=getchar();
while(c<''||c>'')c=='-'&&(f=-),c=getchar();
while(''<=c&&c<='')k=k*+c-'',c=getchar();
return k*f;
}
void build(int u,int l,int r){
a[u].l=l; a[u].r=r; a[u].same=; a[u].c0=a[u].c1=;
if(l<r){
int mid=(l+r)>>;
build(ls,l,mid); build(rs,mid+,r);
a[u].c0=a[ls].c0+a[rs].c0; a[u].c1=a[ls].c1+a[rs].c1;
}
else{
if(v[l]>=mid) a[u].c1=,a[u].c0=;
else a[u].c0=,a[u].c1=;
}
}
inline void pushdown(int u){
a[u].same=; a[ls].same=a[rs].same=;
a[ls].num=a[rs].num=a[u].num;
if(!a[u].num) a[ls].c0=len(ls),a[ls].c1=,a[rs].c0=len(rs),a[rs].c1=;
else a[ls].c0=,a[ls].c1=len(ls),a[rs].c0=,a[rs].c1=len(rs);
}
void update(int u,int l,int r,int num){
if(l<=a[u].l&&a[u].r<=r){
a[u].same=; a[u].num=num;
if(num==) a[u].c1=len(u),a[u].c0=;
else a[u].c0=len(u),a[u].c1=;
return;
}
if(a[u].same) pushdown(u);
int mid=(a[u].l+a[u].r)>>;
if(l<=mid) update(ls,l,r,num);
if(r>mid) update(rs,l,r,num);
a[u].c0=a[ls].c0+a[rs].c0;
a[u].c1=a[ls].c1+a[rs].c1;
}
int query0(int u,int l,int r){
if(l<=a[u].l&&a[u].r<=r) return a[u].c0;
if(a[u].same) pushdown(u);
int mid=(a[u].l+a[u].r)>>,ret=;
if(l<=mid) ret=query0(ls,l,r);
if(r>mid) ret+=query0(rs,l,r);
return ret;
}
int query1(int u,int l,int r){
if(l<=a[u].l&&a[u].r<=r) return a[u].c1;
if(a[u].same) pushdown(u);
int mid=(a[u].l+a[u].r)>>,ret=;
if(l<=mid) ret=query1(ls,l,r);
if(r>mid) ret+=query1(rs,l,r);
return ret;
}
inline bool check(){
build(,,n); int r0=,r1=;
for(rg int i=;i<=m;i++){
r0=query0(,b[i].l,b[i].r); r1=query1(,b[i].l,b[i].r);
if(b[i].type==) update(,b[i].l,b[i].l+r0-,),update(,b[i].l+r0,b[i].r,);
else update(,b[i].l,b[i].l+r1-,),update(,b[i].l+r1,b[i].r,);
}
r0=query0(,pos,pos); r1=query1(,pos,pos);
return r1>;
}
int main(){
n=read(); m=read();
for(rg int i=;i<=n;i++) v[i]=read();
for(rg int i=;i<=m;i++) b[i].type=read(),b[i].l=read(),b[i].r=read();
pos=read();
l=,r=n+;
while(l+<r){
mid=(l+r)>>;
if(check()) l=mid; else r=mid;
}
printf("%d\n",l);
}

洛谷 2824 [HEOI2016/TJOI2016]排序的更多相关文章

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

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

  2. [洛谷P2824][HEOI2016/TJOI2016]排序

    题目大意:一个全排列,两种操作: 1. $0\;l\;r:$把$[l,r]$升序排序2. $1\;l\;r:$把$[l,r]$降序排序 最后询问第$k$位是什么 题解:二分答案,把比这个数大的赋成$1 ...

  3. 洛谷P2824 [HEOI2016/TJOI2016]排序(线段树)

    传送门 这题的思路好清奇 因为只有一次查询,我们考虑二分这个值为多少 将原序列转化为一个$01$序列,如果原序列上的值大于$mid$则为$1$否则为$0$ 那么排序就可以用线段树优化,设该区间内$1$ ...

  4. 洛谷 P2824 [HEOI2016/TJOI2016]排序 (线段树合并)

    (另外:题解中有一种思路很高妙而且看上去可以适用一些其他情况的离线方法) 线段树合并&复杂度的简单说明:https://blog.csdn.net/zawedx/article/details ...

  5. 洛谷$P2824\ [HEOI2016/TJOI2016]$ 排序 线段树+二分

    正解:线段树+二分 解题报告: 传送门$QwQ$ 昂着题好神噢我$jio$得$QwQQQQQ$,,, 开始看到长得很像之前考试题的亚子,,,然后仔细康康发现不一样昂$kk$,就这里范围是$[1,n]$ ...

  6. 洛谷 P4093 [HEOI2016/TJOI2016]序列 CDQ分治优化DP

    洛谷 P4093 [HEOI2016/TJOI2016]序列 CDQ分治优化DP 题目描述 佳媛姐姐过生日的时候,她的小伙伴从某宝上买了一个有趣的玩具送给他. 玩具上有一个数列,数列中某些项的值可能会 ...

  7. BZOJ4553/洛谷P4093 [HEOI2016/TJOI2016]序列 动态规划 分治

    原文链接http://www.cnblogs.com/zhouzhendong/p/8672434.html 题目传送门 - BZOJ4553 题目传送门 - 洛谷P4093 题解 设$Li$表示第$ ...

  8. 洛谷 P4091 [HEOI2016/TJOI2016]求和 解题报告

    P4091 [HEOI2016/TJOI2016]求和 题目描述 在2016年,佳媛姐姐刚刚学习了第二类斯特林数,非常开心. 现在他想计算这样一个函数的值: \[ f(n)=\sum_{i=0}^n\ ...

  9. 洛谷 P4093 [HEOI2016/TJOI2016]序列 解题报告

    P4093 [HEOI2016/TJOI2016]序列 题目描述 佳媛姐姐过生日的时候,她的小伙伴从某宝上买了一个有趣的玩具送给他.玩具上有一个数列,数列中某些项的值可能会变化,但同一个时刻最多只有一 ...

随机推荐

  1. Java集合类解析 ***

    collection集合 Map集合 Hashtable和HashMap的区别: Hashtable的方法是同步的,而HashMap的方法不是.HashMap可以将空值作为一个表的条目的key或val ...

  2. SpringBoot2.x版本整合SpringSecurity、Oauth2进行password认证

    很多人在进行项目开发时都会用到Oauth2.0结合SpringSecurity或者Shiro进行权限拦截以及用户验证,网上也有很多的案例,前几天项目里边需要用到,顺便整合了进来,特此写篇博客,记录下过 ...

  3. boxworld开发日记2019-6-8

    打算做一个类似RimWorld的游戏,这里记录一下历程.首先,简单回顾一下. 2018年12月23日  场景管理,打算使用四叉树,后来发现四叉树在空间组织和内存占用方面并不占优势,之后计划使用地图分块 ...

  4. Android 性能优化(15)网络优化( 11)Manipulating Broadcast Receivers On Demand

    Manipulating Broadcast Receivers On Demand This lesson teaches you to Toggle and Cascade State Chang ...

  5. 375 Guess Number Higher or Lower II 猜数字大小 II

    我们正在玩一个猜数游戏,游戏规则如下:我从 1 到 n 之间选择一个数字,你来猜我选了哪个数字.每次你猜错了,我都会告诉你,我选的数字比你的大了或者小了.然而,当你猜了数字 x 并且猜错了的时候,你需 ...

  6. 260 Single Number III 数组中除了两个数外,其他的数都出现了两次,找出这两个只出现一次的数

    给定一个整数数组 nums,其中恰好有两个元素只出现一次,其他所有元素均出现两次. 找出只出现一次的那两个元素.示例:给定 nums = [1, 2, 1, 3, 2, 5], 返回 [3, 5].注 ...

  7. [译]curl_multi_perform

    http://curl.haxx.se/libcurl/c/curl_multi_perform.html curl_multi_perform.3 -- man page NAMEcurl_mult ...

  8. MVC的学习-EF的认识

    1.什么是EF EF又称持久层框架:平时C#定义的变量是保存到内存中的,一断电就没有了.而持久的意思是数据保存到硬盘盘里(数据库的sql查询是在硬盘里进行的,所以速度很慢).EF帮我们将一个对象保存到 ...

  9. 151. [USACO Dec07] 建造路径

    ★★   输入文件:roads.in   输出文件:roads.out   简单对比 时间限制:1 s   内存限制:128 MB 译 by CmYkRgB123 描述 Farmer John 刚刚得 ...

  10. 06使用NanoPiM1Plus在Android4.4.2下接U盘

    06使用NanoPiM1Plus在Android4.4.2下接U盘 大文实验室/大文哥 壹捌陆捌零陆捌捌陆捌贰 21504965 AT qq.com 完成时间:2017/12/5 17:51 版本:V ...