07 2021 档案
摘要:题目链接 #解题思路 splay的模版题,首先先把l-1这个位置的结点splay到根,然后再把r+1这个位置的结点splay到l-1的下面,那么r+1的左子树就是区间l到r,然后用懒标记来交换子树中每个节点的左右儿子即可 const int maxn = 1e5+10; int n, m; stru
阅读全文
摘要:题目链接 #题目大意 询问区间内满足$c\ xor\ a < b$的不同的数的个数。 #解题思路 求区间不同的数可以用树状数组离线来做,求满足$c\ xor\ a < b$的数可以用字典树来做,树状数组的每一个节点开一个字典树即可。算是两种思路的结合吧。 const int maxn = 1e5+1
阅读全文
摘要:题目链接 #题目大意 询问区间出现次数为偶数的数的异或和。 #解题思路 求所有数的前缀异或和,再用线段树离线求出所有询问区间的不同数的异或和。 int n, m, a[maxn]; int sum[maxn]; vector<P> q[maxn]; int tr[maxn<<2], ans[maxn
阅读全文
摘要:题目链接 #题目大意 给你一颗树,有两种操作。一种是给树上两个点之间的点$(x_1, x_2...x_k)$加上$12, 22...k2$。另一种是查询树上某个节点的值,初始每个节点的值都是$0$。 #解题思路 题目很明显可以树剖之后建线段树来做区间修改和单点查询。 给区间加上等差数列的平方可以用加
阅读全文
摘要:##A 二分,尺取 对于一个区间$[l,r]$如果区间内的某个数的个数大于$x$,那么这个区间的值必然大于等于$x$,将这个区间向两边扩展,扩展后的区间的值也必然大于$x$。 我们二分第k大区间的值$x$,在判定答案的时候,先枚举左端点,求一个满足区间内的某个数大于$x$的最小的右端点,不难发现,随
阅读全文
摘要:题目链接 #题目大意 询问区间[l,r]中满足相邻两个树大小不超过k的数对。 #解题思路 如果一个一个加入数字的话,设当前数字为i,那么对答案的贡献就是之前的数字之中$[a_i-k,a_i+k]$范围内的数字的数量,可以用莫队来维护l,r,然后每次的修改和查询操作用树状数组来操作。 #代码 cons
阅读全文
摘要:题目链接 #解题思路 一开始想着体积和重量开大点枚举比v和m大的部分,结果各种超时。。。其实可以就按v和m枚举,枚举到0,减成负数就取0,也能表示超过v和m的情况。 #代码 const int maxn = 1e3+10; const int maxm = 1e5+10; int n, v, m,
阅读全文