题面

题解

这题好神仙啊。。。

我们二分这个位置上的数,

然后当\(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】排序的更多相关文章

  1. BZOJ 4552: [Tjoi2016&Heoi2016]排序

    4552: [Tjoi2016&Heoi2016]排序 Time Limit: 60 Sec  Memory Limit: 256 MBSubmit: 579  Solved: 322[Sub ...

  2. bzoj千题计划128:bzoj4552: [Tjoi2016&Heoi2016]排序

    http://www.lydsy.com/JudgeOnline/problem.php?id=4552 二分答案 把>=mid 的数看做1,<mid 的数看做0 这样升序.降序排列相当于 ...

  3. [Tjoi2016&Heoi2016]排序[01序列]

    4552: [Tjoi2016&Heoi2016]排序 Time Limit: 60 Sec  Memory Limit: 256 MBSubmit: 994  Solved: 546[Sub ...

  4. 4552: [Tjoi2016&Heoi2016]排序

    4552: [Tjoi2016&Heoi2016]排序 链接 分析: 因为只询问一次,所以考虑二分这个数.显然是没有单调性的,但是我们可以二分所有大于等于mid的数中,是否有满足条件的x(而不 ...

  5. 【BZOJ4552】[Tjoi2016&Heoi2016]排序 二分+线段树

    [BZOJ4552][Tjoi2016&Heoi2016]排序 Description 在2016年,佳媛姐姐喜欢上了数字序列.因而他经常研究关于序列的一些奇奇怪怪的问题,现在他在研究一个难题 ...

  6. [bzoj4552][Tjoi2016][Heoi2016]排序

    Description 给出一个$1$到$n$的全排列,现在对这个全排列序列进行$m$次局部排序,排序分为$2$种: $1.(0,l,r)$表示将区间$[l,r]$的数字升序排序; $2.(1,l,r ...

  7. BZOJ4552: [Tjoi2016&Heoi2016]排序

    Description 在2016年,佳媛姐姐喜欢上了数字序列.因而他经常研究关于序列的一些奇奇怪怪的问题,现在他在研究一个难题 ,需要你来帮助他.这个难题是这样子的:给出一个1到n的全排列,现在对这 ...

  8. [bzoj4552][Tjoi2016&Heoi2016]排序-二分+线段树

    Brief Description DZY有一个数列a[1..n],它是1∼n这n个正整数的一个排列. 现在他想支持两种操作: 0, l, r: 将a[l..r]原地升序排序. 1, l, r: 将a ...

  9. [HEOI2016]排序

    题目描述 在2016年,佳媛姐姐喜欢上了数字序列.因而他经常研究关于序列的一些奇奇怪怪的问题,现在他在研究一个难题,需要你来帮助他.这个难题是这样子 的:给出一个1到n的全排列,现在对这个全排列序列进 ...

  10. bzoj 4552 [Tjoi2016&Heoi2016]排序 (二分答案 线段树)

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=4552 题意: 给你一个1-n的全排列,m次操作,操作由两种:1.将[l,r]升序排序,2 ...

随机推荐

  1. JavaScript浏览器对象模型(BOM)之history对象

    history 对象是 window 对象的属性,它保存着用户上网的记录,从窗口被打开的那一刻算起. 一.history对象的属性 可以通过判断 history.length,得到是否有历史记录和记录 ...

  2. BZOJ 1059 矩阵游戏 二分图匹配

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1059 题目大意: 小Q是一个非常聪明的孩子,除了国际象棋,他还很喜欢玩一个电脑益智游戏 ...

  3. ZTree 使用范例

    http://www.treejs.cn/v3/api.php zTree v3.x 入门指南 Api 文档 https://github.com/zTree/zTree_v3 下载ZTree v3 ...

  4. Kali-linux渗透攻击应用

    前面依次介绍了Armitage.MSFCONSOLE和MSFCLI接口的概念及使用.本节将介绍使用MSFCONSOLE工具渗透攻击MySQL数据库服务.PostgreSQL数据库服务.Tomcat服务 ...

  5. topk两种解法

    1.这个通过partition实现topk,时间复杂度是o(logn*logn),也就是0(n),但需要修改原数组的顺序 下面这个代码本身有一些错误,并且throw excption会在牛客上报错 c ...

  6. Oracle数据库常用命令(持续更新)

    1. 查询当前用户所有的表 select * from user_tables; 2. 查询当前用户能访问的表 select * from all_tables; 3. 获取表字段 select * ...

  7. PAT——1024. 科学计数法

    科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式[+-][1-9]"."[0-9]+E[+-][0-9]+,即数字的整数部分只有1位,小数部分至少有1位 ...

  8. [原创]HBase学习笔记(2)- 基本操作

    1.使用hbase shell连接hbase 2.输入help可以查看帮助 3.输入list查看当前hbase中的所有表 4.使用create创建表test 其中test是表名,cf是列族.该表只创建 ...

  9. DataGuard快照(snapshot)数据库

    在Dataguard中,可以将standby备库切换为snapshot快照数据库,在切换为snapshot数据库后,备库将置于可读写的模式.可用于模拟业务功能测试.在使用完成之后,可以将快照数据库切换 ...

  10. BZOJ 5248: [2018多省省队联测]一双木棋(对抗搜索)

    Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 439  Solved: 379[Submit][Status][Discuss] Descriptio ...