洛谷P2824 [HEOI2016/TJOI2016]排序(线段树)
这题的思路好清奇
因为只有一次查询,我们考虑二分这个值为多少
将原序列转化为一个$01$序列,如果原序列上的值大于$mid$则为$1$否则为$0$
那么排序就可以用线段树优化,设该区间内$1$的个数为$res$,如果是升序排序,只要把$[r-res+1,r]$区间全部变为$1$,$[l,r-res]$区间全部变为$0$即可,用线段树区间覆盖即可
那么只要最后查询$k$的位置上是否是$1$,如果是的话$ans=mid,l=mid+1$,否则$r=mid-1$
考虑为什么能这样二分。我们经过这样之后,如果最后位置$k$上为$1$,那么这肯定是一个大于等于$mid$的数,否则肯定是一个小于$mid$的数
然后差不多了
//minamoto
#include<iostream>
#include<cstdio>
using namespace std;
#define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
char buf[<<],*p1=buf,*p2=buf;
inline int read(){
#define num ch-'0'
char ch;bool flag=;int res;
while(!isdigit(ch=getc()))
(ch=='-')&&(flag=true);
for(res=num;isdigit(ch=getc());res=res*+num);
(flag)&&(res=-res);
#undef num
return res;
}
const int N=;
struct Q{
int op,l,r;
Q(){}
Q(int op,int l,int r):op(op),l(l),r(r){}
}q[N];
int n,m,st[N],val[N],tag[N<<],sum[N<<],k;
inline void upd(int p){sum[p]=sum[p<<]+sum[p<<|];}
inline void pd(int p,int l,int r){
if(~tag[p]){
tag[p<<]=tag[p<<|]=tag[p];
sum[p<<]=tag[p]*l,sum[p<<|]=tag[p]*r;
tag[p]=-;
}
}
void build(int p,int l,int r){
tag[p]=-;
if(l==r) return (void)(sum[p]=st[l]);
int mid=(l+r)>>;
build(p<<,l,mid),build(p<<|,mid+,r);
upd(p);
}
void update(int p,int l,int r,int ql,int qr,int val){
if(ql<=l&&qr>=r) return (void)(sum[p]=val*(r-l+),tag[p]=val);
int mid=(l+r)>>;
pd(p,mid-l+,r-mid);
if(ql<=mid) update(p<<,l,mid,ql,qr,val);
if(qr>mid) update(p<<|,mid+,r,ql,qr,val);
upd(p);
}
int query(int p,int l,int r,int ql,int qr){
if(ql<=l&&qr>=r) return sum[p];
int mid=(l+r)>>;
pd(p,mid-l+,r-mid);
int res=;
if(ql<=mid) res+=query(p<<,l,mid,ql,qr);
if(qr>mid) res+=query(p<<|,mid+,r,ql,qr);
return res;
}
int check(int mid){
for(int i=;i<=n;++i)
st[i]=val[i]>=mid?:;
build(,,n);
for(int i=;i<=m;++i){
int l=q[i].l,r=q[i].r;
if(q[i].op==){
int res=query(,,n,l,r);
update(,,n,r-res+,r,);
update(,,n,l,r-res,);
}else{
int res=query(,,n,l,r);
update(,,n,l,l+res-,);
update(,,n,l+res,r,);
}
}
return query(,,n,k,k);
}
int main(){
// freopen("testdata.in","r",stdin);
n=read(),m=read();
for(int i=;i<=n;++i) val[i]=read();
for(int i=,op,l,r;i<=m;++i)
op=read(),l=read(),r=read(),q[i]=Q(op,l,r);
k=read();
int l=,r=n,ans=;
while(l<=r){
int mid=(l+r)>>;
if(check(mid)) l=mid+,ans=mid;else r=mid-;
}
printf("%d\n",ans);
return ;
}
洛谷P2824 [HEOI2016/TJOI2016]排序(线段树)的更多相关文章
- 洛谷$P2824\ [HEOI2016/TJOI2016]$ 排序 线段树+二分
正解:线段树+二分 解题报告: 传送门$QwQ$ 昂着题好神噢我$jio$得$QwQQQQQ$,,, 开始看到长得很像之前考试题的亚子,,,然后仔细康康发现不一样昂$kk$,就这里范围是$[1,n]$ ...
- 洛谷 P2824 [HEOI2016/TJOI2016]排序 解题报告
P2824 [HEOI2016/TJOI2016]排序 题意: 有一个长度为\(n\)的1-n的排列\(m\)次操作 \((0,l,r)\)表示序列从\(l\)到\(r\)降序 \((1,l,r)\) ...
- [Luogu P2824] [HEOI2016/TJOI2016]排序 (线段树+二分答案)
题面 传送门:https://www.luogu.org/problemnew/show/P2824 Solution 这题极其巧妙. 首先,如果直接做m次排序,显然会T得起飞. 注意一点:我们只需要 ...
- 洛谷 P2824 [HEOI2016/TJOI2016]排序 (线段树合并)
(另外:题解中有一种思路很高妙而且看上去可以适用一些其他情况的离线方法) 线段树合并&复杂度的简单说明:https://blog.csdn.net/zawedx/article/details ...
- [洛谷P2824][HEOI2016/TJOI2016]排序
题目大意:一个全排列,两种操作: 1. $0\;l\;r:$把$[l,r]$升序排序2. $1\;l\;r:$把$[l,r]$降序排序 最后询问第$k$位是什么 题解:二分答案,把比这个数大的赋成$1 ...
- Luogu P2824 [HEOI2016/TJOI2016]排序 线段树+脑子
只会两个$log$的$qwq$ 我们二分答案:设答案为$ans$,则我们把$a[i]<=ans$全部设成$0$,把$a[i]>ans$全部设成$1$,扔到线段树里,这样区间排序(升序)就是 ...
- day 1 晚上 P2824 [HEOI2016/TJOI2016]排序 线段树
#include<iostream> #include<cstdio> #include<cstdlib> #include<cmath> #inclu ...
- [HEOI2016/TJOI2016]排序 线段树+二分
[HEOI2016/TJOI2016]排序 内存限制:256 MiB 时间限制:6000 ms 标准输入输出 题目类型:传统 评测方式:文本比较 题目描述 在2016年,佳媛姐姐喜欢上了数字序列.因而 ...
- BZOJ.4552.[HEOI2016/TJOI2016]排序(线段树合并/二分 线段树)
题目链接 对于序列上每一段连续区间的数我们都可以动态开点建一棵值域线段树.初始时就是\(n\)棵. 对于每次操作,我们可以将\([l,r]\)的数分别从之前它所属的若干段区间中分离出来,合并. 对于升 ...
随机推荐
- UML类图关系表示方法
本文转载: http://blog.csdn.net/fengsh998/article/details/8105631 分类: UML2012-10-24 10:18 1175人阅读 评论(0) 收 ...
- kbmmw 5 的日志备份功能简介
kbmmw 自从4.8.2 版本里增加了日志管理以后,随着版本升级,增加了很多功能,使用方法也有所改变. 功能也越来越强大. 今天说一下 kbmmw5 里面的日志备份,顺便演示一下新的使用方法. 我们 ...
- EasyDarwin开源流媒体服务器如何实现按需推送直播的
--本文转自EasyDarwin开源团队成员邵帅的博客:http://blog.csdn.net/ss00_2012/article/details/51441753 我们使用EasyDarwin的推 ...
- spring 过滤器简介
spring 过滤器简介 过滤器放在容器结构的什么位置 过滤器放在web资源之前,可以在请求抵达它所应用的web资源(可以是一个Servlet.一个Jsp页面,甚至是一个HTML页面)之前截获进入的请 ...
- cocos2d-js v3新特性
1.游戏对象 使用cc.game单例代替了原有的cc.Application以及cc.AppControl 2.属性风格API 旧的API ...
- Refusing to install package with name “XXXX”
我的执行步骤 我创建了一个名叫express的文件夹,想在这个工程中学习express 进入该文件夹,执行npm init来初始化package.json文件,一直回车. 我们会发现当前文件夹多了一个 ...
- Linux常用命令——持续更新(2018-05-09)
此命令默认是在centos环境下执行,除非特殊标明. 1.查看ip: ifconfig 2.创建指定用户并分配到某个组:创建用户user并分配到root组 useradd -g root user 3 ...
- Cocos2d-x之CCMenu理解
Menu创建菜单: Cocos2d-x下的菜单创建包括: 1.CCMenuItemFont 字体按钮创建 CCMenuItemFont * onlineVideo = MenuItemFont: ...
- selenium使用笔记(一)——selenium你该知道的
有时候在交流群里经常会看到这样的问题,selenium能进行性能测试吗?selenium1和selenium2有什么区别等等问题,在这里谈一下自己学习和工作以后对selenium的认识.我所记录的东西 ...
- zkui部署
1.拉取代码 #git clone https://github.com/DeemOpen/zkui.git 2.构建并安装程序 #cd zkui/ #yum install -y maven #mv ...