Solution -「HEOI/TJOI 2016」「洛谷 P2824」排序
\(\mathcal{Description}\)
Link.
给定排列 \(\{p_n\}\) 和 \(m\) 次局部排序操作,求操作完成后第 \(q\) 位的值。
\(n,m\le10^5\)。
\(\mathcal{Solution}\)
跟这道的核心套路(?)差不多。
若序列是 \(01\) 序列,局部排序就相当于把 \(1\) 扔到一端,把 \(0\) 扔到另一端,只需要知道区间 \(1\) 的个数就好。
二分答案 \(mid\),将排列中不小于 \(mid\) 的值设为 \(1\),其余设为 \(0\),暴力建新的线段树维护区间和,然后暴力处理每次排序操作,最后求到此时 \(q\) 位置的值(\(1\) 或 \(0\))。注意到这个值的意义——\(q\) 位置的值大于等于 / 小于 \(mid\),借此调整二分区间即可。
复杂度 \(\mathcal O(m\log^2n+n\log n)\)。
\(\mathcal{Code}\)
#include <cstdio>
const int MAXN = 1e5;
int n, m, a[MAXN + 5];
struct Event { int op, l, r; } evt[MAXN + 5];
inline int rint () {
int x = 0; char s = getchar ();
for ( ; s < '0' || '9' < s; s = getchar () );
for ( ; '0' <= s && s <= '9'; s = getchar () ) x = x * 10 + ( s ^ '0' );
return x;
}
struct SegmentTree {
int one[MAXN << 2], tag[MAXN << 2];
inline void pushup ( const int rt ) { one[rt] = one[rt << 1] + one[rt << 1 | 1]; }
inline void pushdn ( const int rt, const int len ) {
if ( ! ~ tag[rt] ) return ;
one[rt << 1] = tag[rt] * ( len + 1 >> 1 );
one[rt << 1 | 1] = tag[rt] * ( len >> 1 );
tag[rt << 1] = tag[rt << 1 | 1] = tag[rt];
tag[rt] = -1;
}
inline void build ( const int rt, const int l, const int r, const int thrval ) {
tag[rt] = -1;
if ( l == r ) return void ( one[rt] = a[l] >= thrval );
int mid = l + r >> 1;
build ( rt << 1, l, mid, thrval ), build ( rt << 1 | 1, mid + 1, r, thrval );
pushup ( rt );
}
inline void assign ( const int rt, const int l, const int r, const int al, const int ar, const int v ) {
if ( al > ar ) return ;
if ( al <= l && r <= ar ) return void ( one[rt] = ( tag[rt] = v ) * ( r - l + 1 ) );
int mid = l + r >> 1; pushdn ( rt, r - l + 1 );
if ( al <= mid ) assign ( rt << 1, l, mid, al, ar, v );
if ( mid < ar ) assign ( rt << 1 | 1, mid + 1, r, al, ar, v );
pushup ( rt );
}
inline int query ( const int rt, const int l, const int r, const int ql, const int qr ) {
if ( ql <= l && r <= qr ) return one[rt];
int mid = l + r >> 1, ret = 0; pushdn ( rt, r - l + 1 );
if ( ql <= mid ) ret += query ( rt << 1, l, mid, ql, qr );
if ( mid < qr ) ret += query ( rt << 1 | 1, mid + 1, r, ql, qr );
return ret;
}
} st;
int main () {
n = rint (), m = rint ();
for ( int i = 1; i <= n; ++ i ) a[i] = rint ();
for ( int i = 1; i <= m; ++ i ) {
evt[i].op = rint (), evt[i].l = rint (), evt[i].r = rint ();
}
int l = 1, r = n, q = rint ();
while ( l < r ) {
int mid = l + r + 1 >> 1;
st.build ( 1, 1, n, mid );
for ( int i = 1; i <= m; ++ i ) {
int el = evt[i].l, er = evt[i].r, t = st.query ( 1, 1, n, el, er );
if ( ! evt[i].op ) {
st.assign ( 1, 1, n, el, er - t, 0 );
st.assign ( 1, 1, n, er - t + 1, er, 1 );
} else {
st.assign ( 1, 1, n, el, el + t - 1, 1 );
st.assign ( 1, 1, n, el + t, er, 0 );
}
}
if ( st.query ( 1, 1, n, q, q ) ) l = mid;
else r = mid - 1;
}
printf ( "%d\n", l );
return 0;
}
Solution -「HEOI/TJOI 2016」「洛谷 P2824」排序的更多相关文章
- 「区间DP」「洛谷P1043」数字游戏
「洛谷P1043」数字游戏 日后再写 代码 /*#!/bin/sh dir=$GEDIT_CURRENT_DOCUMENT_DIR name=$GEDIT_CURRENT_DOCUMENT_NAME ...
- Solution -「APIO 2016」「洛谷 P3643」划艇
\(\mathcal{Description}\) Link & 双倍经验. 给定 \(n\) 个区间 \([a_i,b_i)\)(注意原题是闭区间,这里只为方便后文描述),求 \(\ ...
- Solution -「JSOI 2019」「洛谷 P5334」节日庆典
\(\mathscr{Description}\) Link. 给定字符串 \(S\),求 \(S\) 的每个前缀的最小表示法起始下标(若有多个,取最小的). \(|S|\le3\time ...
- Solution -「洛谷 P4372」Out of Sorts P
\(\mathcal{Description}\) OurOJ & 洛谷 P4372(几乎一致) 设计一个排序算法,设现在对 \(\{a_n\}\) 中 \([l,r]\) 内的元素排 ...
- Solution -「POI 2010」「洛谷 P3511」MOS-Bridges
\(\mathcal{Description}\) Link.(洛谷上这翻译真的一言难尽呐. 给定一个 \(n\) 个点 \(m\) 条边的无向图,一条边 \((u,v,a,b)\) 表示从 ...
- 「洛谷4197」「BZOJ3545」peak【线段树合并】
题目链接 [洛谷] [BZOJ]没有权限号嘤嘤嘤.题号:3545 题解 窝不会克鲁斯卡尔重构树怎么办??? 可以离线乱搞. 我们将所有的操作全都存下来. 为了解决小于等于\(x\)的操作,那么我们按照 ...
- 「洛谷3338」「ZJOI2014」力【FFT】
题目链接 [BZOJ] [洛谷] 题解 首先我们需要对这个式子进行化简,否则对着这么大一坨东西只能暴力... \[F_i=\sum_{j<i} \frac{q_iq_j}{(i-j)^2}-\s ...
- 「BZOJ2733」「洛谷3224」「HNOI2012」永无乡【线段树合并】
题目链接 [洛谷] 题解 很明显是要用线段树合并的. 对于当前的每一个连通块都建立一个权值线段树. 权值线段树处理操作中的\(k\)大的问题. 如果需要合并,那么就线段树暴力合并,时间复杂度是\(nl ...
- 「洛谷3870」「TJOI2009」开关【线段树】
题目链接 [洛谷] 题解 来做一下水题来掩饰ZJOI2019考炸的心情QwQ. 很明显可以线段树. 维护两个值,\(Lazy\)懒标记表示当前区间是否需要翻转,\(s\)表示区间还有多少灯是亮着的. ...
随机推荐
- Word2010邮件合并制作成绩单
原文链接: https://www.toutiao.com/i6488941003494392333/ 准备数据源: 选择"邮件"选项卡,"开始邮件合并"功能组 ...
- [转]JS正则表达式基础
1. 正则表达式的概念 正则表达式(regular expression)描述了一种字符串匹配的模式.这种模式,我们可以理解成是一种"规则".根据这种规则再去匹配符合条件的结果,而 ...
- 服务性能监控之Micrometer详解
Micrometer 为基于 JVM 的应用程序的性能监测数据收集提供了一个通用的 API,支持多种度量指标类型,这些指标可以用于观察.警报以及对应用程序当前状态做出响应. 通过添加如下依赖可以将 M ...
- RHCSA 第二天
1.Linux中的文件类型以及符号的表示 (1) 普通文件: 使用 ls -l 命令后,第一列第一个字符为 "-" 的文件为普通文件,如上图所示,普通文件一般为灰色字体,绿色字体的 ...
- TexStudio中Bibtex使用
TexStudio中Bibtex使用 1.首先在百度文库中找到相应的参考文献: 2.建立bibfile.bib文件,放在和.tex同一目录下,将上面页面的结果考入该文件,注意其中第一行中的Tuan20 ...
- VictoriaMerics学习笔记(1):翻译官方广告
先看看VictoriaMetrics官网网站上是如何作(tree)宣(new)传(bee)的: 官方广告 0.(监控领域)最快解决方案 为高性能而设计 便于安装 支持单机和群集版本 1.更高效的存储空 ...
- blender建模常用建模快捷键
编辑物体 M2选取 M2+SHIFT选取多个 A全选 B+M1矩阵选择 C+M1笔刷选择 CTRL+M1套索选择 CTRL+SHIFT+M1取消套索选择 ALT+M2选择边循环,面 CTRL+ALT+ ...
- RT-Thread移植到stm32
一.移植RT-Thread准备 RT-Thread源码 源码版本和下载方式,可以参考RT-Thread移植入门学习. keil软件 STM32工程项目模板 因为每一厂家提供的库文件可能有一些区别,在移 ...
- 从零开始, 开发一个 Web Office 套件 (2): 富文本编辑器
书接前文: 从零开始, 开发一个 Web Office 套件 (1): 富文本编辑器 这是一个系列博客, 最终目的是要做一个基于HTML Canvas 的, 类似于微软 Office 的 Web Of ...
- Working hard to know your neighbor's margins:Local descriptor learning loss论文笔记
Abstract 论文提出了一种新的训练方法,受到了 Lowe's matching criterion for SIFT的启发.这种新的loss,要比负责的正则方法更好.把这个新的loss方法结合L ...