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的更多相关文章

  1. codeforces 283C

    给 n 中 钱币.以及每两种钱币的关系,表示,ai 的 个数 要大于 bi 组合成一个价值val,求方案数,好奇妙的一个处理方式,不得不说又学到了 #include<stdio.h> #i ...

  2. Codeforces Round #148 (Div. 2)

    A. Two Bags of Potatoes 枚举倍数. B. Easy Tape Programming (待补) C. Not Wool Sequences 考虑前缀异或和. \[answer ...

  3. codeforces:855D Rowena Ravenclaw's Diadem分析和实现

    题目大意: 提供n个对象,分别编号为1,...,n.每个对象都可能是某个编号小于自己的对象的特例或是成分.认为某个对象的特例的特例依旧是该对象的特例,即特例关系传递,同样一个对象的成分的成分依旧是该对 ...

  4. Codeforces Round #287 (Div. 2) E. Breaking Good 最短路

    题目链接: http://codeforces.com/problemset/problem/507/E E. Breaking Good time limit per test2 secondsme ...

  5. Codeforces Gym 100269A Arrangement of Contest 水题

    Problem A. Arrangement of Contest 题目连接: http://codeforces.com/gym/100269/attachments Description Lit ...

  6. POJ 2965. The Pilots Brothers' refrigerator 枚举or爆搜or分治

    The Pilots Brothers' refrigerator Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 22286 ...

  7. python爬虫学习(5) —— 扒一下codeforces题面

    上一次我们拿学校的URP做了个小小的demo.... 其实我们还可以把每个学生的证件照爬下来做成一个证件照校花校草评比 另外也可以写一个物理实验自动选课... 但是出于多种原因,,还是绕开这些敏感话题 ...

  8. 【Codeforces 738D】Sea Battle(贪心)

    http://codeforces.com/contest/738/problem/D Galya is playing one-dimensional Sea Battle on a 1 × n g ...

  9. 【Codeforces 738C】Road to Cinema

    http://codeforces.com/contest/738/problem/C Vasya is currently at a car rental service, and he wants ...

随机推荐

  1. 【经验分享】ASP.NET 的 Page_Load 执行了2次,真的!

    发现问题 这是来自一位网友的提问: 本着求真务实的态度,我打开了 AppBoxPro 项目,本地调试果然发现 Page_Load 进入了两次! 其实在没测试之前,我就有了大概的方向,因为AppBoxP ...

  2. bug探索常识

    1.什么是Bug探索测试? 探索测试是将测试设计和测试执行整合在一起,形成的一种测试方法. 2.探索性测试怎么做? 需要认真思考和分析结果,并且在探索测试的过程中做记录. 3.探索性测试的好处? 可以 ...

  3. FB的新专利竟要监看使用者的脸

    大家应该会很好奇Facebook又在搞什么新花招,这个专利的名称是"Techniques for emotion detection and content delivery",其 ...

  4. Hadoop 系列(八)—— 基于 ZooKeeper 搭建 Hadoop 高可用集群

    一.高可用简介 Hadoop 高可用 (High Availability) 分为 HDFS 高可用和 YARN 高可用,两者的实现基本类似,但 HDFS NameNode 对数据存储及其一致性的要求 ...

  5. JNDI----数据连接池

    JNDI:提供了查找和访问各种命名和目录服务的通用,统一的接口 常用的配置属性:   name:表示以后要查找的名称.通过此名称可以找到DataSource,此名称任意更换,但是程序中最终要查找的就是 ...

  6. 微信小程序云开发报错解决: Setting data field "openid" to undefined is invalid.

    最近在学习微信小程序云开发,刚一开始就遇到了问题. 点击获取openid的时候控制台开始报错: [云函数] [login] user openid:  undefined VM97:1 Setting ...

  7. 两个 github 账号混用,一个帐号提交错误

    问题是这样,之前有一个github帐号,因为注册邮箱的原因,不打算继续使用了,换了一个新的邮箱注册了一个新的邮箱帐号.新账号提交 就会出现下图的问题,但是原来帐号的库还是能正常提交.   方法1:添加 ...

  8. android ——Tablayout

    Tabs make it easy to explore and switch between different views. 通过TabLayout可以在一个活动中通过滑动或者点击切换到不同的页面 ...

  9. Hadoop - YARN Introduce

    YARN Introduce 1. MapReduce1.0缺陷 (1)存在单点故障 (2)JobTracker"大包大揽"导致任务过重(任务多时内存开销大,上限4000节点) ( ...

  10. macOS 下的 MySQL 8.0.17 安装与简易配置

    如果我写的这篇你看不懂,可能网上也没有你能看懂的教程了 虽然这篇针对的是8.0.x版本,但是关于MySQL配置之类的方法还是通用的 环境信息与适用范围 环境信息 环境/软件 版本 macOS macO ...