[洛谷P2824][HEOI2016/TJOI2016]排序
题目大意:一个全排列,两种操作:
1. $0\;l\;r:$把$[l,r]$升序排序
2. $1\;l\;r:$把$[l,r]$降序排序
最后询问第$k$位是什么
题解:二分答案,把比这个数大的赋成$1$,否则为$0$,线段树区间和和区间赋$01$,最后判断第$k$位是$0$是$1$,若为$1$则还可以变大,否则变小
卡点:修改后没有$update$
C++ Code:
#include <cstdio>
#include <cctype>
namespace __R {
int x, ch;
inline int read() {
ch = getchar();
while (isspace(ch)) ch = getchar();
for (x = ch & 15, ch = getchar(); isdigit(ch); ch = getchar()) x = x * 10 + (ch & 15);
return x;
}
}
using __R::read; #define maxn 100010 int n, m, q;
int s[maxn], op[maxn], L[maxn], R[maxn];
namespace SgT {
int V[maxn << 2], tg[maxn << 2];
int num, L, R; void build(int rt, int l, int r) {
tg[rt] = -1;
if (l == r) {
V[rt] = s[l] > num;
return ;
}
int mid = l + r >> 1;
build(rt << 1, l, mid);
build(rt << 1 | 1, mid + 1, r);
V[rt] = V[rt << 1] + V[rt << 1 | 1];
}
void build(int __num) {
num = __num;
build(1, 1, n);
} inline void pushdown(int rt, int len) {
int &__tg = tg[rt];
V[rt << 1] = (len + 1 >> 1) * __tg;
tg[rt << 1] = __tg;
V[rt << 1 | 1] = (len >> 1) * __tg;
tg[rt << 1 | 1] = __tg;
__tg = -1;
}
int __query(int rt, int l, int r) {
if (L <= l && R >= r) return V[rt];
int mid = l + r >> 1, ans = 0;
if (~tg[rt]) pushdown(rt, r - l + 1);
if (L <= mid) ans = __query(rt << 1, l, mid);
if (R > mid) ans += __query(rt << 1 | 1, mid + 1, r);
return ans;
}
int query(int __L, int __R) {
L = __L, R = __R;
return __query(1, 1, n);
} void __modify(int rt, int l, int r) {
if (L <= l && R >= r) {
V[rt] = num * (r - l + 1);
tg[rt] = num;
return ;
}
int mid = l + r >> 1;
if (~tg[rt]) pushdown(rt, r - l + 1);
if (L <= mid) __modify(rt << 1, l, mid);
if (R > mid) __modify(rt << 1 | 1, mid + 1, r);
V[rt] = V[rt << 1] + V[rt << 1 | 1];
}
void modify(int __L, int __R, int __num) {
L = __L, R = __R, num = __num;
__modify(1, 1, n);
}
} bool check(int mid) {
SgT::build(mid);
for (int i = 1; i <= m; i++) {
int _1 = SgT::query(L[i], R[i]), _0 = R[i] - L[i] + 1 - _1;
if (op[i]) {
SgT::modify(L[i], L[i] + _1 - 1, 1);
SgT::modify(L[i] + _1, R[i], 0);
} else {
SgT::modify(L[i], L[i] + _0 - 1, 0);
SgT::modify(L[i] + _0, R[i], 1);
}
}
return SgT::query(q, q);
} int main() {
n = read(), m = read();
for (int i = 1; i <= n; i++) s[i] = read();
for (int i = 1; i <= m; i++) {
op[i] = read(), L[i] = read(), R[i] = read();
}
q = read();
int l = 1, r = n, ans = 1;
while (l <= r) {
int mid = l + r >> 1;
if (check(mid)) l = mid + 1;
else {
r = mid - 1;
ans = mid;
}
}
printf("%d\n", ans);
return 0;
}
[洛谷P2824][HEOI2016/TJOI2016]排序的更多相关文章
- 洛谷 P2824 [HEOI2016/TJOI2016]排序 解题报告
P2824 [HEOI2016/TJOI2016]排序 题意: 有一个长度为\(n\)的1-n的排列\(m\)次操作 \((0,l,r)\)表示序列从\(l\)到\(r\)降序 \((1,l,r)\) ...
- 洛谷P2824 [HEOI2016/TJOI2016]排序(线段树)
传送门 这题的思路好清奇 因为只有一次查询,我们考虑二分这个值为多少 将原序列转化为一个$01$序列,如果原序列上的值大于$mid$则为$1$否则为$0$ 那么排序就可以用线段树优化,设该区间内$1$ ...
- 洛谷 P2824 [HEOI2016/TJOI2016]排序 (线段树合并)
(另外:题解中有一种思路很高妙而且看上去可以适用一些其他情况的离线方法) 线段树合并&复杂度的简单说明:https://blog.csdn.net/zawedx/article/details ...
- 洛谷$P2824\ [HEOI2016/TJOI2016]$ 排序 线段树+二分
正解:线段树+二分 解题报告: 传送门$QwQ$ 昂着题好神噢我$jio$得$QwQQQQQ$,,, 开始看到长得很像之前考试题的亚子,,,然后仔细康康发现不一样昂$kk$,就这里范围是$[1,n]$ ...
- 洛谷 2824 [HEOI2016/TJOI2016]排序
[题意概述] 对一个1到n的排列做m次区间排序,最后询问位置q上面的数. [题解] 区间排序的效率是nlogn,所以暴力做的话效率是mnlogn,显然达不到要求. 我们考虑二分答案.如果某个位置的数比 ...
- 洛谷 P4093 [HEOI2016/TJOI2016]序列 CDQ分治优化DP
洛谷 P4093 [HEOI2016/TJOI2016]序列 CDQ分治优化DP 题目描述 佳媛姐姐过生日的时候,她的小伙伴从某宝上买了一个有趣的玩具送给他. 玩具上有一个数列,数列中某些项的值可能会 ...
- [Luogu P2824] [HEOI2016/TJOI2016]排序 (线段树+二分答案)
题面 传送门:https://www.luogu.org/problemnew/show/P2824 Solution 这题极其巧妙. 首先,如果直接做m次排序,显然会T得起飞. 注意一点:我们只需要 ...
- BZOJ4553/洛谷P4093 [HEOI2016/TJOI2016]序列 动态规划 分治
原文链接http://www.cnblogs.com/zhouzhendong/p/8672434.html 题目传送门 - BZOJ4553 题目传送门 - 洛谷P4093 题解 设$Li$表示第$ ...
- 洛谷 P4091 [HEOI2016/TJOI2016]求和 解题报告
P4091 [HEOI2016/TJOI2016]求和 题目描述 在2016年,佳媛姐姐刚刚学习了第二类斯特林数,非常开心. 现在他想计算这样一个函数的值: \[ f(n)=\sum_{i=0}^n\ ...
随机推荐
- Scrapy框架的基本使用
安装 pip install scrapy 基础使用 1. 创建一个工程:scrapy startproject 2. 在工程目录下创建一个爬虫文件 cd 工程 scrapy genspider 爬虫 ...
- 【Hadoop】配置环境-伪分布式
目录 1.Linux设置静态IP地址 2.修改主机名和映射文件 3.SSH免密码配置 4.Linux系统JDK的安装和配置 5.Hadoop伪分布式配置和测试 1.Linux设置静态IP地址 1.在L ...
- Kubernetes-Envoy(一种全新的Ingress实现方式)
Ingress 在讲Envoy之前,先介绍一下Kubernetes中Service的表现形式为IP:Port,及工作在Ingress:TCP/IP层.而对于基于HTTP的服务来说,不同的URL地址经常 ...
- (数据科学学习手札19)R中基本统计分析技巧总结
在获取数据,并且完成数据的清洗之后,首要的事就是对整个数据集进行探索性的研究,这个过程中会利用到各种描述性统计量和推断性统计量来初探变量间和变量内部的基本关系,本篇笔者便基于R,对一些常用的数据探索方 ...
- linux c fprintf()
#include<stdio.h> #include<unistd.h> #include<time.h> int main(int argc,char *argv ...
- struts2官方 中文教程 系列六:表单验证
先贴个本帖的地址,以免被爬:struts2教程 官方系列六:表单验证 即 http://www.cnblogs.com/linghaoxinpian/p/6906720.html 下载本章节代码 介 ...
- Mysql 启动运行
MYSQL默认端口:3306用户: root 也可自己添加用户启动数据库服务名: MYSQL (在安装的时候会设置) 在开始菜单栏->附件->右键命令提示符->以管理员身份运行: ...
- 云计算之路-阿里云上:基于Xen的IO模型进一步分析“黑色0.1秒”问题
在发现云服务器读取OCS缓存的“黑色0.1秒”是发生在socket读取数据时,而且是发生在读取开始的字节,甚至在socket写数据时(比如写入缓存key)也会出现超过50ms的情况,我们的好奇心被激发 ...
- 「日常训练」「小专题·图论」Domino Effect(1-5)
题意 分析 这题几乎就是一条dijkstra的问题.但是,如何考虑倒在中间? 要意识到这题求什么:单源最短路的最大值.那么有没有更大的?倒在中间有可能会使它更大. 但是要注意一个问题:不要把不存在的边 ...
- [OpenCV]DMatch类和KeyPoints类:特征点匹配
DMatch struct CV_EXPORTS_W_SIMPLE DMatch { CV_WRAP DMatch() : queryIdx(-), trainIdx(-), imgIdx(-), d ...