洛谷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]\)的数分别从之前它所属的若干段区间中分离出来,合并. 对于升 ...
随机推荐
- ffmpeg强制使用TCP方式推流到EasyDarwin开源流媒体服务器进行直播
我们的EasyDarwin目前部署在阿里云的服务器上面,运行的效果是非常好的,而且无论是以TCP方式.还是UDP的方式推送,都可以非常好地进行直播转发: 但并不是所有的用户服务器都是阿里云的形式,有很 ...
- 在Eclipse中建立Maven Web项目
一.软件版本 Eclipse Java EE IDE for Web Developers. Version: Neon Release (4.6.0) Maven 3.3.9 Servlet 2.5 ...
- git基本操作---持续更新(2017-08-11)
git 强制push $ git push -u origin master -f 查看本地标签 $ git tag 打标签并添加备注 $ git tag 20170811 -m"图片保存多 ...
- 安装mysql时,提示This application requires .NET framework 4.0问题
Question:双击MySQL的安装文件, 弹框提示, Answer:安装微软的 .NET Framework 4或更新的版本,下载地址:https://www.microsoft.com/zh ...
- EF 编程经验
http://blog.csdn.net/itmaxin/article/details/47662151 这篇文章里有一下东西可以参考,但是弟二个方法明显是不可行的,因为我做了实验直接attach ...
- [IR课程笔记]Page Rank
主要目的: 在网络信息检索中,对每个文档的重要性作出评价. Basic Idea: 如果有许多网页链接到某一个网页,那么这个网页比较重要. 如果某个网页被一个权重较大的网页链接,那么这个网页比较重要. ...
- 常用git命令和工具
0. ln -s src_dir //一个参数即可在当前目录下生成一个软链接 1.git command --clone/push a branch git clone <url ...
- laravel基础课程---3、路由(Laravel中的常见路由有哪几种)
laravel基础课程---3.路由(Laravel中的常见路由有哪几种) 一.总结 一句话总结: 6种:post,get,put,patch,delete,options Route::get($u ...
- match_parent 、 fill_parent 、 wrap_content
1)fill_parent 设置一个构件的布局为fill_parent将强制性地使构件扩展,以填充布局单元内尽可能多的空间.这跟Windows控件的dockstyle属性大体一致. 设置一个顶部布局或 ...
- 002-Fatal error in launcher: Unable to create process using '""
这个问题出在先安装Python3之后再安装python2, 使用pip安装的时候出现的故障 原因是python3的环境变量写入在了用户的环境变量上 但是一旦安装python2之后, Python会把信 ...