CodeForces 283C World Eater Brothers
题解:
树DP, 枚举每2个点作为国家。 然后计算出最小的答案。
首先我们枚举根, 枚举根了之后, 我们算出每个点的子树内部和谐之后的值是多少。
这样val[root]就是这个root为根的花费。
然后我们再fdfs一遍这棵树。
假如我们枚举u这个点是另一个国家,
则花费就是
1. root --- u 的路径上 保证路径上的点可以从 u 走到 或者就是 root 出发走到。
这个东西可以通过O1求得。
我们假设一个数组 记录下 root ---- u 之间的边。
1 表示为是正向边, -1表示为 反向边。
则我们需要这个数列修改完边的结果为 +++++ ------ 不能出现+-+ 或者 -+-。
现在假设这个数列的长度为len。
我们需要找到一个i 使得 1 <= i 的数都是 1, >i && <= n的数都是 -1。
那对于这个i的花费就是 (i-sum[i])/2 + ( (len-i)-(sum[len] - sum[i])) => (len + sum[len])/2 - sum[i]。 sum为这个数列的前缀和。
可以发现枚举完某个点之后, len + sum[len]都是定值, 需要找到最大的sum[i]就好了, 并且这个sum[i]前面不会改变, 所以我们这个sum[i]也可以做个前缀和, 找到最大的那个值。
2. val[u]
也就是使得u子树和谐的花费。
3. tmp_val
使得除了 root --- u路径上的点都和谐的花费。
也就是上图中的 虚线框起来的边的花费。
这3块总和就是答案了。
然后在所有枚举的过程中找最小值。
代码:
#include<bits/stdc++.h>
using namespace std;
#define Fopen freopen("_in.txt","r",stdin); freopen("_out.txt","w",stdout);
#define LL long long
#define ULL unsigned LL
#define fi first
#define se second
#define pb push_back
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define lch(x) tr[x].son[0]
#define rch(x) tr[x].son[1]
#define max3(a,b,c) max(a,max(b,c))
#define min3(a,b,c) min(a,min(b,c))
typedef pair<int,int> pll;
const int inf = 0x3f3f3f3f;
const int _inf = 0xc0c0c0c0;
const LL INF = 0x3f3f3f3f3f3f3f3f;
const LL _INF = 0xc0c0c0c0c0c0c0c0;
const LL mod = (int)1e9+;
const int N = 4e3;
vector<pll> vc[N];
int val[N];
int ans = inf;
int tmp_val = ;
void dfs(int o, int u){
val[u] = ;
for(pll t : vc[u]){
int v = t.fi;
if(v == o) continue;
dfs(u, v);
val[u] += val[v] + (t.se == -);
}
}
void fdfs(int deep, int sum, int Max, int o, int u){
if(o){
ans = min(ans, (deep+sum)/ - Max+tmp_val+val[u]);
}
for(pll t : vc[u]){
int v = t.fi;
if(v == o) continue;
tmp_val += val[u] - (val[v] + (t.se == -));
fdfs(deep+, sum+t.se, max(Max, sum+t.se),u, v);
tmp_val -= val[u] - (val[v] + (t.se == -));
} }
int main(){
int n;
scanf("%d", &n);
for(int i = , u, v; i < n; ++i){
scanf("%d%d", &u, &v);
vc[u].pb(make_pair(v, ));
vc[v].pb(make_pair(u,-));
}
for(int i = ; i <= n; ++i){
dfs(, i);
ans = min(ans, val[i]);
tmp_val = ;
fdfs(, , ,, i);
}
cout << ans << endl;
return ;
}
CodeForces 283C World Eater Brothers的更多相关文章
- codeforces 283C
给 n 中 钱币.以及每两种钱币的关系,表示,ai 的 个数 要大于 bi 组合成一个价值val,求方案数,好奇妙的一个处理方式,不得不说又学到了 #include<stdio.h> #i ...
- Codeforces Round #148 (Div. 2)
A. Two Bags of Potatoes 枚举倍数. B. Easy Tape Programming (待补) C. Not Wool Sequences 考虑前缀异或和. \[answer ...
- codeforces:855D Rowena Ravenclaw's Diadem分析和实现
题目大意: 提供n个对象,分别编号为1,...,n.每个对象都可能是某个编号小于自己的对象的特例或是成分.认为某个对象的特例的特例依旧是该对象的特例,即特例关系传递,同样一个对象的成分的成分依旧是该对 ...
- Codeforces Round #287 (Div. 2) E. Breaking Good 最短路
题目链接: http://codeforces.com/problemset/problem/507/E E. Breaking Good time limit per test2 secondsme ...
- Codeforces Gym 100269A Arrangement of Contest 水题
Problem A. Arrangement of Contest 题目连接: http://codeforces.com/gym/100269/attachments Description Lit ...
- POJ 2965. The Pilots Brothers' refrigerator 枚举or爆搜or分治
The Pilots Brothers' refrigerator Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 22286 ...
- 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 ...
随机推荐
- Python—三目运算
Python 可通过 if 语句来实现三目运算的功能,因此可以近似地把这种 if 语句当成三目运算符.作为三目运算符的 if 语句的语法格式如下: (True_statements) if (expr ...
- 机房ping监控 smokeping+prometheus+grafana(续) 自动获取各省省会可用IP
一.前言 1.之前的文章中介绍了如何使用smokeping监控全国各省的网络情况:https://www.cnblogs.com/MrVolleyball/p/10062231.html 2.由于之前 ...
- poj2909 欧拉素数筛选
刚刚学了一种新的素数筛选法,效率比原先的要高一些,据说当n趋近于无穷大时这个的时间复杂度趋近O(n).本人水平有限,无法证明. 这是道水题,贴代码出来重点是欧拉筛选法.我把原来普通的筛选法贴出来. / ...
- light oj 1159 - Batman LCS
学过简单动态规划的人应该对最长公共子序列的问题很熟悉了,这道题只不过多加了一条字符串变成三条了,还记得,只要把状态变成三维的即可. //http://lightoj.com/volume_showpr ...
- NYOJ 53 最少步数
题 目 http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=58 思路借鉴 DFS-Deep First Search-深度优先 ...
- 保存MTLAB图片是想去掉白边
在做一些matlab小实验的时候,生成的图片需要临时保存的时候会有多余的白边,如何能解决这种问题? 输入 iptsetpref('ImshowBorder','tight'); 后,再show一次图即 ...
- Zabbix利用Windows性能监视器监控各项资源指标
zabbix自带的windows监控模板并没有监控windows cpu使用率的监控 在cmd命令输入perfmon 打开后默认就一项CPU占用的监控,下面以添加硬盘空闲时间做示例 1:监控图形上面右 ...
- oracle RAC LOG_ARCHIVE_DEST_1 与 LOG_ARCHIVE_DEST 冲突解决
在做 oracle RAC 归档日志配置时,出现了一个错误,开始看资料的时候, 注意到了 LOG_ARCHIVE_DEST_n 与 LOG_ARCHIVE_DEST 不能同时使用, 但在配置的时候并没 ...
- leetcode 29 两数相除
问题描述 给定两个整数,被除数 dividend 和除数 divisor.将两数相除,要求不使用乘法.除法和 mod 运算符. 返回被除数 dividend 除以除数 divisor 得到的商. 示例 ...
- 主成分分析 Principle Component Analysis
一.主要思想 利用正交变换把可能线性相关变量表示的观测数据,转换为由少数几个线性无关变量(主成分)表示的数据.(重构原始特征空间:线性降维) 要尽可能保留原始数据中的信息,两个思路:最大投影方差.最小 ...