http://www.lydsy.com/JudgeOnline/problem.php?id=4552

二分答案

把>=mid 的数看做1,<mid 的数看做0

这样升序、降序排列相当于区间查询0,1 的个数,区间覆盖0,1

线段树即可完成

查询给定位置p

如果=1,说明p位置的数>=mid ,上调下界

如果=0,说明p位置的数<mid,下调上界

#include<cstdio>
#include<iostream>
#include<algorithm> using namespace std; #define N 100001 int n,m,p; int a[N],MID; int sum0[N<<],sum1[N<<],flag[N<<]; int tot0,tot1; struct node
{
int ty,l,r;
}e[N]; void read(int &x)
{
x=; char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)) { x=x*+c-''; c=getchar(); }
} void build(int k,int l,int r)
{
sum0[k]=sum1[k]=;
flag[k]=-;
if(l==r)
{
if(a[l]>=MID) sum1[k]++;
else sum0[k]++;
return;
}
int mid=l+r>>;
build(k<<,l,mid);
build(k<<|,mid+,r);
sum0[k]=sum0[k<<]+sum0[k<<|];
sum1[k]=sum1[k<<]+sum1[k<<|];
} void down(int k,int l,int mid,int r)
{
if(!flag[k])
{
sum0[k<<]=mid-l+;
sum1[k<<]=;
sum0[k<<|]=r-mid;
sum1[k<<|]=;
}
else
{
sum1[k<<]=mid-l+;
sum0[k<<]=;
sum1[k<<|]=r-mid;
sum0[k<<|]=;
}
flag[k<<]=flag[k<<|]=flag[k];
flag[k]=-;
} void query(int k,int l,int r,int opl,int opr)
{
if(l>=opl && r<=opr)
{
tot0+=sum0[k];
tot1+=sum1[k];
return;
}
int mid=l+r>>;
if(flag[k]!=-) down(k,l,mid,r);
if(opl<=mid) query(k<<,l,mid,opl,opr);
if(opr>mid) query(k<<|,mid+,r,opl,opr);
} void change(int k,int l,int r,int opl,int opr,int ty)
{
if(l>=opl && r<=opr)
{
if(!ty)
{
sum0[k]=r-l+;
sum1[k]=;
}
else
{
sum0[k]=;
sum1[k]=r-l+;
}
flag[k]=ty;
return;
}
int mid=l+r>>;
if(flag[k]!=-) down(k,l,mid,r);
if(opl<=mid) change(k<<,l,mid,opl,opr,ty);
if(opr>mid) change(k<<|,mid+,r,opl,opr,ty);
sum0[k]=sum0[k<<]+sum0[k<<|];
sum1[k]=sum1[k<<]+sum1[k<<|];
} int ask(int k,int l,int r,int pos)
{
if(l==r) return sum1[k];
int mid=l+r>>;
if(flag[k]!=-) down(k,l,mid,r);
if(pos<=mid) return ask(k<<,l,mid,pos);
return ask(k<<|,mid+,r,pos);
} bool check(int mid)
{
MID=mid;
build(,,n);
for(int i=;i<=m;++i)
{
tot0=tot1=;
query(,,n,e[i].l,e[i].r);
if(!e[i].ty)
{
if(tot0) change(,,n,e[i].l,e[i].l+tot0-,);
if(tot1) change(,,n,e[i].r-tot1+,e[i].r,);
}
else
{
if(tot1) change(,,n,e[i].l,e[i].l+tot1-,);
if(tot0) change(,,n,e[i].r-tot0+,e[i].r,);
}
}
return ask(,,n,p);
} int main()
{
read(n); read(m);
for(int i=;i<=n;++i) read(a[i]);
for(int i=;i<=m;++i) read(e[i].ty),read(e[i].l),read(e[i].r);
read(p);
int l=,r=n,mid,ans;
while(l<=r)
{
mid=MID=l+r>>;
if(check(mid)) ans=mid,l=mid+;
else r=mid-;
}
cout<<ans;
}

4552: [Tjoi2016&Heoi2016]排序

Time Limit: 60 Sec  Memory Limit: 256 MB
Submit: 1478  Solved: 748
[Submit][Status][Discuss]

Description

在2016年,佳媛姐姐喜欢上了数字序列。因而他经常研究关于序列的一些奇奇怪怪的问题,现在他在研究一个难题
,需要你来帮助他。这个难题是这样子的:给出一个1到n的全排列,现在对这个全排列序列进行m次局部排序,排
序分为两种:1:(0,l,r)表示将区间[l,r]的数字升序排序2:(1,l,r)表示将区间[l,r]的数字降序排序最后询问第q
位置上的数字。

Input

输入数据的第一行为两个整数n和m。n表示序列的长度,m表示局部排序的次数。1 <= n, m <= 10^5第二行为n个整
数,表示1到n的一个全排列。接下来输入m行,每一行有三个整数op, l, r, op为0代表升序排序,op为1代表降序
排序, l, r 表示排序的区间。最后输入一个整数q,q表示排序完之后询问的位置, 1 <= q <= n。1 <= n <= 10^5
,1 <= m <= 10^5
 

Output

输出数据仅有一行,一个整数,表示按照顺序将全部的部分排序结束后第q位置上的数字。

Sample Input

