Luogu P2617 Dynamic Rankings】的更多相关文章

链接:https://www.luogu.org/problemnew/show/P2617 思路: 如果直接在主席树上修改的话,每次修改都会对后面所有的树造成影响,一次修改的复杂度就会变成 : n*logn,我们套上树状数组维护,每次就最多只用更新logn棵树,复杂度是:logn*logn,是可以接受的: 代码参考hzwer: http://hzwer.com/2835.html 实现代码; #include<bits/stdc++.h> using namespace std; ; ],h…
带修主席树的模板,因为状态不好所以敲了很长时间,不过写完感觉能更好地理解主席树了. 核心其实就是树状数组套主席树,维护方法不再是以前的那种一步一修改,而是对于树状数组上的每一个点建立一棵权值线段树,然后一点一点地维护.这样就从朴素修改后缀所需要的每次\(O(NlogN)\)的复杂度,变成了修改\(log\)棵树所需要的\(O(Nlog^2N)\). 几个注意事项: 本题卡常.请使用离散化后的权值进行建树. 本题卡常.不要用\(cin\). 因为是权值线段树,所以要先删除再添加. 二分的时候也要带…
嘟嘟嘟 一句话题意:带修改区间第\(k\)小. 不修改都会,主席树板子.但是有修改就要比较深入的理解主席树了. 众所周知,主席树中以\(i\)为根的线段树维护的是\([1, i]\)这个前缀的权值,因此若修改一个点\(a[x]\),必须把\([x, n]\)的线段树全修改了,单次修改复杂度为\(O(n \log{n})\),显然承受不起. 通过上面的分析,我们发现前缀和是不能修改的,因此对于每一棵线段树,我们应该去维护别的数据结构,且这个数据结构支持单点修改,区间询问. 没错,到这谁都能猜出来了…
嘟嘟嘟 带修改区间第k大. 然而某谷把数据扩大到了1e5,所以用分块现在只能得50分. 分块怎么做呢?很暴力的. 基本思想还是块内有序,块外暴力统计. 对于修改,直接重排修改的数所在块,时间复杂度O(√nlogn√n). 对于询问,二分答案,然后在每个块内再二分统计小于mid的数有几个,块外暴力统计,时间复杂度O(m * log1e9 * √nlog√n),所以只能过1e4. #include<cstdio> #include<iostream> #include<cmath…
题目 动态区间第K小模板题. 一个非常可行的办法是BIT套动态开点权值SegTree,但是它跑的实在太慢了. 然后由于这题并没有强制在线,所以我们可以使用整体二分来吊打树套树. 当然如果强制在线的话就只能够用大常数的树套树了. 这里稍微结合这道题讲一下整体二分吧. 我们把所有询问加修改(统称为操作)按时间顺序排好,然后一起二分答案. 对于一个操作区间\([ql,qr]\)和答案\(mid\),我们顺序遍历所有操作. 将所有能在当前情况下产生影响的修改进行执行并放到左操作区间,否则直接放到右操作区…
传送门 解题思路 动态区间第\(k\)大,树状数组套主席树模板.树状数组的每个位置的意思的是每棵主席树的根,维护的是一个前缀和.然后询问的时候\(log\)个点一起做前缀和,一起移动.时空复杂度\(O(nlog^2n)\). 代码 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> using namespace std…
带修改的主席树,其实这种,已经不能算作主席树了,因为这个没有维护可持久化的... 主席树直接带修改的话,由于这种数据结构是可持久化的,那么要相应改动,这个节点以后所有的主席树,这样单次修改,就达到n*log n 的复杂度 现在介绍这种待修改的主席树,本质上是用树状数组的区间查询维护的线段树,树状数组的每个点,都开一个权值线段树,维护的是lowbit(x)-x之间的数字的出现次数 这样我们相当于,把一个1-n权值线段树,用树状数组给砍成logn段,这样就非常方便...我们用树状数组遍历维护前缀和的…
P2617 Dynamic Rankings 单点修改,区间查询第k大 当然是无脑树套树了~ 树状数组套主席树就好辣 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define rint register int using namespace std; void read(int &x){ ; ') c=getchar(); +(c^),c=ge…
P2617 Dynamic Rankings 题目描述 给定一个含有n个数的序列a[1],a[2],a[3]--a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i+2]--a[j]中第k小的数是多少(1≤k≤j-i+1),并且,你可以改变一些a[i]的值,改变后,程序还能针对改变后的a继续回答上面的问题.你需要编一个这样的程序,从输入文件中读入序列a,然后读入一系列的指令,包括询问指令和修改指令. 对于每一个询问指令,你必须输出正确的回答. 输入输出格式 输…
洛谷P2617 Dynamic Rankings 题目描述 给定一个含有n个数的序列a[1],a[2],a[3]--a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i+2]--a[j]中第k小的数是多少(1≤k≤j-i+1),并且,你可以改变一些a[i]的值,改变后,程序还能针对改变后的a继续回答上面的问题.你需要编一个这样的程序,从输入文件中读入序列a,然后读入一系列的指令,包括询问指令和修改指令. 对于每一个询问指令,你必须输出正确的回答. 输入输出格式…