LG3781 [SDOI2017]切树游戏】的更多相关文章

题意 题目描述 小Q是一个热爱学习的人,他经常去维基百科学习计算机科学. 就在刚才,小Q认真地学习了一系列位运算符,其中按位异或的运算符\(\oplus\)对他影响很大.按位异或的运算符是双目运算符.按位异或具有交换律,即\(i \oplus j = j \oplus i\). 他发现,按位异或可以理解成被运算的数字的二进制位对应位如果相同,则结果的该位置为\(0\),否则为\(1\),例如:\(1(01) \oplus 2(10) = 3(11)\). 他还发现,按位异或可以理解成参与运算的数…
[BZOJ4911][SDOI2017]切树游戏(动态dp,FWT) 题面 BZOJ 洛谷 LOJ 题解 首先考虑如何暴力\(dp\),设\(f[i][S]\)表示当前以\(i\)节点为根节点,联通子树权值和为\(S\)的方案数,转移就是\(FWT\)的卷积,最后只需要把所有的\(f[i][k]\)全部加起来就可以得到最终的答案. 于是这样子的复杂度就是\(O(Qnmlogm)\).但实际上转移的时候不需要\(FWT\)回来,直接拿点值表示的数组做就可以了,这样子可以少一个\(log\). 那么…
BZOJ 4911 切树游戏 重构了三次.jpg 每次都把这个问题想简单了.jpg 果然我还是太菜了.jpg 这种题的题解可以一眼秒掉了,FWT+动态DP简直是裸的一批... 那么接下来,考虑如何维护信息. 每个点维护$4$个信息,分别表示,这条链自底向上,自上向底,两端都在这条链的轻儿子里,和两端为链头的方案数. 这样的话,正常询问就没啥问题了,只需要每次修改和初始化的时候FWT一下,然后最后FWT回来即可. 然后这样做的话,因为FWT没有可减性(没法求逆),所以每次需要将轻儿子用线段树维护一…
题目分析: 好题.本来是一道好的非套路题,但是不凑巧的是当年有一位国家集训队员正好介绍了这个算法. 首先考虑静态的情况.这个的DP方程非常容易写出来. 接着可以注意到对于异或结果的计数可以看成一个FWT的过程,进一步地可以注意到FWT在中途没有还原的必要.从FWT的过程中我们可以发现FWT具有可加性和交换律结合律. 这样原问题可以在静态的情况下通过树形DP做到$O(nm)$. 考虑动态的问题.根据<神奇的子图>命题报告及其拓展中描述的算法五,我们应该不难想到基于树链剖分的这样的做法. 首先对树…
考虑维护原树的lct,在上面dp,由于dp方程特殊,均为异或卷积或加法,计算中可以只使用fwt后的序列 v[w]表示联通子树的最浅点为w,且不选w的splay子树中的点 l[w]表示联通子树的最浅点在w的lct子树中,且选w的splay子树中极左点(w的splay子树为{w}+{u的splay子树,满足u==ch[w][0]||u==ch[w][1]}) r[w]表示联通子树的最浅点在w的lct子树中,且选w的splay子树中极右点 lr[w]表示联通子树的最浅点为w,且选w的splay子树中所…
题目 二轮毒瘤题啊 辣鸡洛谷竟然有卡树剖的数据 还是\(loj\)可爱 首先这道题没有带修,设\(dp_{i,j}\)表示以\(i\)为最高点的连通块有多少个异或和为\(j\),\(g_{i,j}=\sum_{k\in Tree(i)}dp_{k,j}\) (\(k\in Tree(i)\)表示\(k\)在\(i\)子树内部) 我们可以直接把每一个权值\(fwt\)一下,大力合并就好了,合并直接对位相乘,只需要在最后\(fwt\)回来就好了 但是我们有了修改,就变成了一道非常恶心的\(ddp\)…
洛谷题面传送门 SDOI 2017 R2 D1 T3,nb tea %%% 讲个笑话,最近我在学动态 dp,wjz 在学 FWT,而我们刚好在同一天做到了这道题,而这道题刚好又是 FWT+动态 dp 首先考虑怎样暴力计算答案,我们记 \(dp_{u,j}\) 表示以 \(u\) 为根的子树中有多少个连通块包含 \(u\) 且权值的异或和为 \(j\),初始 \(dp_{u,val_u}=1\),每次遍历 \(u\) 的一个子树 \(v\) 就对这个子树就对这两个子树的 \(dp\) 做一个合并,…
题解 把所有的数组一开始就FWT好然后再IFWT回去可以减小常数 从13s跑到0.7s-- 可以参照immortalCO的论文,感受一下毒瘤的动态动态DP 就是用数据结构维护线性递推的矩阵的乘积 由于所有轻儿子\(F(z) + z^{0}\)的乘积做除法太麻烦,我们用一个线段树维护每个点所有的轻儿子即可 代码 #include <bits/stdc++.h> #define enter putchar('\n') #define space putchar(' ') #define fi fi…
还是loj的机子快啊... 普通的DP不难想到,设F[i][zt]为带上根玩出zt的方案数,G[i][zt]为子树中的方案数,后面是可以用FWT优化的 主要是复习了下动态DP #include<cstdio> #include<iostream> #include<cstring> #include<cstdlib> #include<algorithm> #include<cmath> using namespace std; co…
LOJ 思路 显然是要DP的.设\(dp_{u,i}\)表示\(u\)子树内一个包含\(u\)的连通块异或出\(i\)的方案数,发现转移可以用FWT优化,写成生成函数就是这样的: \[ dp_{u}=x^{val_u}\prod (dp_v+1) \] 最后答案是所有DP值的和,于是获得了朴素的\(O(nmQ)\)的做法.(中间运算全部用点值表示) 显然是要用动态DP优化的,我们另外记一个\(S_u\)表示子树的DP值和自己的DP值的和,写成矩阵的形式,就是 \[ \left[\begin{ma…