6 3
1 6 2 5 3 4
0 1 4
1 3 6
0 2 4
3

Sample Output

5

bzoj千题计划128:bzoj4552: [Tjoi2016&Heoi2016]排序的更多相关文章

  1. bzoj千题计划300:bzoj4823: [Cqoi2017]老C的方块

    http://www.lydsy.com/JudgeOnline/problem.php?id=4823 讨厌的形状就是四联通图 且左右各连一个方块 那么破坏所有满足条件的四联通就好了 按上图方式染色 ...

  2. 2018.08.01 BZOJ4552: [Tjoi2016&Heoi2016]排序(二分+线段树)

    传送门 线段树简单题. 二分答案+线段树排序. 实际上就是二分答案mid" role="presentation" style="position: relat ...

  3. bzoj千题计划196:bzoj4826: [Hnoi2017]影魔

    http://www.lydsy.com/JudgeOnline/problem.php?id=4826 吐槽一下bzoj这道题的排版是真丑... 我还是粘洛谷的题面吧... 提供p1的攻击力:i,j ...

  4. bzoj千题计划190:bzoj4300: 绝世好题

    http://www.lydsy.com/JudgeOnline/problem.php?id=4300 f[i] 表示第i位&为1的最长长度 #include<cstdio> # ...

  5. bzoj千题计划121:bzoj1033: [ZJOI2008]杀蚂蚁antbuster

    http://www.lydsy.com/JudgeOnline/problem.php?id=1033 经半个下午+一个晚上+半个晚上 的 昏天黑地调代码 最终成果: codevs.洛谷.tyvj上 ...

  6. bzoj千题计划280:bzoj4592: [Shoi2015]脑洞治疗仪

    http://www.lydsy.com/JudgeOnline/problem.php?id=4592 注意操作1 先挖再补,就是补的范围可以包含挖的范围 SHOI2015 的题 略水啊(逃) #i ...

  7. bzoj千题计划177:bzoj1858: [Scoi2010]序列操作

    http://www.lydsy.com/JudgeOnline/problem.php?id=1858 2018 自己写的第1题,一遍过 ^_^ 元旦快乐 #include<cstdio> ...

  8. bzoj千题计划317:bzoj4650: [Noi2016]优秀的拆分(后缀数组+差分)

    https://www.lydsy.com/JudgeOnline/problem.php?id=4650 如果能够预处理出 suf[i] 以i结尾的形式为AA的子串个数 pre[i] 以i开头的形式 ...

  9. bzoj千题计划168:bzoj3513: [MUTC2013]idiots

    http://www.lydsy.com/JudgeOnline/problem.php?id=3513 组成三角形的条件:a+b>c 其中,a<c,b<c 若已知 两条线段之和=i ...

随机推荐

  1. [APIO2009]会议中心

    [APIO2009]会议中心 题目大意: 原网址与样例戳我! 给定n个区间,询问以下问题: 1.最多能够选择多少个不相交的区间? 2.在第一问的基础上,输出字典序最小的方案. 数据范围:\(n \le ...

  2. 解决Android Studio 3.0导入module依赖后unable to merge index

    解决Android Studio 3.0导入module依赖后unable to merge index 项目需要使用im, 在项目里导入了腾讯im的几个module依赖, 项目无法编译, 报错una ...

  3. kerberos下JAVA代码操作hbase的方式(客户端方式,应用程序方式)

    (一)如果部署JAVA 代码的主机用户获取了kerberos权限情况下 假设主机名是:client su - client 登录主机后 kinit -kt /keytab的路径/client.keyt ...

  4. sqlserver存储过程及临时表在统计中的应用

    use ResourceShare --统计使用情况 alter PROCEDURE StaSheryUse @start datetime, @end datetime, @orgId int AS ...

  5. 接触vsto,开发word插件的利器

    研究word插件有一段时间了,现在该是总结的时候了. 首先咱们来了解下什么是vsto?所谓vsto,就是vs面向office提供的一个开发平台.一个开发平台至少包含两个要素:开发工具(sdk)和运行环 ...

  6. python web开发-flask调试模式

    使用run()方式可以启动flask应用,但是每次修改代码之后,需要重新启动,这样对于调试就很不太方便.Flask的调试模式可以让代码在每次修改之后自动载入. 有两种方法可以启用flask的调试模式 ...

  7. Web开发,浏览器通讯原理及流程那点事,你应该听说下

    题外话: 最近园子里,关于.net门槛的文章风风火火,不过这类事情每过段时间就会出来一次,所以酱油都懒的打了. 当然个人也是有想法的,特别是这两天碰巧和一个三四年经验的java开发者呆在一起,对方说. ...

  8. nicEditors使用方法

    //声明初始化富文本框到context中 <div> <textarea id="context" name="context" style= ...

  9. HDFS基本原理总结

    HDFS由三个基本组件组成:NameNode,SecondaryName,DataNode,其思想类似于Linux的文件系统,可以进行类比. 1.NameNode介绍: 1.管理整个文件系统的命名空间 ...

  10. guava cache使用和源码分析

    guava cache的优点和使用场景,用来判断业务中是否适合使用此缓存 介绍常用的方法,并给出示例,作为使用的参考 深入解读源码. guava简介 guava cache是一个本地缓存.有以下优点: ...