[TJOI 2016&HEOI 2016]排序
Description
Input
Output
输出数据仅有一行,一个整数,表示按照顺序将全部的部分排序结束后第q位置上的数字。
Sample Input
1 6 2 5 3 4
0 1 4
1 3 6
0 2 4
3
Sample Output
题解(转载)
首先常规套路,如果值域较小,那么枚举值域线段树区间覆盖
那么这题这么做这个转换呢?直接二分答案,把小于的部分赋为$0$,大于等于部分$1$,这样转换过来了,注意线段树只要存$1$就好,$0$直接可以相减得出
//It is made by Awson on 2017.10.23
#include <set>
#include <map>
#include <cmath>
#include <ctime>
#include <cmath>
#include <stack>
#include <queue>
#include <vector>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#define LL long long
#define Min(a, b) ((a) < (b) ? (a) : (b))
#define Max(a, b) ((a) > (b) ? (a) : (b))
#define Lr(o) (o<<1)
#define Rr(o) (o<<1|1)
using namespace std;
const int N = 1e5; int n, m, q, a[N+];
struct operat {
int opt, l, r;
}p[N+];
struct tt {
int sgm[(N<<)+], lazy[(N<<)+];
void build(int o, int l, int r, int key) {
lazy[o] = ;
if (l == r) {
sgm[o] = (a[l]>=key); return;
}
int mid = (l+r)>>;
build(Lr(o), l, mid, key); build(Rr(o), mid+, r, key);
sgm[o] = sgm[Lr(o)]+sgm[Rr(o)];
}
void pushdown(int o, int l, int r, int mid) {
if (lazy[o] == ) {
lazy[Lr(o)] = lazy[Rr(o)] = ;
sgm[Lr(o)] = mid-l+, sgm[Rr(o)] = r-mid;
lazy[o] = ;
}else if (lazy[o] == -) {
lazy[Lr(o)] = lazy[Rr(o)] = -;
sgm[Lr(o)] = , sgm[Rr(o)] = ;
lazy[o] = ;
}
}
void update(int o, int l, int r, int a, int b, int key) {
if (a <= l && r <= b) {
if (key) lazy[o] = , sgm[o] = r-l+;
else lazy[o] = -, sgm[o] = ;
return;
}
int mid = (l+r)>>;
pushdown(o, l, r, mid);
if (a <= mid) update(Lr(o), l, mid, a, b, key);
if (mid < b) update(Rr(o), mid+, r, a, b, key);
sgm[o] = sgm[Lr(o)]+sgm[Rr(o)];
}
int query(int o, int l, int r, int a, int b) {
if (a <= l && r <= b) return sgm[o];
int mid = (l+r)>>;
pushdown(o, l, r, mid);
int ca = , cb = ;
if (a <= mid) ca = query(Lr(o), l, mid, a, b);
if (mid < b) cb = query(Rr(o), mid+, r, a, b);
return ca+cb;
}
}T; bool judge(int x) {
T.build(, , n, x);
int l, r, cnt0, cnt1;
for (int i = ; i <= m; i++) {
l = p[i].l, r = p[i].r;
cnt1 = T.query(, , n, l, r); cnt0 = r-l+-cnt1;
if (p[i].opt == ) {
if (cnt0 != ) T.update(, , n, l, l+cnt0-, );
if (cnt1 != ) T.update(, , n, l+cnt0, r, );
}else {
if (cnt1 != ) T.update(, , n, l, l+cnt1-, );
if (cnt0 != ) T.update(, , n, l+cnt1, r, );
}
}
return T.query(, , n, q, q) == ;
}
void work() {
scanf("%d%d", &n, &m);
for (int i = ; i <= n; i++) scanf("%d", &a[i]);
for (int i = ; i <= m; i++) scanf("%d%d%d", &p[i].opt, &p[i].l, &p[i].r);
scanf("%d", &q);
int l = , r = n, ans;
while (l <= r) {
int mid = (l+r)>>;
if (judge(mid)) l = mid+, ans = mid;
else r = mid-;
}
printf("%d\n", ans);
}
int main() {
work();
return ;
}
[TJOI 2016&HEOI 2016]排序的更多相关文章
- [TJOI 2016&HEOI 2016]求和
Description 题库链接 求 \[f(n)=\sum_{i=0}^n\sum_{j=0}^i S(i,j)\times 2^j \times (j!)\] \(S(i, j)\) 表示第二类斯 ...
- [HEOI 2016] sort
[HEOI 2016] sort 解题报告 码线段树快调废我了= = 其实这题貌似暴力分很足,直接$STL$的$SORT$就能$80$ 正解: 我们可以二分答案来做这道题 假设我们二分的答案为$a$, ...
- PHPStorm 2016.2 - 2016.3许可证服务器
最快,最安全的选择,以激活您的PHPStorm 2016.2 - 2016.3,这是足够的激活服务器,软件将自动激活.该过程将不断更新,如果不工作评价写入,如果有,以激活没有列出的服务器也可以说. 通 ...
- Windows Server 2016 + SCO 2016 安装及配置介绍
Windows Server 2016 + SCO 2016 安装及配置介绍 高文龙关注1人评论6332人阅读2017-02-26 23:23:02 Windows Server 2016 + SCO ...
- 「HEOI 2016/TJOI 2016」求和
题目链接 戳我 \(Solution\) 先化简式子: \[f(n)=\sum_{i=0}^n\sum_{j=0}^i\begin{Bmatrix} i \\ j \end {Bmatrix}*2^j ...
- HEOI 2016 游记
闲来无事,把这玩意儿补上. OI生涯中第一次正经的考试.挂的很惨. Day -1 不小心把机油(雾)sm惹毛了. 好像没啥别的事儿. Day 0 说好了上午直接去机房,然而临时说让我们上完前两节课再去 ...
- 数据结构(并查集||树链剖分):HEOI 2016 tree
[注意事项] 为了体现增强版,题目限制和数据范围有所增强: 时间限制:1.5s 内存限制:128MB 对于15% 的数据,1<=N,Q<=1000. 对于35% 的数据,1<=N,Q ...
- 字符串[未AC](后缀自动机):HEOI 2016 str
超级恶心,先后用set维护right,再用主席树维护,全部超时,本地测是AC的.放心,BZOJ上还是1S限制,貌似只有常数优化到一定境界的人才能AC吧. 总之我是精神胜利了哦耶QAQ #include ...
- [HEOI 2016] seq
题解: 发现多决策且明显无后效性,果断dp,那么转移方程F[i]=F[j]+1 设R[I]为改变之后的最大值,L[i]为改变之后的最小值 由于只能改变一个元素 所以转移的条件是 (j<i &am ...
随机推荐
- scrapy crawl 源码修改 爬虫多开
import os from scrapy.commands import ScrapyCommand from scrapy.utils.conf import arglist_to_dict fr ...
- 关于Java的异常
异常机制概述 异常机制是指当程序出现错误后,程序如何处理.具体来说,异常机制提供了程序退出的安全通道.当出现错误后,程序执行的流程发生改变,程序的控制权转移到异常处理器. 异常处理的流程 当程序中抛出 ...
- MySql使用存储过程实现事务的提交或者回滚
DELIMITER $$ DROP PROCEDURE IF EXISTS test_sp1 $$ CREATE PROCEDURE test_sp1( ) BEGIN ; ; START TRANS ...
- codevs 3342 绿色通道
codevs 3342 绿色通道 http://codevs.cn/problem/3342/ 难度等级:黄金 题目描述 Description <思远高考绿色通道>(Green Pass ...
- Android类加载机制及热修复实现
Android类加载机制 Dalvik虚拟机如同其他Java虚拟机一样,在运行程序时首先需要将对应的类加载到内存中.而在Java标准的虚拟机中,类加载可以从class文件中读取,也可以是其他形式的二进 ...
- js实现短暂提示框
业务场景:当鼠标移入某元素时,显示提示框进行介绍.当鼠标移除时,会自动消失.引入ToolTip.js和ToolTip.css 主方法:ToolTip.show(需要提示的元素id, 随意不重复即可, ...
- SpringMVC之HandlerMapping的使用
上篇博客在了解SpringMVC的工作流程时留了一些疑问,今天先学习下HandlerMapping,在HandlerMapping中可以通过HandlerExecutionChain getHandl ...
- redux的知识点
Redux: Redux 是针对 JavaScript应用的可预测状态容器 就是用来管理数据的.stroe 保存数据action领导 下达命令reducer员工 执行命令 下载命令: npm ins ...
- 关于搭建MyBatis框架(二)
由于在[关于使用Mybatis的使用说明(一)http://www.cnblogs.com/zdb292034/p/8675766.html]中存在不太完善地方,通过此片文档进行修订: 阅读指南:(1 ...
- HDFS的7个设计特点
1.Block的放置:默认不配置.一个Block会有三份备份,一份放在NameNode指定的DataNode,另一份放在与指定DataNode非同一Rack上的DataNode,最后一份放在与指定Da ...