[ZJOJ2007]时态同步 贪心
不是很懂为什么luogu标签是树形DP,感觉我想的就是一个贪心啊。。。
随机造几组数据,我们发现贪心的确可以得到最优解,那么为什么呢?
假设将所有时态贪心的调整是对的,
那么如果一个节点的各个儿子时态不同,那么强行统一,
为什么可以假设是对的?
因为观察到在一个点的上方+1,对它的子树的相对关系的没有影响的,
因此子树里面的时态同步只能在内部做,所以一步一步统一上来,
而且由于如果是要改变两个子树之间的大小关系的话,
因为是整个子树的修改,同时不影响到其他子树,因此这个时候就是在一个点的上方+1了,
同时因为每次只考虑子树内部的关系,所以整个子树的修改会被延后到上一个节点,
这时两个子树之间的修改就变成了子树内部的修改,因此递归上去即可
注意:由于f[x]中存的子树个数在不断增加,因此f[x]中的个数可能不只一个,因此如果要把f[x]中的子树增加到f[now]代表的子树的话,
因为路径不同,因此要修改cnt(f[x]中的子树个数)条路径,并且每条路径都是+相同的数,所以代价要*cnt
#include<bits/stdc++.h>
using namespace std;
/*假设将所有时态贪心的调整是对的,
那么如果一个节点的各个儿子时态不同,那么强行统一,
为什么可以假设是对的?
因为观察到在一个点的上方+1,对它的子树的相对关系的没有影响的,
因此子树里面的时态同步只能在内部做,所以一步一步统一上来,
而且由于如果是要改变两个子树之间的大小关系的话,
因为是整个子树的修改,同时不影响到其他子树,因此这个时候就是在一个点的上方+1了,
同时因为每次只考虑子树内部的关系,所以整个子树的修改会被延后到上一个节点,
这时两个子树之间的修改就变成了子树内部的修改*/
#define R register int
#define AC 1001000
#define D printf("line in %d\n",__LINE__);
#define LL long long
int n,root;
int date[AC],Next[AC],Head[AC],value[AC],tot;
LL ans,have;
LL f[AC];//f[i]代表节点i的子树内的时态已经被统一为了f[i]
bool z[AC],vis[AC];
inline int read()
{
int x=;char c=getchar();
while(c > '' || c < '') c=getchar();
while(c >= '' && c <= '') x=x*+c-'',c=getchar();
return x;
} inline void add(int f,int w,int S)
{
date[++tot]=w,Next[tot]=Head[f],value[tot]=S,Head[f]=tot;
date[++tot]=f,Next[tot]=Head[w],value[tot]=S,Head[w]=tot;
} inline void pre()
{
R a,b,c;
n=read(),root=read();
for(R i=;i<n;i++)
{
a=read(),b=read(),c=read();
add(a,b,c);
}
} void DFS(int x)//先统计一下
{
vis[x]=true;
R now;
bool done=false;
for(R i=Head[x]; i ;i=Next[i])
{
now=date[i];
if(vis[now]) continue;
if(!done) done=true;
have+=value[i];
DFS(now);
have-=value[i];
}
if(!done) f[x]=have;
} void DP(int x)
{
z[x]=true;
R now,cnt=;
for(R i=Head[x]; i ;i=Next[i])
{
now=date[i];
if(z[now]) continue;
DP(now);
if(!f[x]) f[x]=f[now];
else if(f[now] != f[x])
{
if(f[now] < f[x]) ans+=f[x] - f[now];
else ans+=(f[now] - f[x]) * cnt,f[x]=f[now];
}//error!!!因为f[now]只代表新遍历到的子树,而f[x]则可能代表很多个子树
++cnt;
}//error!!!于是如果统计让很多个子树暴力修改上来的代价,因为要修改很多边,因此要*cnt(f[x]中的子树个数)
} int main()
{
freopen("in.in","r",stdin);
pre();
DFS(root);
DP(root);
printf("%lld\n",ans);
fclose(stdin);
return ;
}
[ZJOJ2007]时态同步 贪心的更多相关文章
- [ZJOI2007]时态同步(dfs+贪心)
小Q在电子工艺实习课上学习焊接电路板.一块电路板由若干个元件组成,我们不妨称之为节点,并将其用数字1,2,3.进行标号.电路板的各个节点由若干不相交的导线相连接,且对于电路板的任何两个节点,都存在且仅 ...
- BZOJ1060: [ZJOI2007]时态同步(树形dp 贪心)
Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3285 Solved: 1286[Submit][Status][Discuss] Descript ...
- BZOJ 1060: [ZJOI2007]时态同步 树上问题 + 贪心
Description 小Q在电子工艺实习课上学习焊接电路板.一块电路板由若干个元件组成,我们不妨称之为节点,并将其用数 字1,2,3….进行标号.电路板的各个节点由若干不相交的导线相连接,且对于电路 ...
- [ZJOI2007]时态同步 (树形DP)
题目描述 小 Q在电子工艺实习课上学习焊接电路板.一块电路板由若干个元件组成,我们不妨称之为节点,并将其用数字 1,2,3-.进行标号.电路板的各个节点由若干不相交的导线相连接,且对于电路板的任何两个 ...
- [Luogu] P1131 [ZJOI2007]时态同步
题目描述 题目描述 小Q在电子工艺实习课上学习焊接电路板.一块电路板由若干个元件组成,我们不妨称之为节点,并将其用数字1,2,3…进行标号.电路板的各个节点由若干不相交的导线相连接,且对于电路板的任何 ...
- 洛谷 1131 [ZJOI2007] 时态同步
题目描述 小Q在电子工艺实习课上学习焊接电路板.一块电路板由若干个元件组成,我们不妨称之为节点,并将其用数字1,2,3….进行标号.电路板的各个节点由若干不相交的导线相连接,且对于电路板的任何两个节点 ...
- 【BZOJ-1060】时态同步 树形DP (DFS爆搜)
1060: [ZJOI2007]时态同步 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2101 Solved: 595[Submit][Statu ...
- 【bzoj1060】[ZJOI2007]时态同步
题目描述 小Q在电子工艺实习课上学习焊接电路板.一块电路板由若干个元件组成,我们不妨称之为节点,并将其用数字1,2,3-.进行标号.电路板的各个节点由若干不相交的导线相连接,且对于电路板的任何两个节点 ...
- 【BZOJ1060】[ZJOI2007]时态同步 树形DP
[BZOJ1060][ZJOI2007]时态同步 Description 小Q在电子工艺实习课上学习焊接电路板.一块电路板由若干个元件组成,我们不妨称之为节点,并将其用数字1,2,3-.进行标号.电路 ...
随机推荐
- oracle 建立一个视图,然后授权其他用户访问
grant select on V_LIC_ENTRY_HZ_STATUS to ielicr2013; create or replace view dept_sum_vw (name,minsal ...
- Java - 无乱码读写文件
Java读取数据流的时候,一定要指定数据流的编码方式,否则将使用本地环境中的默认字符集. BufferedReader reader = null; String laststr = "&q ...
- docker 应用场景
内容来自知乎.先mark,后续再研究 0.无痛尝试新事物 这应该是最早让我感受到docker的便利性的使用场景了. 以前,如果想尝试新的编程语言/数据库/命令行工具,会先找找apt的源里有没有相应的包 ...
- mysql c 获取error_code
#include <stdio.h> #include <mysql.h> int main(int argc, char **argv) { MYSQL *con = mys ...
- BBU+RRU基本介绍
现代移动通信网络中的数模转化架构:RRU+BBU: 因为学习需要了解RRU+BBU.特此网上查找了一番,找到了一些还不错的解释,分享给大家! BBU与RRU的区别: 通常大型建筑物内部的层间有楼板,房 ...
- Jenkins 配置邮箱 530Authentication required ,535 uthentication failed 的解决方法
错误 解决方法 530 Authentication required 需要展开SMTP认证,输入SMTP server能识别的用户信息 535 authentication failed 输 ...
- 376. Binary Tree Path Sum【LintCode java】
Description Given a binary tree, find all paths that sum of the nodes in the path equals to a given ...
- 承压计算:模拟+double
标题:承压计算 X星球的高科技实验室中整齐地堆放着某批珍贵金属原料. 每块金属原料的外形.尺寸完全一致,但重量不同.金属材料被严格地堆放成金字塔形. 7 ...
- Reject Inference: Your Data is Deceiving You
Keyword: Reject Inference Suppose there is a dataset of several attributes, including working condit ...
- (转载)IE8+兼容经验小结
本文分享下我在项目中积累的IE8+兼容性问题的解决方法.根据我的实践经验,如果你在写HTML/CSS时候是按照W3C推荐的方式写的,然后下面的几点都关注过,那么基本上很大一部分IE8+兼容性问题都OK ...