\(\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. map类型转string必须用.toString

  2. linux修改配置文件关闭终端失效问题

    当前shell环境为 交互式login-shell(非图形化界面环境) /etc/profile /etc/bash.bashrc ~/.profile ~/bashrc 当前环境为 交互式非logi ...

  3. Centos下安装Maven私服Nexus

    dockers安装Nexus,指定访问路径(默认为/:在使用Nginx做反向代理时,最好指定访问路径),并在容器外持久化数据,避免Nexus容器升级后数据丢失. 安装并启动 docker run -d ...

  4. C#获取http图片

    public Image GetHttpImage(string url) { var client = new HttpClient(); var uri = new Uri(Uri.EscapeU ...

  5. IoC容器-Bean管理XML方式(注入集合类型属性)

    Ico操作Bean管理(xml注入集合属性) 1,注入数组类型属性 2,注入List集合类型属性 3,注入Map集合类型属性 (1)创建类,定义数组.list.map.set类型属性,生成对应set方 ...

  6. 集合框架-Map集合-HashMap存储自定义对象

    1 package cn.itcast.p6.hashmap.demo; 2 3 import java.util.HashMap; 4 import java.util.Iterator; 5 im ...

  7. 字的研究(3)fontTools-TrueType轮廓坐标的获取以及基于TrueType的Glyph实例的构建

    前言 本文主要介绍如果使用Python第三方库fontTools提取OpenType字体文件中的TrueType轮廓坐标以及如何构建基于TrueType的Glyph实例 TrueType轮廓坐标的获取 ...

  8. [luogu P1312]Mayan游戏

    其实就是一道锻炼码力的简单题-- 看到题目中的\(0<x\leqslant 5\)也就知道是爆搜了吧( 我们仿照写游戏的方法多写几个函数,能够有效降低错误率(确信 我们写出大致的搜索流程来: 如 ...

  9. python 定义函数关键字def 简单介绍

    一  在类中定义的def # python中def 是用来干什么的? # 可以定义函数,就是定义一个功能. class People(): def __init__(self): print(&quo ...

  10. 正向代理 、反向代理, 和 Linux系统配置nginx。

    一.正向代理和反向代理的简单介绍. 2.代理 中间商,赚差价 在没有代理的时候: 茅台酒厂--->生产了一批酒--->通过物流发送到客户的家中/客户直接到酒厂购买酒--->突然有一个 ...