摘要:
传送门 解题思路 若干平衡树,每次操作有两种,一是合并两个Splay,二是查询某一个点所在的平衡树里的第k小的点的编号。 首先用并查集维护某个点在哪个平衡树里,然后rt[i]记录编号为i的平衡树的根。 每次合并时启发式合并,直接把小的树的每个点暴力insert到大树里。 查询正常操作即可。 为了方便 阅读全文
摘要:
传送门 解题思路 若强制在线,可以考虑用树剖+主席树,相当于每次询问两个点之间的路径上在 \(i-C_i\) 时刻之前开始搜集情报的人数。 但是这题可以离线,于是可以把询问按照 \(i-C_i\) 离线一下,就可以用线段树/树状数组来维护了。 注意一定要区分原编号和dfn编号。 时间复杂度:\(O( 阅读全文
摘要:
传送门 解题思路 平衡树板子题。 每次所有的数加或减可以O(1)加或减限制,然后删除掉小于当前限制的点,统计答案。 加点时把原权值减去sum然后扔到Splay中,询问第k大时也要把查询的答案加上一个sum。 AC代码 #include<iostream> #include<cstdio> #incl 阅读全文
摘要:
传送门 解题思路 首先考虑无解的情况: 首尾距离 \(<s\) 第一个石头到 \(0\) 的距离 \(<s\) 或第二个石头到 \(n+1\) 的距离 \(<s\) 存在一个 \(a[i+1]-a[i-1]<s\) 判断完无解的情况,考虑构造答案。 最简单的方法是过去的时候跳1,3,5,7,9,…… 阅读全文
摘要:
传送门 解题思路 先二分答案,然后做一个在树上从叶子节点向上的贪心,让每个叶子尽可能取满。 当然也可以直接树形dp,O(n)。 注意如果WA on test 5,说明爆long long了,因为二分mid可以达到1e14,然后贪心过程中累加可能爆掉。 这时候设置一个inf,如果当前sum>inf,s 阅读全文
摘要:
传送门 解题思路 非常好的一道题。 一开始错误的认为对于一个确定的左端点,合法的区间一定是右面的一个前缀。 但事实上并不是。 因为区间[k+1,2k]的起点不确定,所以不满足单调性。 所以正确的解法是先看区间[1,k],找到最大的k(因为这个区间满足单调性),然后回滚,看看最大k是多少可以使[k+1 阅读全文
摘要:
传送门 解题思路 用平衡树维护摧毁的房屋。 摧毁等于insert,修复等于delete,询问等于查询前驱后继。 为了方便先扔进一个0点和n+1点。 注意查询时先进行判断当前房屋是否已经摧毁。 AC代码 #include<iostream> #include<cstdio> #include<cstr 阅读全文
摘要:
传送门 解题思路 Splay如何维护序列呢? 以序列下标作为val值,扔到Splay中。 因为有区间翻转操作,所以实际上并不能保证绝对的按照val值排序,也就是说Splay的中序遍历结果是真正的序列,而val值对应的是当前序列的每个元素原来的位置。 与普通的Splay的区别在于多了一个区间翻转操作, 阅读全文
摘要:
传送门 Splay 细节是真他妈多,写了一天,写吐了。 后悔没先学treap了。 需要实现以下函数: void Init():重置整棵树(删除了整棵树的时候用) int New(int val,int fa):新建一个节点,权值为val,父亲为fa,返回节点编号 void Delete(int x) 阅读全文
摘要:
任何一个ICG(公平组合游戏)都可以转化成一个有向图移动问题,从而使用SG函数求解。 SG函数的定义为:SG(u)=mex{SG(v)}。 mex表示集合中第一个未出现的数字。 SG函数可以用类似拓扑序的方式,从最终状态一步步向前推。 最后若起点的SG函数值不为0,则先手必胜。 若多张图多个起点? 阅读全文
摘要:
点分治 采用分治思想。对树上路径问题进行查询时,把路径分成两部分,一部分是经过根节点的路径,一部分是不经过根节点的路径。 而在处理不经过根节点的路径时,可以才有分治思想,递归到左右子树进行求解。 这样复杂度是 \(O(n^2)\) 的,但是若我们每次选取的根节点都是要求解的子树的重心,则复杂度可以优 阅读全文
摘要:
传送门 传送门 判断节点u的子树是否是对称二叉树的方法: 判断hash1[l[u]]是否等于hash2[r[u]]。 其中hash1中存的是按照根左右的顺序的哈希值,hash2存的是按照根右左顺序的哈希值。 当两个hash值相等时,即为对称二叉树。 单哈希和双哈希貌似都不太稳定,而用自然溢出即可AC 阅读全文
摘要:
传送门 解题思路 关键点:根据线性基的性质,若序列数字个数大于等于30,则一定有异或值为0的两个集合。 所以对于每个询问,先判断两个点之间的路径长度是否大于等于30,若小于30,直接暴力找,线性基判断,否则直接判断。 对于每次修改,可以用线段树维护树剖。 AC代码 #include<iostream 阅读全文
摘要:
传送门 解题思路 首先背过线性基的一个性质吧(因为我不会证明): 线性基里的每一个异或值出现的次数相等,为 \(2^{n-k}\) 。 然后这题就变成统计某个数是第几大异或值了。 分类讨论在归纳一下: 假设询问的数字是q。当处理到第i位且q的这一位为1,且线性基这一位有数,则 当前面位异或起来得到的 阅读全文
摘要:
传送门 前置知识: Nim博弈 线性基 解题思路 注意两人各进行一次操作,所以目的就是要使对方不管怎么拿,都不能到达一个异或和为0的状态。 所以相当于第一次操作结束后,必须保证任意元素异或值不为0。 这就很典型的线性基了,并且和[BJWC2011]元素这个题完全一样,贪心取即可。 AC代码 #inc 阅读全文