洛谷 P2824 [HEOI2016/TJOI2016]排序 解题报告
P2824 [HEOI2016/TJOI2016]排序
题意:
有一个长度为\(n\)的1-n的排列\(m\)次操作
\((0,l,r)\)表示序列从\(l\)到\(r\)降序
\((1,l,r)\)表示序列从\(l\)到\(r\)升序
问最终第\(q\)位的元素
数据范围:
\(n,m<=1e5\)
二分答案神题。
我们发现维护区间排序非常困难,然后最终只是若干修改一次询问。
所以我们可以枚举第\(q\)位的是什么,然后把小于等于它的置0,大于它的置0。
这样的话,我们就可以用支持区间查询和区间覆盖的线段树维护升降序了
进一步的,我们发现第q位的数字满足单调性,于是二分答案
复杂度:\(O(nlog^2n)\)
Code:
#include <cstdio>
#define ls id<<1
#define rs id<<1|1
const int N=30010;
int dat[N<<2],lazy[N<<2],m,n,op[N],opr[N],opl[N],a[N],q;
void build(int id,int l,int r,int M)
{
lazy[id]=-1;
if(l==r)
{
dat[id]=(M<a[l]);
return;
}
int mid=l+r>>1;
build(ls,l,mid,M);
build(rs,mid+1,r,M);
dat[id]=dat[ls]+dat[rs];
}
void push_down(int id,int L,int R)
{
if(lazy[id]==-1) return;
if(L!=R)
{
int mid=L+R>>1;
dat[ls]=(mid+1-L)*lazy[id];
dat[rs]=(R-mid)*lazy[id];
lazy[ls]=lazy[rs]=lazy[id];
}
lazy[id]=-1;
}
void change(int id,int L,int R,int l,int r,int delta)
{
if(l>r) return;
push_down(id,L,R);
if(L==l&&R==r)
{
dat[id]=(r+1-l)*delta;
lazy[id]=delta;
return;
}
int mid=L+R>>1;
if(r<=mid)
change(ls,L,mid,l,r,delta);
else if(l>mid)
change(rs,mid+1,R,l,r,delta);
else
change(ls,L,mid,l,mid,delta),change(rs,mid+1,R,mid+1,r,delta);
dat[id]=dat[ls]+dat[rs];
}
int query(int id,int L,int R,int l,int r)
{
push_down(id,L,R);
if(L==l&&R==r)
return dat[id];
int mid=L+R>>1;
if(r<=mid)
return query(ls,L,mid,l,r);
else if(l>mid)
return query(rs,mid+1,R,l,r);
else
return query(ls,L,mid,l,mid)+query(rs,mid+1,R,mid+1,r);
}
bool check(int d)
{
build(1,1,n,d);
for(int i=1;i<=m;i++)
{
int cn1=query(1,1,n,opl[i],opr[i]);
int cn0=opr[i]+1-opl[i]-cn1;
if(op[i]==0)
{
change(1,1,n,opl[i],opl[i]+cn0-1,0);
change(1,1,n,opl[i]+cn0,opr[i],1);
}
else
{
change(1,1,n,opl[i],opl[i]+cn1-1,1);
change(1,1,n,opl[i]+cn1,opr[i],0);
}
}
return query(1,1,n,q,q);
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%d",a+i);
for(int i=1;i<=m;i++)
scanf("%d%d%d",op+i,opl+i,opr+i);
scanf("%d",&q);
int l=1,r=n;
while(l<r)
{
int mid=l+r>>1;
if(check(mid))
l=mid+1;
else
r=mid;
}
printf("%d\n",l);
return 0;
}
2018.7.19
洛谷 P2824 [HEOI2016/TJOI2016]排序 解题报告的更多相关文章
- 洛谷$P2824\ [HEOI2016/TJOI2016]$ 排序 线段树+二分
正解:线段树+二分 解题报告: 传送门$QwQ$ 昂着题好神噢我$jio$得$QwQQQQQ$,,, 开始看到长得很像之前考试题的亚子,,,然后仔细康康发现不一样昂$kk$,就这里范围是$[1,n]$ ...
- 洛谷 P4091 [HEOI2016/TJOI2016]求和 解题报告
P4091 [HEOI2016/TJOI2016]求和 题目描述 在2016年,佳媛姐姐刚刚学习了第二类斯特林数,非常开心. 现在他想计算这样一个函数的值: \[ f(n)=\sum_{i=0}^n\ ...
- 洛谷 P4093 [HEOI2016/TJOI2016]序列 解题报告
P4093 [HEOI2016/TJOI2016]序列 题目描述 佳媛姐姐过生日的时候,她的小伙伴从某宝上买了一个有趣的玩具送给他.玩具上有一个数列,数列中某些项的值可能会变化,但同一个时刻最多只有一 ...
- [洛谷P2824][HEOI2016/TJOI2016]排序
题目大意:一个全排列,两种操作: 1. $0\;l\;r:$把$[l,r]$升序排序2. $1\;l\;r:$把$[l,r]$降序排序 最后询问第$k$位是什么 题解:二分答案,把比这个数大的赋成$1 ...
- 洛谷P2824 [HEOI2016/TJOI2016]排序(线段树)
传送门 这题的思路好清奇 因为只有一次查询,我们考虑二分这个值为多少 将原序列转化为一个$01$序列,如果原序列上的值大于$mid$则为$1$否则为$0$ 那么排序就可以用线段树优化,设该区间内$1$ ...
- 洛谷 P2824 [HEOI2016/TJOI2016]排序 (线段树合并)
(另外:题解中有一种思路很高妙而且看上去可以适用一些其他情况的离线方法) 线段树合并&复杂度的简单说明:https://blog.csdn.net/zawedx/article/details ...
- [HEOI2016/TJOI2016] 排序 解题报告(二分答案/线段树分裂合并+set)
题目链接: https://www.luogu.org/problemnew/show/P2824 题目描述: 在2016年,佳媛姐姐喜欢上了数字序列.因而他经常研究关于序列的一些奇奇怪怪的问题,现在 ...
- 洛谷 2824 [HEOI2016/TJOI2016]排序
[题意概述] 对一个1到n的排列做m次区间排序,最后询问位置q上面的数. [题解] 区间排序的效率是nlogn,所以暴力做的话效率是mnlogn,显然达不到要求. 我们考虑二分答案.如果某个位置的数比 ...
- 洛谷 P4093 [HEOI2016/TJOI2016]序列 CDQ分治优化DP
洛谷 P4093 [HEOI2016/TJOI2016]序列 CDQ分治优化DP 题目描述 佳媛姐姐过生日的时候,她的小伙伴从某宝上买了一个有趣的玩具送给他. 玩具上有一个数列,数列中某些项的值可能会 ...
随机推荐
- 安装完.net core sdk 后部署 ASP.NET Core 出现错误502.5
将项目升级到和sdk一样的版本 然后 命令行执行 iisreset
- web存储机制(localStorage和sessionStorage)
web存储包括两种:sessionStorage 和 localStorage(都是限定在文档源级别,非同源文档间无法共享) 1.sessionStorage 数据放在服务器上(IE不支持) 严格用于 ...
- dbtool一bug跟踪记
注:这篇日志是好多年前,我还在从兴公司时写的.现在都从从兴公司离职很久了,从兴也没落了,可惜.看了一下,虽然出现了部分代码,但不至于泄漏什么机密,查bug过程的原理也有可以让新手借鉴的地方,就原文照搬 ...
- 虚拟货币——比特币行情价格分析
最近挖以太币的朋友们在关注以太坊行情时,一定会发现以太币的价格对比之前上涨了不少.肯定有部分朋友想了解这次上涨的原因,我们特地为此查询了一番.因为比特币相当于虚拟货币中的黄金,它的价格波动会波及到其他 ...
- 算法笔记(c++)--完全背包问题
算法笔记(c++)--完全背包和多重背包问题 完全背包 完全背包不同于01背包-完全背包里面的东西数量无限 假设现在有5种物品重量为5,4,3,2,1 价值为1,2,3,4,5 背包容量为10 # ...
- Centos7下安装Oracle11g r2
我的centos7是在virtualbox下安装的,安装Oracle安装了好久好久,最开始的时候在网上找的两个文章,按照步骤装,有一篇写着装的时候有灰色的竖线,直接按space键或者鼠标右键close ...
- python format用法详解
#常用方法:print('{0},{1}'.format('zhangk', 32)) print('{},{},{}'.format('zhangk','boy',32)) print('{name ...
- django的htpp请求之WSGIRequest
WSGIRequest对象 Django在接收到http请求之后,会根据http请求携带的参数以及报文信息创建一个WSGIRequest对象,并且作为视图函数第一个参数传给视图函数.这个参数就是dja ...
- Java中的生产者、消费者问题
Java中的生产者.消费者问题描述: 生产者-消费者(producer-consumer)问题, 也称作有界缓冲区(bounded-buffer)问题, 两个进程共享一个公共的固定大小的缓冲区(仓库) ...
- nodepad++ 格式化xml插件
1.用插件管理器安装xmltools插件 2.使用如下菜单格式化xml: 所有插件下载地址: http://sourceforge.net/projects/npp-plugins/files/