题解: 神题...我看到的时候直接吓懵了... 这是一道STL题...否则可能要写可持久化ETT或者可持久化Toptree? 用bitset来维护每个蘑菇上哪里有杂草,那么 对于操作1和操作2:可以预处理每个点为跟的bitset: 对于操作3和操作4:预处理两个点到根这条链上的bitset,先异或再或两个点的lca的bitset: 对于操作5和操作6:直接暴力区间清零即可: 询问直接贪心,由于随机所以复杂度O(玄学)(实际上应该是$O(\frac{n}{32}+\frac{n}{ln200})$…
题解: 好题!我的结论很接近正解了... 把一个数化成二进制,每次至少要拿走一位,最多全拿走,不能不拿.那么这就是一个经典的Nim问题了,子树异或起来就是根节点的答案,随便递推一下就行了. 代码: #include<algorithm> #include<iostream> #include<cstring> #include<cstdio> #include<cmath> #include<queue> #define inf 21…
题解: 好题!! 这题似乎能上我代码长度记录的前五? 调试时间长度应该也能上前五QAQ 首先题目要求的明显就是最小割,当然在整个森林上求Q次最小割肯定是会GG的,所以我们需要一个能快速求最小割的算法——最小割树. 最小割树,也叫分治最小割,就是通过预处理把原本的图缩成一颗树,树上两个节点路径上的最小边权就是它们的最小割,这个用树上倍增可以随便维护. 大概思想就是先求一次最小割,把划分出的S和T两个点集继续求最小割,向下分治然后连边缩点. 这题先对每个州预处理最小割树,州和州之间用KD树求出距离最…
北京集训的题都是好题啊~~(于是我爆0了) 注意到一个重要的性质就是期望是线性的,也就是说每一段的期望步数可以直接加起来,那么dp求出每一段的期望就行了... 设$f_i$表示从$i$出发不回到$i$直接到达终点的概率,显然期望步数就是$\frac{1}{f_i}$: 考虑转移,设下一个事件概率为$p$,则 如果下一个事件是敌人:$f_i=f_{i+1}*p$ 如果下一个事件是旗子: $f_{i}=(1-p)*(1-f_{i+1})*(1+p*(1-f_{i+1})+p^{2}*(1-f_{i+…
Portal --> broken qwq Description 一开始有个蘑菇,蘑菇里面有\(n\)个房间,是一棵有根树,\(1\)号是根,每个房间里面都有杂草,现在要支持以下操作:将某个指定蘑菇复制一份作为一个新的蘑菇:将蘑菇\(v\)合并到蘑菇\(u\)中,有杂草的房间取并(合并后\(v\)不会消失):某个蘑菇子树除草/除子树外除草:某个蘑菇路径除草/除路径外除草:某个蘑菇标号为\(l\sim r\)房间除草/除了这些房间外除草:查询清除某个蘑菇上面所有杂草的时间:一单位时间内可以除最多…
Description Solution bitset是个好东西啊..强行压位什么的真是够orz. 由于所有的蘑菇上房间的长相是一样的,我们针对每个房间,算出它到根节点的bitset和以它为根的子树的bitset. 每次新开一个蘑菇,为了防止被卡空间,我们只是把指针指向蘑菇u的bitset,并且cnt[u]++.只有当对这个新蘑菇进行操作的时候,才给它单独开一个 bitset. 本题的题解一句话-优雅的暴力. Code #include<iostream> #include<cstdio…
Time Limit: 1000 ms   Memory Limit: 256 MB Description 题解 状态表示: 这题的状态表示有点难想...... 设$f_i$表示第$i$个事件经过之后,到达终点之前,不再回到事件$i$或事件$i$的左边的概率,反过来说就是可以在右边乱绕,若事件$i$的位置为pos,“右边”指的就是$(pos,h]$. 我们将第$i$个事件到第$i+1$个事件中间这一段路程记为$S_i$,那么期望经过$S_i$的次数就为$1/f_i$. 为什么是$1/f_i$呢…
Description 题解 (这可是一道很早就碰到的练习题然后我不会做不想做,没想到在Contest碰到欲哭无泪......) 题目大意是寻找三点对的个数,使得其中的三个点两两距离都为d. 问题在于,这个d不是定值啊,这使得DP的进行比较困难. 于是这个神奇解法在DP过程中把d省去了! 状态表示 $f [u][i]$: 以u为根的子树内,到u的距离为i的节点个数,$f [u][0]=1$ . $g [u][i]$:以u为根的子树内,存在多少点对 (a,b),它们到它们的lca的距离都为d,且它…
Description 题解 题目说这是一个具有神奇特性的数列!这句话是非常有用的因为我们发现,如果套着这个数列的定义再从原数列引出一个新数列,它居然还是一样的...... 于是我们就想到了能不能用多点数列套着来加速转移呢? 但是发现好像太多数列套起来是可以烦死人的...... 我们就采用嵌套两次吧(第三次以后规律就不明显了),记原数列为A,第一层嵌套为B,第二层嵌套为C. 我们其实可以发现一些规律,对于Ci,它对应了B中i的个数:对于Bi,它对应了A中i的个数. 稍加处理即可,我们一边计算一边…