NOIP2018 保卫王国(动态DP)】的更多相关文章

可以直接套动态dp,但因为它询问之间相互独立,所以可以直接倍增记x转移到fa[x]的矩阵 #include<bits/stdc++.h> #define CLR(a,x) memset(a,x,sizeof(a)) using namespace std; typedef long long ll; typedef pair<int,int> pa; ; const ll inf=1e17; inline ll rd(){ ll x=;; ;c=getchar();} +c-',c…
Code: // luogu-judger-enable-o2 #include<bits/stdc++.h> #define ll long long #define lson (now<<1) #define rson ((now<<1)|1) #define setIO(s) freopen(s".in","r",stdin) #define maxn 300000 const long long inf = 1000000…
题目大意 这还不是人尽皆知? 有一棵树, 每个节点放军队的代价是\(a_i\), 一条边连接的两个点至少有一个要放军队, 还有\(q\)次询问, 每次规定其中的两个一定需要/不可放置军队, 问这样修改以后的最小代价. 解题思路 考虑一个朴素的DP, 设\(f_{x,0/1}\)表示这个点选/不选的最小代价. 显然有 \[f_{x,0}=\sum f_{y,1} \] \[f_{x,1}=a_x+\sum \min(f_{y,0}, f_{y,1}) \] 其中\(y\)是\(x\)的儿子. 最后…
此题场上打了一个正确的$44pts$,接着看错题疯狂$rush$“正确”的$44pts$,后来没$rush$完没将之前的代码$copy$回去,直接变零分了..... 这一题我们显然有一种$O(nm)$的做法 令$f[u][0]$表示在以$u$为根的子树内部署军队,且$u$不部署军队的最小代价. 令$f[u][1]$表示在以$u$为根的子树内部署军队,且$u$部署军队的最小代价. 结合题意(重要!)不难推出: $f[u][0]=\sum_{v∈son[u]} f[v][1]$ $f[u][1]=v…
题目大意: emmmmm 题解: QAQ #include <cstdio> #include <cstring> #include <iostream> using namespace std; #define ll long long #define ri register int #define rep(io, st, ed) for(ri io = st; io <= ed; io ++) #define drep(io, ed, st) for(ri i…
最小权覆盖集 = 全集 - 最大权独立集 强制取点.不取点可以使用把权值改成正无穷或负无穷实现 接下来就是经典的"动态最大权独立集"了 O(nlogn). 这不是我说的,是immortalCO大佬说的 于是我调了一万年极值,终在\(\frac{LLONG\_MAX}{3}\)时\(11s\)卡过... 知道最小权覆盖集 = 全集 - 最大权独立集,就是模板\(DDP\)了 #include <cstdio> #include <iostream> #includ…
做法(倍增) 最好写的一种 以下0为不选,1为选 \(f_{i,0/1}\)为\(i\)子树的最小值,\(g_{i,0/1}\)为除i子树外的最小值 \(fh_{i,j,0/1,0/1}\)为确定\(i\)与\(i\)的\(2^j\)级祖先的状态,\(i\)的\(2^j\)祖先不包括i子树的最小值 这个转移挺好想的,故不赘述 查询 考虑边倍增爬上去,边处理即可 #include<bits/stdc++.h> typedef long long LL; const LL maxn=1e6+9,i…
\(\mathcal{NOIP2018}\) 保卫王国 - 竞赛题解 按某一个炒鸡dalao名曰 taotao 的话说: \(\ \ \ \ \ \ \ \ \ "一道sb倍增题"\) 顺便提一下他的[题解](因为按照这个思路写的,所以代码看起来也差不多) 因为比较复(胡)杂(炸),可能需要理解久一点 『题目』 参见 [洛谷 P5024] 『解析』 一.初步思考 如果不考虑多次询问的话,显然可以进行一次简单的树形DP,特殊判断一下当前的点(也就是城市)能不能选(放军队)就行了~ 但是显…
我的倍增解法吊打动态 \(dp\) 全局平衡二叉树没学过 先讲 \(NOIP\) 范围内的倍增解法. 我们先考虑只有一个点取/不取怎么做. \(f[x][0/1]\) 表示取/不取 \(x\) 后,\(x\) 子树内的最小权覆盖集,\(g[x][0/1]\) 表示取/不取 \(x\) 后,除 \(x\) 子树的最小权覆盖集.那么这两个数组可以 \(O(n)\) 预处理出来. \[f[x][0]+=f[y][1]\] \[f[x][1]+=min(f[y][0],f[y][1])\] \[g[y]…
题目大意:给一颗有点权的树,每次规定两个点选还是不选,求这棵树的最小权点覆盖. 题解 ZZ码农题. 要用动态dp做,这题就是板子,然鹅并不会,留坑代填. 因为没有修改,所以可以静态倍增. 我们先做一遍正常的树形dp,求出g[i][0/1],0/1表示当前节点选或不选. 然后我们再倒腾出一个数组l[i][0/1]表示从当前点作为根,再扣掉当前子树的答案. 然后倍增处理dp[i][j][0/1][0/1]表示从i向上2i长度的链,起点和终点的选择情况,表示以下区域的答案. 比如这条黑色的链,它表示的…