题面 单点修改,区间求第k大 分析 首先,这道题卡权值线段树套treap的做法,所以只能用主席树做 对于静态的查询,root[i]对应的主席树的区间[l,r]保存的是a[1]~a[i]有多少个值落在区间[l,r]内.如果我们要修改a[i],则要修改O(n)棵主席树.那么我们像树状数组那样维护n棵主席树,不同的是每棵主席树里保存的是,a[i-lowbit(i)+1]~a[i]有多少个值落在区间[l,r]内 对于查询[ql,qr]时的做差 我们要像树状数组求和那样,把root[i],root[i-l…
Dynamic Rankings Time Limit: 10 Seconds      Memory Limit: 32768 KB The Company Dynamic Rankings has developed a new kind of computer that is no longer satisfied with the query like to simply find the k-th smallest number of the given N numbers. They…
题面地址(权限题) 不用权限题的地址 首先说说怎么搞带修改主席树? 回忆一般的kth问题,我们的主席树求的是前缀和,这样我们在目标区间的左右端点的主席树差分下就能求出kth. 那么我们如何支持修改操作? 考虑到我们之前使用主席树朴素的维护区间前缀和,支持修改的话,只要把前缀和交给擅长它的树状数组维护,主席树只要维护下大概位置就好. 当然维护位置最好要离散化一下.我校某高傲的dalao直接写CTSC那道树上动态Kth,并且niubi地手写哈希维护. 别问我了在我写这篇文章的时候他还在debug呢.…
传送门(权限) 传送门(非权限) 花了一晚上总算把代码调好了……才知道待修改主席树怎么操作…… 然而还是一知半解orz…… 先说说我的理解吧 我们一般建主席树的时候都是直接在序列上建的 但是如果有修改操作怎么办? 因为主席树维护的是前缀和 而树状数组刚好支持待修改前缀和 所以我们可以将主席树和树状数组一起使用 树状数组实际指向主席树上的节点 修改和查询操作用树状数组遍历,实则修改或查询主席树上的节点 //minamoto #include<bits/stdc++.h> #define N 10…
Dynamic Rankings bzoj-1901 Zju-2112 题目大意:给定一个n个数的序列,m个操作,支持:单点修改:查询区间k小值. 注释:$1\le n,m\le 10^4$. 想法:如果这个教树套树的话,我也没办法. 其实就是借用了树状数组的思想,我们在这里叫它...阉割树状数组把. 具体地,主席树每个节点维护的仍然是前缀权值线段树. 修改的时候将修改的点二进制lowbit分解.在分解的节点的权值线段树上直接修改. 查询时我们将所有区间(左端点-1)都二进制lowbit分解,然…
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1901 题意概括 给你一段序列(n个数),让你支持一些操作(共m次), 有两种操作,一种是询问区间第k小,一种是单点修改. n,m<=10000 题解 这个主席树的写法是我自己造出来的. 主席树的查询区间第k大需要依赖前缀和. 树状数组最擅长这个了,就让他来干. 原理是这样的: 先离散化,包括修改操作里面的数字也要离散化. 然后建树,包括修改操作所涉及的数值也要建. 现在总共有n个线段树. 第0棵…
Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 9094  Solved: 3808[Submit][Status][Discuss] Description 给定一个含有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继续回答上面的问题.…
题面戳这 类似算法总结 1.静态整体Kth 滑稽吧...sort一遍就好了. 时间复杂度\(O(nlogn)\) 空间复杂度\(O(n)\) 2.动态整体Kth 离散化后开一棵权值线段树,每个位置的值表示这个位置对应的那个数(离散化后的)有多少个,向上维护和: 查询时先查询左子树和sum,比较k和sum的大小:若k<=sum则说明第k小数在左子树中,递归查询左子树: 否则,这个数对应的就是右子树中第k-sum小的数,k-=sum,递归查询右子树. 时间复杂度\(O(nlogn)\) 空间复杂度\…
1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec Memory Limit: 128 MB Submit: 6058 Solved: 2521 [Submit][Status][Discuss] Description 给定一个含有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…
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1146 题意概括 在一棵树上,每一个点一个权值. 有两种操作: 1.单点修改 2.询问两点之间的树链上的第k大值 题解 水题. 就是烦了一点. 居然只调了3个小时? 树链剖分+带修主席树. 带修主席树: BZOJ1901 Zju2112 Dynamic Rankings 主席树 代码 #include <cstring> #include <cstdio> #include <…