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\)表示区间还有多少灯是亮着的. ...
随机推荐
- 解决spring boot 无法访问静态文件夹的附件或图片
1.需要在配置文件重新执行静态文件夹位置即可 # 指定静态文件位置 resources: static-locations: classpath:/static/,classpath:/static/ ...
- 安装KVM
在VMWare安装CentOS7 选择图形界面和开发工具 设置网络 cd /etc/sysconfig/network-scripts/ vi ifcfg-ens33 BOOTPROTO=static ...
- [Beyond Compare] 排除/忽略 .svn 文件夹
[Beyond Compare] Exclude .svn folders Beyond Compare 3 Session >> Session Settings... >> ...
- spring cloud --- config 配置中心 [本地、git获取配置文件]
spring boot 1.5.9.RELEASE spring cloud Dalston.SR1 1.前言 spring cloud config 配置中心是什么? 为了统一管理配 ...
- 学习Java爬虫文档的学习顺序整理
1.认识正则表达式(Java语言基础) https://www.toutiao.com/i6796233686455943693/ 2.正则表达式学习之简单手机号和邮箱练习 https://www.t ...
- linux笔记(一)
linux 开源镜像网址:http://mirrors.163.com pwd : 展示当前所在的目录的绝对路径 cd : 切换到某个路径 cd 命令,是 Change Directory 的缩写, ...
- 乒乓球队比赛,甲队有abc三人,乙队有xyz三人。 抽签得出比赛名单:a不和x比,c不和x,z比, 利用集合求出比赛名单
import java.util.HashMap; import java.util.Map; /** * 乒乓球队比赛,甲队有abc三人,乙队有xyz三人. * 抽签得出比赛名单:a不和x比,c不和 ...
- JAVA-JDK1.7-ConCurrentHashMap-测试和验证
概述 上次记录了关于ConCurrentHashMap的原理以及源码,现在我对其进行有关功能的测试,下面就讲解一下我测试的内容和代码.这些测试主要针对JDK1.7版本. GET安全测试 上一篇写过ge ...
- 学习JAVAWEB第四天
# 今日内容 1. JDBC基本概念 2. 快速入门 3. 对JDBC中各个接口和类详解 ## JDBC: 1. 概念:Java DataBase Connectivity Java 数据库连接, J ...
- JavaScript之递归查找所有父节点
......data: () => ({ // 数据 dt: [{ id: '1', children: [ { id: '1-1', children: [ { id: '1-1-1', ch ...