题面

题解

这题好神仙啊。。。

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

然后当\(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. python网络爬虫--简单爬取糗事百科

    刚开始学习python爬虫,写了一个简单python程序爬取糗事百科. 具体步骤是这样的:首先查看糗事百科的url:http://www.qiushibaike.com/8hr/page/2/?s=4 ...

  2. Spring+ehcache+redis两级缓存

    问题描述 场景:我们的应用系统是分布式集群的,可横向扩展的.应用中某个接口操作满足以下一个或多个条件: 1. 接口运行复杂代价大, 2. 接口返回数据量大, 3. 接口的数据基本不会更改, 4. 接口 ...

  3. Java并发案例04---生产者消费者问题03--使用ReentrantLock

    /** * 面试题:写一个固定容量同步容器,拥有put和get方法,以及getCount方法, * 能够支持2个生产者线程以及10个消费者线程的阻塞调用 * * 使用wait和notify/notif ...

  4. python:定时任务模块schedule

    1.安装 pip install schedule 2.文档 https://schedule.readthedocs.io/en/stable/faq.html#how-to-execute-job ...

  5. 一步步入门编写PHP扩展

    1.写在最前 随着互联网飞速发展,lamp架构的流行,php支持的扩展也越来越多,这样直接促进了php的发展. 但是php也有脚本语言不可避免的问题,性能比例如C等编译型语言相差甚多,所以在考虑性能问 ...

  6. svn .externals 属性

    问:如下自定下载关联模块呢? 答:第一步: 编辑svn.externals文本,如下所示 dir/moduel_name URL/module dir/moduel_name URL/module 第 ...

  7. CS 20_Overview of Tensorflow

    tf.assign(A, new_number): 这个函数的功能主要是把new_number的值向前传递给了A run( fetches, feed_dict=None, options=None, ...

  8. HDU 1165 公式推导题

    题目链接: acm.hdu.edu.cn/showproblem.php?pid=1165 Eddy's research II Time Limit: 4000/2000 MS (Java/Othe ...

  9. 服务器监控zabbix

    nagios服务器安装:http://www.jb51.net/article/79496.htm默认端口12489 nagios +ndo2db+mysqlhttps://www.cnblogs.c ...

  10. C#实体更新指定的字段

    接口类: /// <summary> /// 更新指定字段 /// </summary> /// <param name="entity">实体 ...