【HEOI2016】排序
题面
题解
这题好神仙啊。。。
我们二分这个位置上的数,
然后当\(val[i] \geq mid\)的位置设为\(1\),否则为\(0\)
这样一来,这道题就变成了一个\(01\)序列排序,所以就可以用线段树实现\(log_2n\)排序(区间和以及区间覆盖)
由于这个数列是\(1-n\)的全排列,所以二分出的结果就是答案。
代码
#include<cstdio>
#include<cstring>
#include<algorithm>
#define RG register
#define file(x) freopen(#x".in", "r", stdin);freopen(#x".out", "w", stdout);
inline int read()
{
int data = 0, w = 1;
char ch = getchar();
while(ch != '-' && (ch < '0' || ch > '9')) ch = getchar();
if(ch == '-') w = -1, ch = getchar();
while(ch >= '0' && ch <= '9') data = data * 10 + (ch ^ 48), ch = getchar();
return data * w;
}
const int maxn(1e5 + 10);
int n, m, q, tree[maxn << 2], lazy[maxn << 2], a[maxn], opt[maxn], L[maxn], R[maxn];
#define son(i) ((root << 1) | (i))
inline void build(int x, int root = 1, int l = 1, int r = n)
{
lazy[root] = 0;
if(l == r) { tree[root] = (a[l] >= x); return; }
int mid = (l + r) >> 1;
build(x, son(0), l, mid);
build(x, son(1), mid + 1, r);
tree[root] = tree[son(0)] + tree[son(1)];
}
inline void pushdown(int root, int l, int r, int mid)
{
if(l == r) lazy[root] = 0;
if(!lazy[root]) return;
lazy[son(0)] = lazy[son(1)] = lazy[root];
if(lazy[root] == 1) tree[son(0)] = mid - l + 1, tree[son(1)] = r - mid;
else tree[son(0)] = tree[son(1)] = 0;
lazy[root] = 0;
}
inline void update(int ql, int qr, int val, int root = 1, int l = 1, int r = n)
{
if(qr < l || r < ql) return;
if(ql <= l && r <= qr) { tree[root] = val * (r - l + 1); lazy[root] = val ? 1 : -1; return; }
int mid = (l + r) >> 1; pushdown(root, l, r, mid);
update(ql, qr, val, son(0), l, mid);
update(ql, qr, val, son(1), mid + 1, r);
tree[root] = tree[son(0)] + tree[son(1)];
}
inline int query(int ql, int qr, int root = 1, int l = 1, int r = n)
{
if(qr < l || r < ql) return 0;
if(ql <= l && r <= qr) return tree[root];
int mid = (l + r) >> 1; pushdown(root, l, r, mid);
return query(ql, qr, son(0), l, mid) + query(ql, qr, son(1), mid + 1, r);
}
inline bool check(int mid)
{
build(mid);
for(RG int i = 1; i <= m; i++)
{
int cnt = query(L[i], R[i]);
if(!opt[i])
update(R[i] - cnt + 1, R[i], 1),
update(L[i], R[i] - cnt, 0);
else
update(L[i], L[i] + cnt - 1, 1),
update(L[i] + cnt, R[i], 0);
}
return query(q, q);
}
int main()
{
#ifndef ONLINE_JUDGE
file(cpp);
#endif
n = read(); m = read();
for(RG int i = 1; i <= n; i++) a[i] = read();
for(RG int i = 1; i <= m; i++) opt[i] = read(), L[i] = read(), R[i] = read();
q = read(); int ans = 0;
for(RG int l = 1, r = n, mid; l <= r;)
{
mid = (l + r) >> 1;
if(check(mid)) ans = mid, l = mid + 1;
else r = mid - 1;
}
printf("%d\n", ans);
return 0;
}
【HEOI2016】排序的更多相关文章
- BZOJ 4552: [Tjoi2016&Heoi2016]排序
4552: [Tjoi2016&Heoi2016]排序 Time Limit: 60 Sec Memory Limit: 256 MBSubmit: 579 Solved: 322[Sub ...
- bzoj千题计划128:bzoj4552: [Tjoi2016&Heoi2016]排序
http://www.lydsy.com/JudgeOnline/problem.php?id=4552 二分答案 把>=mid 的数看做1,<mid 的数看做0 这样升序.降序排列相当于 ...
- [Tjoi2016&Heoi2016]排序[01序列]
4552: [Tjoi2016&Heoi2016]排序 Time Limit: 60 Sec Memory Limit: 256 MBSubmit: 994 Solved: 546[Sub ...
- 4552: [Tjoi2016&Heoi2016]排序
4552: [Tjoi2016&Heoi2016]排序 链接 分析: 因为只询问一次,所以考虑二分这个数.显然是没有单调性的,但是我们可以二分所有大于等于mid的数中,是否有满足条件的x(而不 ...
- 【BZOJ4552】[Tjoi2016&Heoi2016]排序 二分+线段树
[BZOJ4552][Tjoi2016&Heoi2016]排序 Description 在2016年,佳媛姐姐喜欢上了数字序列.因而他经常研究关于序列的一些奇奇怪怪的问题,现在他在研究一个难题 ...
- [bzoj4552][Tjoi2016][Heoi2016]排序
Description 给出一个$1$到$n$的全排列,现在对这个全排列序列进行$m$次局部排序,排序分为$2$种: $1.(0,l,r)$表示将区间$[l,r]$的数字升序排序; $2.(1,l,r ...
- BZOJ4552: [Tjoi2016&Heoi2016]排序
Description 在2016年,佳媛姐姐喜欢上了数字序列.因而他经常研究关于序列的一些奇奇怪怪的问题,现在他在研究一个难题 ,需要你来帮助他.这个难题是这样子的:给出一个1到n的全排列,现在对这 ...
- [bzoj4552][Tjoi2016&Heoi2016]排序-二分+线段树
Brief Description DZY有一个数列a[1..n],它是1∼n这n个正整数的一个排列. 现在他想支持两种操作: 0, l, r: 将a[l..r]原地升序排序. 1, l, r: 将a ...
- [HEOI2016]排序
题目描述 在2016年,佳媛姐姐喜欢上了数字序列.因而他经常研究关于序列的一些奇奇怪怪的问题,现在他在研究一个难题,需要你来帮助他.这个难题是这样子 的:给出一个1到n的全排列,现在对这个全排列序列进 ...
- bzoj 4552 [Tjoi2016&Heoi2016]排序 (二分答案 线段树)
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=4552 题意: 给你一个1-n的全排列,m次操作,操作由两种:1.将[l,r]升序排序,2 ...
随机推荐
- Pygame播放声音与音效
简单学习自小甲鱼视频教学(笔记) 实现功能: 运行后自动播放背景音乐,单击左键播放音效①,单击右键播放音效②, 空格键控制暂停背景音乐与恢复背景音乐,并且实现播放图标的切换. 代码如下: import ...
- programming-languages学习笔记--第4部分
programming-languages学习笔记–第4部分 */--> pre.src {background-color: #292b2e; color: #b2b2b2;} program ...
- 《metasploit渗透测试魔鬼训练营》学习笔记第四章—web应用渗透
继续来学习metasploit...记好笔记是很重要的,下面开始正文: 二.WEB应用渗透技术 1.WEB应用渗透基础知识 先介绍WEB应用攻击的主要类型(大致介绍,具体请自行查 ...
- istringstream和ostringstream的实现
ostringstream是将数据写入string里边的,istringstream是将从string里边读出数据的: #include <sstream> int main() { st ...
- 关于CUDA5之后cutil.h不可用的问题
用CUDA进行GPU加速开发的同学在移植一些代码片段时应该都有过这样的经历,如果自己用的是高版本的CUDA,系统有时会报错:CANNOT FIND CUTIL.H.查看代码才发现原来是多了CUTIL. ...
- Jmeter--thrift接口压测,调用jar包失败报错:java.lang.NoSuchMethodError:
调用thrift接口压测的jar包,出现了错误:java.lang.NoSuchMethodError: 错误可能的原因: 有这个类,该类真的没有这个方法 有这个类,而且有好几个,他们之间发生了冲突 ...
- 跟我一起学Linux-线程创建,类似FreeRTOS创建任务
1.参考学习大神网址:http://blog.csdn.net/ithomer/article/details/6063067 #include<stdio.h> #include< ...
- Xcode 控制台打印Unicode字符串转换为中文
在Xcode的控制台里直接打印一个数组或者字典,输出的都是一些Unicode的编码,不方便调试. 要想看到中文,则要去获取对应的key或者数组下标.得到具体某一个对象才能看到中文,给我们调试起来 ...
- 关于DP
关于DP 似乎摸到了门槛呢,学着学着Dijkstra突然有了感觉. 我们遍历的时候会遍历整张图的每个点每条边,然后与已知的对比大小,如果比现在方案好,就放入数组 那么,DP岂不是同样的思想? 在背包问 ...
- NOIP2018 Day2毒瘤题目
Day2毒瘤题目 T1:travel 拿到题目,一看,图论,完了...... 仔细看了看题目,诶这个不是dfs序么?当场敲出dfs.跑样例一,过了,结果一跑样例二,当场废掉.(样例二有环,会跑不出正解 ...