上一页 1 2 3 4 5 6 7 8 9 ··· 32 下一页
摘要: 题目链接 #解题思路 题目相当于询问每个点所属集合的第$k$小的数的编号,查询某个数属于哪个集合可以用并查集来解决。题目还涉及了集合之间的合并,由于合并之后集合的元素会改变,所以需要动态询问第$k$小,可以用平衡树来解决。另外,在集合合并的时候需要用启发式合并,把小集合合并到大集合上,这样可以把时间 阅读全文
posted @ 2021-08-02 10:18 shuitiangong 阅读(51) 评论(0) 推荐(0) 编辑
摘要: 题目链接 #解题思路 splay的模版题,首先先把l-1这个位置的结点splay到根,然后再把r+1这个位置的结点splay到l-1的下面,那么r+1的左子树就是区间l到r,然后用懒标记来交换子树中每个节点的左右儿子即可 const int maxn = 1e5+10; int n, m; stru 阅读全文
posted @ 2021-07-31 20:40 shuitiangong 阅读(48) 评论(0) 推荐(0) 编辑
摘要: 题目链接 #题目大意 询问区间内满足$c\ xor\ a < b$的不同的数的个数。 #解题思路 求区间不同的数可以用树状数组离线来做,求满足$c\ xor\ a < b$的数可以用字典树来做,树状数组的每一个节点开一个字典树即可。算是两种思路的结合吧。 const int maxn = 1e5+1 阅读全文
posted @ 2021-07-30 11:14 shuitiangong 阅读(163) 评论(0) 推荐(0) 编辑
摘要: 题目链接 #题目大意 询问区间出现次数为偶数的数的异或和。 #解题思路 求所有数的前缀异或和,再用线段树离线求出所有询问区间的不同数的异或和。 int n, m, a[maxn]; int sum[maxn]; vector<P> q[maxn]; int tr[maxn<<2], ans[maxn 阅读全文
posted @ 2021-07-29 21:13 shuitiangong 阅读(37) 评论(0) 推荐(0) 编辑
摘要: 题目链接 #题目大意 给你一颗树,有两种操作。一种是给树上两个点之间的点$(x_1, x_2...x_k)$加上$12, 22...k2$。另一种是查询树上某个节点的值,初始每个节点的值都是$0$。 #解题思路 题目很明显可以树剖之后建线段树来做区间修改和单点查询。 给区间加上等差数列的平方可以用加 阅读全文
posted @ 2021-07-29 17:46 shuitiangong 阅读(52) 评论(0) 推荐(0) 编辑
摘要: ##A 二分,尺取 对于一个区间$[l,r]$如果区间内的某个数的个数大于$x$,那么这个区间的值必然大于等于$x$,将这个区间向两边扩展,扩展后的区间的值也必然大于$x$。 我们二分第k大区间的值$x$,在判定答案的时候,先枚举左端点,求一个满足区间内的某个数大于$x$的最小的右端点,不难发现,随 阅读全文
posted @ 2021-07-23 16:21 shuitiangong 阅读(178) 评论(0) 推荐(0) 编辑
摘要: 题目链接 #题目大意 询问区间[l,r]中满足相邻两个树大小不超过k的数对。 #解题思路 如果一个一个加入数字的话,设当前数字为i,那么对答案的贡献就是之前的数字之中$[a_i-k,a_i+k]$范围内的数字的数量,可以用莫队来维护l,r,然后每次的修改和查询操作用树状数组来操作。 #代码 cons 阅读全文
posted @ 2021-07-21 20:22 shuitiangong 阅读(42) 评论(0) 推荐(0) 编辑
摘要: 题目链接 #解题思路 一开始想着体积和重量开大点枚举比v和m大的部分,结果各种超时。。。其实可以就按v和m枚举,枚举到0,减成负数就取0,也能表示超过v和m的情况。 #代码 const int maxn = 1e3+10; const int maxm = 1e5+10; int n, v, m, 阅读全文
posted @ 2021-07-13 21:31 shuitiangong 阅读(45) 评论(0) 推荐(0) 编辑
摘要: 题目链接 #题目大意 给你一个字符串s,让你用s中的字符构造t,使得t通过交换相邻的字符变成s的最小交换次数最大。 #解题思路 结论是相同的字符都放一起结果不会更差(不会证)。然后因为只有4个字符,所以可以用全排列枚举所有方案,然后求逆序数。因为就只有4个字符,且都是相连的,所以可以先求出每个字符换 阅读全文
posted @ 2021-05-30 10:33 shuitiangong 阅读(113) 评论(0) 推荐(0) 编辑
摘要: 题目链接 #题目大意 求n个数的子序列的最大异或和。 #解题思路 求出n个数的线性基并排序,然后将k二进制异或上线性基中对应的代表元素即可。 #代码 const int maxn = 2e5+10; ll arr[maxn]; vector<ll> b; //b中存的每个二进制位的代表元素 void 阅读全文
posted @ 2021-05-27 20:49 shuitiangong 阅读(45) 评论(0) 推荐(0) 编辑
上一页 1 2 3 4 5 6 7 8 9 ··· 32 下一页