\(\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」排序的更多相关文章

  1. 「区间DP」「洛谷P1043」数字游戏

    「洛谷P1043」数字游戏 日后再写 代码 /*#!/bin/sh dir=$GEDIT_CURRENT_DOCUMENT_DIR name=$GEDIT_CURRENT_DOCUMENT_NAME ...

  2. Solution -「APIO 2016」「洛谷 P3643」划艇

    \(\mathcal{Description}\)   Link & 双倍经验.   给定 \(n\) 个区间 \([a_i,b_i)\)(注意原题是闭区间,这里只为方便后文描述),求 \(\ ...

  3. Solution -「JSOI 2019」「洛谷 P5334」节日庆典

    \(\mathscr{Description}\)   Link.   给定字符串 \(S\),求 \(S\) 的每个前缀的最小表示法起始下标(若有多个,取最小的).   \(|S|\le3\time ...

  4. Solution -「洛谷 P4372」Out of Sorts P

    \(\mathcal{Description}\)   OurOJ & 洛谷 P4372(几乎一致)   设计一个排序算法,设现在对 \(\{a_n\}\) 中 \([l,r]\) 内的元素排 ...

  5. Solution -「POI 2010」「洛谷 P3511」MOS-Bridges

    \(\mathcal{Description}\)   Link.(洛谷上这翻译真的一言难尽呐.   给定一个 \(n\) 个点 \(m\) 条边的无向图,一条边 \((u,v,a,b)\) 表示从 ...

  6. 「洛谷4197」「BZOJ3545」peak【线段树合并】

    题目链接 [洛谷] [BZOJ]没有权限号嘤嘤嘤.题号:3545 题解 窝不会克鲁斯卡尔重构树怎么办??? 可以离线乱搞. 我们将所有的操作全都存下来. 为了解决小于等于\(x\)的操作,那么我们按照 ...

  7. 「洛谷3338」「ZJOI2014」力【FFT】

    题目链接 [BZOJ] [洛谷] 题解 首先我们需要对这个式子进行化简,否则对着这么大一坨东西只能暴力... \[F_i=\sum_{j<i} \frac{q_iq_j}{(i-j)^2}-\s ...

  8. 「BZOJ2733」「洛谷3224」「HNOI2012」永无乡【线段树合并】

    题目链接 [洛谷] 题解 很明显是要用线段树合并的. 对于当前的每一个连通块都建立一个权值线段树. 权值线段树处理操作中的\(k\)大的问题. 如果需要合并,那么就线段树暴力合并,时间复杂度是\(nl ...

  9. 「洛谷3870」「TJOI2009」开关【线段树】

    题目链接 [洛谷] 题解 来做一下水题来掩饰ZJOI2019考炸的心情QwQ. 很明显可以线段树. 维护两个值,\(Lazy\)懒标记表示当前区间是否需要翻转,\(s\)表示区间还有多少灯是亮着的. ...

随机推荐

  1. antd-vue中的form表单label标签for导致点击文字触发输入框解决方案

    <a-form-item :label="label+'图片'" :label-col="{ span: 2 }" :wrapper-col=" ...

  2. react中虚拟DOM

    简单来说虚拟DOM就是一个js对象,相对于真实dom来做比较更节约性能,虚拟DOM执行过程如下

  3. Swagger的应用

    一.介绍 一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格的 Web 框架. 二.依赖 <dependency> <groupId>io.springf ...

  4. vue3.0+vue-cli3.0项目搭建

    因为需要兼容其他vue2.0的项目,所以先卸载vue-cli,再全局安装桥接工具 卸载vue-cli2.0 npm uninstall vue-cli -g 安装vue-cli3.0 npm inst ...

  5. 基于rabbitmq延迟插件实现分布式延迟任务

    承接上文基于redis,redisson的延迟队列实践,今天介绍下基于rabbitmq延迟插件rabbitmq_delayed_message_exchange实现延迟任务. 一.延迟任务的使用场景 ...

  6. Solon Web 开发

    Solon Web 开发 一.开始 二.开发知识准备 三.打包与运行 四.请求上下文 五.数据访问.事务与缓存应用 六.过滤器.处理.拦截器 七.视图模板与Mvc注解 八.校验.及定制与扩展 九.跨域 ...

  7. nRF24L01无线模块笔记

    nRF24L01模块 官网链接: https://www.nordicsemi.com/Products/nRF24-series 常见的无线收发模块, 工作在2.4GHz频段, 适合近距离遥控和数据 ...

  8. 安卓无法访问Azure服务器和微软API

    Azure服务器保护机制限制移动端访问 必须使用移动app服务来转接api,才可以访问.

  9. 将Cesium ion上的3D Tiles和Bing imagery应用到osgEarth

    Cesium中文网:http://cesiumcn.org/ | 国内快速访问:http://cesium.coinidea.com/ Pelican Mapping 激动的宣布支持加载Cesium ...

  10. dubbo系列十一、dubbo transport层记录

    前言 在dubbo接口方法重载且入参未显式指定序列化id导致ClassCastException分析时候用到了dubbo的通信层和编解码,dubbo有个transport层,默认使用netty4进行网 ...