BZOJ4552 - [TJOI2016]排序】的更多相关文章

Portal Description 给出一个\(1..n(n\leq10^5)\)的排列,进行\(m(m\leq10^5)\)次操作: 升序排列\([L,R]\)中的数. 降序排列\([L,R]\)中的数. 所有操作完成后,求位置\(q\)上的值. Solution 居然是二分答案...! 对于可能的答案\(x\),将所有小于\(x\)的数视为\(0\),大于等于\(x\)的数视为\(1\).那么每次排序就能利用线段树在\(O(logn)\)的时间内处理(区间赋值\(0/1\)).操作完成后,…
[BZOJ4552]排序(线段树,二分答案) 题面 BZOJ 题解 好神的题啊 直接排序我们做不到 怎么维护? 考虑一下,如果我们随便假设一个答案 怎么检验它是否成立? 把这个数设成\(1\),其他的数字都设成\(0\) 最后检查一下这个位置是不是\(1\)就好啦 但是这样没法排序 那么,我们考虑二分一个答案, 把所有比\(mid\)大的数都设成\(1\) 这样,如果在第\(Q\)位上的数字是\(1\) 意味着有一个不小于当前\(mid\)的数在这个位置上 否则就是一个比\(mid\)小的数在这…
P2824 [HEOI2016/TJOI2016]排序 题意: 有一个长度为\(n\)的1-n的排列\(m\)次操作 \((0,l,r)\)表示序列从\(l\)到\(r\)降序 \((1,l,r)\)表示序列从\(l\)到\(r\)升序 问最终第\(q\)位的元素 数据范围: \(n,m<=1e5\) 二分答案神题. 我们发现维护区间排序非常困难,然后最终只是若干修改一次询问. 所以我们可以枚举第\(q\)位的是什么,然后把小于等于它的置0,大于它的置0. 这样的话,我们就可以用支持区间查询和区…
[HEOI2016/TJOI2016]排序 内存限制:256 MiB 时间限制:6000 ms 标准输入输出 题目类型:传统 评测方式:文本比较 题目描述 在2016年,佳媛姐姐喜欢上了数字序列.因而他经常研究关于序列的一些奇奇怪怪的问题,现在他在研究一个难题,需要你来帮助他.这个难题是这样子的:给出一个1到n的全排列,现在对这个全排列序列进行m次局部排序,排序分为两种:1:(0,l,r)表示将区间[l,r]的数字升序排序2:(1,l,r)表示将区间[l,r]的数字降序排序最后询问第q位置上的数…
题面 传送门:https://www.luogu.org/problemnew/show/P2824 Solution 这题极其巧妙. 首先,如果直接做m次排序,显然会T得起飞. 注意一点:我们只需要找到一个数. 所以说,我们可以考虑一个绝妙的想法:我们可以用二分答案的方法缩小要找的数的区间. 考虑二分一个值,判定p位置的数排序之后,p位置上的数是否>=mid 如果>=mid,则向右找,否则向左找. 怎么判定p位置的数排序之后是否>=mid呢? 考虑这样做:扫描一遍原数组,>=mi…
2021.12.09 [HEOI2016/TJOI2016]排序(线段树+二分,把一个序列转换为01串) https://www.luogu.com.cn/problem/P2824 题意: 在 2016 年,佳媛姐姐喜欢上了数字序列.因而她经常研究关于序列的一些奇奇怪怪的问题,现在她在研究一个难题,需要你来帮助她. 这个难题是这样子的:给出一个 1 到 n 的排列,现在对这个排列序列进行 m 次局部排序,排序分为两种: 0 l r 表示将区间 \([l,r]\) 的数字升序排序 1 l r 表…
http://www.lydsy.com/JudgeOnline/problem.php?id=4552 二分答案 把>=mid 的数看做1,<mid 的数看做0 这样升序.降序排列相当于区间查询0,1 的个数,区间覆盖0,1 线段树即可完成 查询给定位置p 如果=1,说明p位置的数>=mid ,上调下界 如果=0,说明p位置的数<mid,下调上界 #include<cstdio> #include<iostream> #include<algorit…
解法一:二分答案+线段树 首先我们知道,对于一个01序列排序,用线段树维护的话可以做到单次排序复杂度仅为log级别. 这道题只有一个询问,所以离线没有意义,而一个询问让我们很自然的想到二分答案.先二分出这个位置上的数是多少,然后将所有小于等于的数全部赋为0,其余赋为1,这样每次排序都是01序列排序了.如果最后p位置上的数为0则说明最终答案小于等于当前二分的答案,反之亦然. 这样这个问题就在$O(n \log^2 n)$的复杂度内解决了. #include<cstdio> #include<…
题目链接 BZOJ4552 题解 之前去雅礼培训做过一道题,\(O(nlogn)\)维护区间排序并能在线查询 可惜我至今不能get 但这道题有着\(O(nlog^2n)\)的离线算法 我们看到询问只有一个,自然可以去尝试二分 我们二分一个值,就只关心最终那个位置的值和其的大小关系 所以我们可以令所有\(\ge\)它的值为\(1\),剩余为\(0\) 然后我们只需对只有\(0\)和\(1\)的序列排序,用一个线段树很轻松就能解决 #include<algorithm> #include<i…
Description 给出一个$1$到$n$的全排列,现在对这个全排列序列进行$m$次局部排序,排序分为$2$种: $1.(0,l,r)$表示将区间$[l,r]$的数字升序排序; $2.(1,l,r)$表示将区间$[l,r]$的数字降序排序. 最后询问第$q$位置上的数字. Input 第$1$行为两个整数$n$和$m$.$n$表示序列的长度,$m$表示局部排序的次数. 第$2$行为$n$个整数,表示$1$到$n$的一个全排列. 接下来输入$m$行,每$1$行有$3$个整数$op,l,r$.…