题目直通车:http://codeforces.com/problemset/problem/1029/E 思路大意:在树上做dp,依次更新ar数组,ar[i]表示以i为根节点的子树对答案的最小贡献值,依次更新即可,具体细节见代码 /* 13 1 2 1 3 1 4 4 5 4 6 4 7 7 8 7 9 7 10 10 11 10 12 10 13 output:2 */ #include<iostream> #include<cstdio> #include<cmath&…
题意 有一棵树,q个询问,每次询问,指定一个点做树根,再给定k个点,要求把这些点分成不超过m组的方案数,分配的限制是任意两个有祖先关系的点不能分在同一组.题目还保证了所有的询问的k加起来不超过1e5. 思路 如果直接在原树上DP计数,那么q次询问下的DP总复杂度是平方级别的,显然不对. 由于询问点数的总和很少,所以考虑在虚树上计数.(不了解虚树的可以先学习一下,大概思想是根据询问的点来重新建一颗包含关键信息,但是规模较小的树)于是多次询问的问题就解决了. 难点转到考虑虚树上的dp计数.我们按照d…
题意: 这是一颗有n-1条边的无向树 , 在树上加最少的边使树的1节点到其他节点的距离最多为 2 : 分析:很容易考虑的贪心的做法,但是该如何的贪心呢 ? 我一开始是打算贪心节点的儿子最多那一个 , 但这样是不行的,举个反例子例:1-2 : 2-3 : 3-4 : 3-5 : 3-6 : 3-7 : 4-8 : 4-9 : 5-10 : 5-11 : 6-12 : 6-13 : 7-14 : 7-15 : 可自己做出图,按这样的贪心出来的结果是5 : 结果是4,所以这样的贪心是不行的 : 我们在…
传送门:点我 Tree and Permutation Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 2191    Accepted Submission(s): 826 Problem Description There are N vertices connected by N−1 edges, each edge has its…
Problem - D - Codeforces  Fix a Tree 看完第一名的代码,顿然醒悟... 我可以把所有单独的点全部当成线,那么只有线和环. 如果全是线的话,直接线的条数-1,便是操作数. 如果有环和线,环被打开的同时,接入到线上.那就是线和环的总数-1. 如果只有环的话,把所有的环打开,互相接入,共需n次操作. #include <cstdio> #include <algorithm> using namespace std; ; int cur[maxn];…
E - Cell Phone Network POJ - 3659 题目大意: 给你一棵树,放置灯塔,每一个节点可以覆盖的范围是这个节点的所有子节点和他的父亲节点,问要使得所有的节点被覆盖的最少灯塔数量. 考虑每一个节点要被覆盖应该如何放置灯塔. 如果一个节点被覆盖 1 该节点放了灯塔  2 该点的父亲节点放了灯塔  3 该点的儿子节点放了灯塔. dp[u][0] 表示这个节点的儿子节点放了灯塔 dp[u][1] 表示这个点本身放了灯塔 dp[u][2] 表示这个点的父亲节点放了灯塔 转移方程,…
题意:给定一棵树中,让你计算它的直径,也就是两点间的最大距离. 析:就是一个树上DP,用两次BFS或都一次DFS就可以搞定.但两次的时间是一样的. 代码如下: #include<bits/stdc++.h> using namespace std; const int maxn = 1e5 + 5; vector<int> G[maxn]; int f[maxn], g[maxn], l[maxn]; int dfs(int root, int fa){ if(f[root] !=…
D. The Fair Nut and the Best Path 题意:给出一张图 点有权值 边也要权值 从任意点出发到任意点结束 到每个点的时候都可以获得每个点的权值,而从边走的时候都要消耗改边的边权,如果当前值小于边的边权,就走不通,问从任意点出发到任意点结束的可以获得的最大权多少(其中到一个点结束的时候也能获得改点的值) 思路:一个很明显的树上dp的问题 \(dp[i]\)表示以i为起点的可以获得的最高的权值是多少 \(dp[i]=w[i]+max(son(dp[j]))\) 其中j为i…
Prelude 题目在这里:ο(=•ω<=)ρ⌒☆ Solution 蒟蒻__stdcall的第一道虚树题qaq. 首先很容易发现,这个排列是假的. 我们只需要求出每对点之间的颜色数量,然后求个和,然后再乘以\((n-1)!\)再乘以\(2\)就好啦! 如何求出"每对点之间的颜色数量之和"呢? 似乎点分可以做,并且fc确实写出了点分的做法,但是有更简(ma)单(nong)的虚树做法. 我们对每种颜色分开考虑,对于每种颜色\(c\),我们考虑有多少条路径经过了颜色\(c\),然后再…
codeforces Good bye 2016 E 线段树维护dp区间合并 题目大意:给你一个字符串,范围为‘0’~'9',定义一个ugly的串,即串中的子串不能有2016,但是一定要有2017,问,最少删除多少个字符,使得串中符合ugly串? 思路:定义dp(i, j),其中i=5,j=5,因为只需要删除2016当中其中一个即可,所以一共所需要删除的字符和需要的字符为20176,因此i和j只要5就够了. 然后转移就是dp(i,i) = 0, 如果说区间大小为1的话,那么如果是2017中的一个…