Codeforces 1281E
题意:一棵$2n$个点的树让你分配$n$对居民在点上求每对居民之间路径和的最小值和最大值
思路:考虑一条边$(u, v)$
1.若要使答案尽可能大,那么这条边应该取到尽可能多次。显然,如果$u, v$的子树大小分别表示成$sz_u, sz_v$,那么这条边最多被覆盖$min(sz_u, sz_v)$次,算出每条边最多被取到的次数再乘以边长就是最大值了。
2.若要使答案尽可能小,那么我们应该让每条边最多取到$1$次,我们考虑$sz_u, sz_v$的奇偶性,发现他们是同奇偶性的。如果都是偶数,那么这条边就可以不取,因为两个子树可以内部完成,否则这条边必须取到,因为假设两个内部尽可能多的完成了,依旧会分别至少剩下$1$个点没分配,所以这条边必定被覆盖。
#include <bits/stdc++.h>
#define DBG(x) cerr << #x << " = " << x << endl using namespace std;
typedef long long ll; const int N = 2e5 + 5; int n, head[N], tot, sz[N]; ll mx, mn;
struct Enode {
int to, nxt, w;
} edge[N * 2]; void addedge(int u, int v, int w) {
edge[tot].to = v;
edge[tot].w = w;
edge[tot].nxt = head[u];
head[u] = tot++;
} void dfs(int u, int f) {
sz[u] = 1;
for(int i = head[u]; i != -1; i = edge[i].nxt) {
int v = edge[i].to, w = edge[i].w;
if(v == f) continue;
dfs(v, u);
if(sz[v] & 1) mn += w;
mx += (ll)w * min(sz[v], n - sz[v]);
sz[u] += sz[v];
}
} void solve() {
scanf("%d", &n);
for(int i = 1; i <= 2 * n; i++) head[i] = -1, sz[i] = 0; tot = mn = mx = 0;
n = 2 * n;
for(int i = 1, u, v, w; i < n; i++) {
scanf("%d%d%d", &u, &v, &w);
addedge(u, v, w);
addedge(v, u, w);
}
dfs(1, -1);
printf("%lld %lld\n", mn, mx);
} int main() {
int cs; for(scanf("%d", &cs); cs--; solve());
}
Codeforces 1281E的更多相关文章
- python爬虫学习(5) —— 扒一下codeforces题面
上一次我们拿学校的URP做了个小小的demo.... 其实我们还可以把每个学生的证件照爬下来做成一个证件照校花校草评比 另外也可以写一个物理实验自动选课... 但是出于多种原因,,还是绕开这些敏感话题 ...
- 【Codeforces 738D】Sea Battle(贪心)
http://codeforces.com/contest/738/problem/D Galya is playing one-dimensional Sea Battle on a 1 × n g ...
- 【Codeforces 738C】Road to Cinema
http://codeforces.com/contest/738/problem/C Vasya is currently at a car rental service, and he wants ...
- 【Codeforces 738A】Interview with Oleg
http://codeforces.com/contest/738/problem/A Polycarp has interviewed Oleg and has written the interv ...
- CodeForces - 662A Gambling Nim
http://codeforces.com/problemset/problem/662/A 题目大意: 给定n(n <= 500000)张卡片,每张卡片的两个面都写有数字,每个面都有0.5的概 ...
- CodeForces - 274B Zero Tree
http://codeforces.com/problemset/problem/274/B 题目大意: 给定你一颗树,每个点上有权值. 现在你每次取出这颗树的一颗子树(即点集和边集均是原图的子集的连 ...
- CodeForces - 261B Maxim and Restaurant
http://codeforces.com/problemset/problem/261/B 题目大意:给定n个数a1-an(n<=50,ai<=50),随机打乱后,记Si=a1+a2+a ...
- CodeForces - 696B Puzzles
http://codeforces.com/problemset/problem/696/B 题目大意: 这是一颗有n个点的树,你从根开始游走,每当你第一次到达一个点时,把这个点的权记为(你已经到过不 ...
- CodeForces - 148D Bag of mice
http://codeforces.com/problemset/problem/148/D 题目大意: 原来袋子里有w只白鼠和b只黑鼠 龙和王妃轮流从袋子里抓老鼠.谁先抓到白色老鼠谁就赢. 王妃每次 ...
- CodeForces - 453A Little Pony and Expected Maximum
http://codeforces.com/problemset/problem/453/A 题目大意: 给定一个m面的筛子,求掷n次后,得到的最大的点数的期望 题解 设f[i]表示掷出 <= ...
随机推荐
- [R语言] ggplot2入门笔记4—前50个ggplot2可视化效果
文章目录 通用教程简介(Introduction To ggplot2) 4 ggplot2入门笔记4-前50个ggplot2可视化效果 1 相关性(Correlation) 1.1 散点图(Scat ...
- BBS升级版
BBS项目 项目的前期准备 1.django2.2 创建一个django目录 (需要配置环境变量和数据库) 'DIRS': [os.path.join(BASE_DIR, 'templates'), ...
- 一个关于sum over的疑问
参考: http://www.cnblogs.com/lanzi/archive/2010/10/26/1861338.html select * from bitest.tmp_0222_zym ; ...
- js节流防抖 减少服务器请求
- SQL优化的一些方法
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...
- 05安装一个Hadoop分布式集群
安装一个Hadoop分布式集群 最小化的Hadoop已经可以满足学习过程中大部分需求,但是为了研究Hadoop集群运行机制,部署一个类生产的环境还是有必要的.因为集群机器比较少,笔者没有配置ssh,所 ...
- 走进Linux
走进Linux Linux诞生 BSD,Unix,Minix都是操作系统. 1991年,林纳斯托瓦兹在上大学时,对操作系统很好奇.但是由于 386 BSD 还没有出来.可是他不喜欢他的 386 ...
- MySQL-多表查询的两种方法、Navicat、python操作MySQL
1.多表查询的两种方法 1.连表操作: 1.1:inner join:内连接,将两张表共同的部分连接起来生成一张新表.拼接顺序是把后面的表拼在前面的表,如果颠倒位置结果不同. select * fro ...
- spring cloud alibaba - Nacos 下载安装
1.关于名字 前四个字母分别为Naming和Configuration的前两个字母,最后的s为Service 2.是什么 一个更易于构建云原生应用的动态服务发现,配置管理和服务管理中心.是注册中心和配 ...
- 微服务学习计划——SpringCloud
微服务学习计划--SpringCloud 在学习并掌握了众多基础框架之后,我们的项目繁杂且难以掌握,那么我们就需要开启一门新的课程,也就是我们常说的微服务架构 随着互联网行业的发展,对服务的要求也越来 ...