BZOJ4552:[HEOI2016/TJOI2016]排序——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=4552
https://www.luogu.org/problemnew/show/P2824
在2016年,佳媛姐姐喜欢上了数字序列。因而他经常研究关于序列的一些奇奇怪怪的问题,现在他在研究一个难题,需要你来帮助他。这个难题是这样子的:给出一个1到n的全排列,现在对这个全排列序列进行m次局部排序,排序分为两种:1:(0,l,r)表示将区间[l,r]的数字升序排序2:(1,l,r)表示将区间[l,r]的数字降序排序最后询问第q位置上的数字。
听说你用桶排过了这道题?
听说这是一道套路题?
(好的啥也不会的我瑟瑟发抖……)
那让我讲一遍套路吧。
当序列变成01序列的时候,利用线段树即可O(logn)局部排序(就是变成了区间查询1的个数,然后左右区间修改为0/1)
我们利用这个性质,二分答案mid,则大于等于mid的数为1,小于的为0,进行排序后看q位置是否为1即可。
正确性很好证,设答案为k,则mid>k时p位置一定为0,否则一定为1.
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef double dl;
const int N=1e5+;
inline int read(){
int X=,w=;char ch=;
while(!isdigit(ch)){w|=ch=='-';ch=getchar();}
while(isdigit(ch))X=(X<<)+(X<<)+(ch^),ch=getchar();
return w?-X:X;
}
struct data{
int op,l,r;
}q[N];
int n,m,p,b[N],c[N];
int tr[N*],lazy[N*];
inline void push(int a,int l,int r){
if(lazy[a]==-)return;
int mid=(l+r)>>;
tr[a<<]=(mid-l+)*lazy[a];tr[a<<|]=(r-mid)*lazy[a];
lazy[a<<]=lazy[a<<|]=lazy[a];
lazy[a]=-;
}
inline void build(int a,int l,int r){
if(l==r){
tr[a]=c[l];
return;
}
int mid=(l+r)>>;
build(a<<,l,mid);build(a<<|,mid+,r);
tr[a]=tr[a<<]+tr[a<<|];
}
inline int query(int a,int l,int r,int l1,int r1){
if(r<l1||r1<l)return ;
if(l1<=l&&r<=r1)return tr[a];
int mid=(l+r)>>;
push(a,l,r);
return query(a<<,l,mid,l1,r1)+query(a<<|,mid+,r,l1,r1);
}
inline void modify(int a,int l,int r,int l1,int r1,int w){
if(r<l1||r1<l)return;
if(l1<=l&&r<=r1){
tr[a]=(r-l+)*w;
lazy[a]=w;
return;
}
int mid=(l+r)>>;
push(a,l,r);
modify(a<<,l,mid,l1,r1,w);modify(a<<|,mid+,r,l1,r1,w);
tr[a]=tr[a<<]+tr[a<<|];
}
bool check(int k){
memset(lazy,-,sizeof(lazy));
for(int i=;i<=n;i++)
if(b[i]>=k)c[i]=;
else c[i]=;
build(,,n);
for(int i=;i<=m;i++){
int l=q[i].l,r=q[i].r;
int cnt=query(,,n,l,r);
if(!q[i].op){
modify(,,n,l,r-cnt,);
modify(,,n,r-cnt+,r,);
}else{
modify(,,n,l,l+cnt-,);
modify(,,n,l+cnt,r,);
}
}
return query(,,n,p,p);
}
int main(){
n=read(),m=read();
for(int i=;i<=n;i++)b[i]=read();
for(int i=;i<=m;i++){
q[i].op=read(),q[i].l=read(),q[i].r=read();
}
p=read();
int l=,r=n;
while(l<r){
int mid=(l+r+)>>;
if(check(mid))l=mid;
else r=mid-;
}
printf("%d\n",l);
return ;
}
+++++++++++++++++++++++++++++++++++++++++++
+本文作者:luyouqi233。 +
+欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/ +
+++++++++++++++++++++++++++++++++++++++++++
BZOJ4552:[HEOI2016/TJOI2016]排序——题解的更多相关文章
- BZOJ4552 HEOI2016/TJOI2016排序(线段树合并+线段树分裂)
很久以前写过二分答案离线的做法,比较好理解.事实上这还是一个线段树合并+分裂的板子题,相比离线做法以更优的复杂度做了更多的事情.具体不说了.怎么交了一遍luogu上就跑第一了啊 #include< ...
- [HEOI2016/TJOI2016]排序 线段树+二分
[HEOI2016/TJOI2016]排序 内存限制:256 MiB 时间限制:6000 ms 标准输入输出 题目类型:传统 评测方式:文本比较 题目描述 在2016年,佳媛姐姐喜欢上了数字序列.因而 ...
- 洛谷 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得起飞. 注意一点:我们只需要 ...
- 2021.12.09 [HEOI2016/TJOI2016]排序(线段树+二分,把一个序列转换为01串)
2021.12.09 [HEOI2016/TJOI2016]排序(线段树+二分,把一个序列转换为01串) https://www.luogu.com.cn/problem/P2824 题意: 在 20 ...
- [HEOI2016&TJOI2016] 排序(线段树)
4552: [Tjoi2016&Heoi2016]排序 Time Limit: 60 Sec Memory Limit: 256 MBSubmit: 2703 Solved: 1386[S ...
- [HEOI2016/TJOI2016]排序
嘟嘟嘟 首先这题的暴力是十分好写的,而且据说能得不少分. 正解写起来不难,就是不太好想. 根据做题经验,我想到了给这个序列转化成01序列,但是接下来我就不会了.还是看了题解. 因为查询只有一个数,所以 ...
- [洛谷P2824][HEOI2016/TJOI2016]排序
题目大意:一个全排列,两种操作: 1. $0\;l\;r:$把$[l,r]$升序排序2. $1\;l\;r:$把$[l,r]$降序排序 最后询问第$k$位是什么 题解:二分答案,把比这个数大的赋成$1 ...
- 洛谷 P2824 [HEOI2016/TJOI2016]排序 (线段树合并)
(另外:题解中有一种思路很高妙而且看上去可以适用一些其他情况的离线方法) 线段树合并&复杂度的简单说明:https://blog.csdn.net/zawedx/article/details ...
随机推荐
- mysql c 获取error_code
#include <stdio.h> #include <mysql.h> int main(int argc, char **argv) { MYSQL *con = mys ...
- http性能测试点滴
WeTest 导读 在服务上线之前,性能测试必不可少.本文主要介绍性能测试的流程,需要关注的指标,性能测试工具apache bench的使用,以及常见的坑. 什么是性能测试 性能测试是通过自动化的测试 ...
- Fiddler使用总结(二)
在上一篇中介绍了Fiddler的基本使用方法.通过上一篇的操作我们可以直接抓取浏览器的数据包.但在APP测试中,我们需要抓取手机APP上的数据包,应该怎么操作呢? Andriod配置方法: .确保手机 ...
- 第六模块:WEB框架开发 第1章·Django框架开发50~87
51-表关系之一对多 52-表关系之多对多 53-表关系之一对一 54-数据库表关系之关联字段与外键约束 55-数据库表关系之sql创建关联表 56-ORM生成关联表模型 57-多表操作之一对多添加记 ...
- 浅谈如何写出一个让(坑)人(王)很(之)难(王)发现的bug
该文章内容来自脚本之家,原文链接:https://www.jb51.net/news/598404.html 程序员的日常三件事:写bug.改bug.背锅.连程序员都自我调侃道,为什么每天都在加班?因 ...
- 【20180808模拟测试】T2 k-斐波那契
描述 k-斐波拉契数列是这样的 f(0)=k;f(1)=k;f(n)=(f(n-1)+f(n-2))%P(n>=2); 现在我们已经知道了f(n)=1,和P: k的范围是[1,P); 求k的所有 ...
- FPGA学习-PS2接口
选自http://m.elecfans.com/article/774143.html
- 持续集成之TeamCity 配置
xcopy /S /Y CodeFirstDemo\CodefirstDemo.Web D:\publish\welcome\Web
- dice2win
触发交易 转0个 https://etherscan.io/tx/0x784e80167353a886183106cbe3bd15e614cafdb5d6885ccd101177aa0f937a36 ...
- SpringCloud IDEA 教学 (四) 断路器(Hystrix)
写在开始 在SpringCloud项目中,服务之间相互调用(RPC Remote Procedure Call —远程过程调用),处于调用链路底层的服务产生不可用情况时,请求会产生堆积使得服务器线程阻 ...