洛谷P2824 排序】的更多相关文章

解:splay + 线段树合并,分裂. 首先有个乱搞做法是外层拿splay维护,有序区间缩成splay上一个节点.内层再开个数据结构支持合并分裂有序集合. 内层我一开始想的是splay,然后就没有复杂度保证,乱搞. 后来发现可以用线段树分裂/合并来,全程复杂度一个log还能在线实时回答询问,NB! 解法二:二分答案 + 把原序列转成01序列来排序.这个我没写,但是感觉很神奇. #include <bits/stdc++.h> , M = ; namespace seg { int ls[M],…
洛谷—— P1347 排序 题目描述 一个不同的值的升序排序数列指的是一个从左到右元素依次增大的序列,例如,一个有序的数列A,B,C,D 表示A<B,B<C,C<D.在这道题中,我们将给你一系列形如A<B的关系,并要求你判断是否能够根据这些关系确定这个数列的顺序. 输入输出格式 输入格式: 第一行有两个整数n,m,n表示需要排序的元素数量,2<=n<=26,第1到n个元素将用大写的A,B,C,D....表示.m表示将给出的形如A<B的关系的数量. 接下来有m行,每…
P2824 [HEOI2016/TJOI2016]排序 题意: 有一个长度为\(n\)的1-n的排列\(m\)次操作 \((0,l,r)\)表示序列从\(l\)到\(r\)降序 \((1,l,r)\)表示序列从\(l\)到\(r\)升序 问最终第\(q\)位的元素 数据范围: \(n,m<=1e5\) 二分答案神题. 我们发现维护区间排序非常困难,然后最终只是若干修改一次询问. 所以我们可以枚举第\(q\)位的是什么,然后把小于等于它的置0,大于它的置0. 这样的话,我们就可以用支持区间查询和区…
题目大意:一个全排列,两种操作: 1. $0\;l\;r:$把$[l,r]$升序排序2. $1\;l\;r:$把$[l,r]$降序排序 最后询问第$k$位是什么 题解:二分答案,把比这个数大的赋成$1$,否则为$0$,线段树区间和和区间赋$01$,最后判断第$k$位是$0$是$1$,若为$1$则还可以变大,否则变小 卡点:修改后没有$update$ C++ Code: #include <cstdio> #include <cctype> namespace __R { int x…
传送门 这题的思路好清奇 因为只有一次查询,我们考虑二分这个值为多少 将原序列转化为一个$01$序列,如果原序列上的值大于$mid$则为$1$否则为$0$ 那么排序就可以用线段树优化,设该区间内$1$的个数为$res$,如果是升序排序,只要把$[r-res+1,r]$区间全部变为$1$,$[l,r-res]$区间全部变为$0$即可,用线段树区间覆盖即可 那么只要最后查询$k$的位置上是否是$1$,如果是的话$ans=mid,l=mid+1$,否则$r=mid-1$ 考虑为什么能这样二分.我们经过…
(另外:题解中有一种思路很高妙而且看上去可以适用一些其他情况的离线方法) 线段树合并&复杂度的简单说明:https://blog.csdn.net/zawedx/article/details/51818475 调用一次合并函数的时间是常数,而合并函数每调用一次就会删掉一个点,所以合并的总代价为删掉的点数和, 或者理解为: https://wenku.baidu.com/view/88f4e134e518964bcf847c95.html 所以好像要合并就不能可持久化?(指保留每一个版本,在合并…
正解:线段树+二分 解题报告: 传送门$QwQ$ 昂着题好神噢我$jio$得$QwQQQQQ$,,, 开始看到长得很像之前考试题的亚子,,,然后仔细康康发现不一样昂$kk$,就这里范围是$[1,n]$,而且每个数字只出现了一次,显然就不能用线段树维护每个数字的出现次数了$QAQ$ 考虑先二分这个位置上的数字,然后把所有大于这个数字的赋值为1其他赋值为0,然后就直接按01排序,最后$check$这个位置是0还是1就成$QwQ$ $over$ #include<bits/stdc++.h> usi…
\(\mathcal{Description}\)   Link.   给定排列 \(\{p_n\}\) 和 \(m\) 次局部排序操作,求操作完成后第 \(q\) 位的值.   \(n,m\le10^5\). \(\mathcal{Solution}\)   跟这道的核心套路(?)差不多.   若序列是 \(01\) 序列,局部排序就相当于把 \(1\) 扔到一端,把 \(0\) 扔到另一端,只需要知道区间 \(1\) 的个数就好.   二分答案 \(mid\),将排列中不小于 \(mid\)…
题目描述 一个不同的值的升序排序数列指的是一个从左到右元素依次增大的序列,例如,一个有序的数列A,B,C,D 表示A<B,B<C,C<D.在这道题中,我们将给你一系列形如A<B的关系,并要求你判断是否能够根据这些关系确定这个数列的顺序. 输入输出格式 输入格式: 第一行有两个整数n,m,n表示需要排序的元素数量,2<=n<=26,第1到n个元素将用大写的A,B,C,D....表示.m表示将给出的形如A<B的关系的数量. 接下来有m行,每行有3个字符,分别为一个大写…
这个题看到很多人写Topo排序,其实这道题第一眼看更像是一个差分约束的裸题QWQ... 令dis[x]表示x的相对大小(1是最小,n是最大),显然,对于一个关系A<B,我们有dis[A]<dis[B],也就是dis[A]<=dis[B]-1,然后我们就可以建一条从B到A的权值为-1的有向边. 而我们最后要求的就是dis[x]的最小值,为了使它们的值都落在1~n之间,我们新建一个虚拟的点0,并令dis[0]=0且dis[x]>dis[0]. 这样我们要求的就是dis[x]-dis[0…