『保卫王国 树上倍增dp』】的更多相关文章

保卫王国 Description Z 国有n座城市,n - 1条双向道路,每条双向道路连接两座城市,且任意两座城市 都能通过若干条道路相互到达. Z 国的国防部长小 Z 要在城市中驻扎军队.驻扎军队需要满足如下几个条件: 一座城市可以驻扎一支军队,也可以不驻扎军队. 由道路直接连接的两座城市中至少要有一座城市驻扎军队. 在城市里驻扎军队会产生花费,在编号为i的城市中驻扎军队的花费是pipi. 小 Z 很快就规划出了一种驻扎军队的方案,使总花费最小.但是国王又给小 Z 提出 了m个要求,每个要求规…
题目链接 这个$dark$题,嗯,不想说了. 法一:动态$dp$ 虽然早有听闻动态$dp$,但到最近才学,如果你了解动态$dp$,那就能很轻松做出这道题了.故利用这题在这里科普一下动态$dp$的具体内容. 我们先不考虑点上的强制选不选的限制,这是一个最小权边覆盖问题,大家肯定都会这道题的$O(nm)$的做法,这是一个很经典的树形$dp$.具体来讲就是一下两个转移: $$f_{x, 0} = \sum_{v} f_{v, 1} \qquad  f_{x, 1} = a_{x} + \sum_{v}…
我的倍增解法吊打动态 \(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]…
暴力dp非常显然,设f[i][0/1]表示i号点不选/选时i子树内的答案,则f[i][0]=Σf[son][1],f[i][1]=a[i]+Σmin(f[son][0],f[son][1]). 注意到B的部分分,可以想到每次修改只会对修改点到根的路径上的点的dp值产生影响. 考虑如何优化修改路径这一过程,先看只修改一个点的情况. 由于每次修改并非累积,事实上应该考虑一种预处理来快速得到答案,并且发现其实最终我们只需要f[root][].容易想到倍增.设f[x][k][0/1][0/1]表示x号点…
前言 传送门 很多人写了题解了,我就懒得写了,推荐一篇博客 那就分享一下我的理解吧(说得好像有人看一样 对于每个点都只有选与不选两种情况,所以直接用倍增预处理出来两种情况的子树之内,子树之外的最值,最终答案以拼凑的方式得出 如果这个题要修改权值的话就真的只能用动态dp了(好像还有那个什么全局平衡树 我真的觉得去年出题人只是想出一个倍增,结果被动态dp干了(Ark:出题人真的只是想出一个动态dp #include<cstdio> #include<cstring> #include&…
最长等差数列(51nod 1055) Description N个不同的正整数,找出由这些数组成的最长的等差数列. 例如:1 3 5 6 8 9 10 12 13 14 等差子数列包括(仅包括两项的不列举) 1 3 5 1 5 9 13 3 6 9 12 3 8 13 5 9 13 6 8 10 12 14 其中6 8 10 12 14最长,长度为5. Input Format 第1行:N,N为正整数的数量(3 <= N <= 10000). 第2 - N+1行:N个正整数.(2<= A…
The Counting Problem Description 求 [L,R]内每个数码出现的次数. Input Format 若干行,一行两个正整数 L 和 R. 最后一行 L=R=0,表示输入结束. Output Format 若干行,对于每个询问做出回答,每行 10 个整数,依次表示 0 至 9 出现的次数. 输入的最后一行不属于询问,因此不必对此做出回答. Sample Input 1 10 114 514 233 666 19260421 19260817 19190504 1989…
快乐链覆盖 Description 给定一棵 n 个点的树,你需要找至多 k 条互不相交的路径,使得它们的长度之和最大 定义两条路径是相交的:当且仅当存在至少一个点,使得这个点在两条路径中都出现 定义一条路径的长度为该路径经过的点的数量 这个题非常简单,非常传统,但为了让它变成一道能一个顶俩的题,出题人决定让你输出任意一组方案. Input Format 第一行一个正整数 T 表示数据组数 接下来,对于每组数据: 第一行两个整数 n,kn,k 接下来 n−1 行,每行两个整数 a,b 描述一条树…
题意 求最小权值点覆盖. mmm次询问,每次给出两个点,分别要求每个点必须选或必须不选,输出每次的最小权值覆盖或者无解输出−1-1−1 题解 强制选或者不选可以看做修改权值为±∞\pm\infin±∞. 那么就是这道板题了. CODE #include <bits/stdc++.h> using namespace std; typedef long long LL; template<class T>inline void read(T &x) { char ch; in…
qwq非正解. 但是能跑过. 1e5 log方还是很稳的啊 首先,考虑最普通的\(dp\) 令\(dp1[x][0]表示不选这个点,dp1[x][1]表示选这个点的最大最小花费\) 那么 \(dp1[x][0]=\sum dp[p][1]\) \(dp1[x][1]=\sum min(dp[p][1],dp[p][0])+val[x]\) 根据套路,我们要树链剖分+改变\(dp\)数组,我们令\(f[x]\)表示忽略重儿子的\(dp\)值,用\(g\)表示正常的\(dp\)值的话 那么不难发现转…