不是很懂为什么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]时态同步 贪心的更多相关文章

  1. [ZJOI2007]时态同步(dfs+贪心)

    小Q在电子工艺实习课上学习焊接电路板.一块电路板由若干个元件组成,我们不妨称之为节点,并将其用数字1,2,3.进行标号.电路板的各个节点由若干不相交的导线相连接,且对于电路板的任何两个节点,都存在且仅 ...

  2. BZOJ1060: [ZJOI2007]时态同步(树形dp 贪心)

    Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3285  Solved: 1286[Submit][Status][Discuss] Descript ...

  3. BZOJ 1060: [ZJOI2007]时态同步 树上问题 + 贪心

    Description 小Q在电子工艺实习课上学习焊接电路板.一块电路板由若干个元件组成,我们不妨称之为节点,并将其用数 字1,2,3….进行标号.电路板的各个节点由若干不相交的导线相连接,且对于电路 ...

  4. [ZJOI2007]时态同步 (树形DP)

    题目描述 小 Q在电子工艺实习课上学习焊接电路板.一块电路板由若干个元件组成,我们不妨称之为节点,并将其用数字 1,2,3-.进行标号.电路板的各个节点由若干不相交的导线相连接,且对于电路板的任何两个 ...

  5. [Luogu] P1131 [ZJOI2007]时态同步

    题目描述 题目描述 小Q在电子工艺实习课上学习焊接电路板.一块电路板由若干个元件组成,我们不妨称之为节点,并将其用数字1,2,3…进行标号.电路板的各个节点由若干不相交的导线相连接,且对于电路板的任何 ...

  6. 洛谷 1131 [ZJOI2007] 时态同步

    题目描述 小Q在电子工艺实习课上学习焊接电路板.一块电路板由若干个元件组成,我们不妨称之为节点,并将其用数字1,2,3….进行标号.电路板的各个节点由若干不相交的导线相连接,且对于电路板的任何两个节点 ...

  7. 【BZOJ-1060】时态同步 树形DP (DFS爆搜)

    1060: [ZJOI2007]时态同步 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2101  Solved: 595[Submit][Statu ...

  8. 【bzoj1060】[ZJOI2007]时态同步

    题目描述 小Q在电子工艺实习课上学习焊接电路板.一块电路板由若干个元件组成,我们不妨称之为节点,并将其用数字1,2,3-.进行标号.电路板的各个节点由若干不相交的导线相连接,且对于电路板的任何两个节点 ...

  9. 【BZOJ1060】[ZJOI2007]时态同步 树形DP

    [BZOJ1060][ZJOI2007]时态同步 Description 小Q在电子工艺实习课上学习焊接电路板.一块电路板由若干个元件组成,我们不妨称之为节点,并将其用数字1,2,3-.进行标号.电路 ...

随机推荐

  1. 海思NB-IOT模块HI2115芯片I2C通信

    1. 首先确定硬件上I2C的引脚,手册上并没有,海思技术支持说是14和15脚,我们用的是12和13脚,问题在于,如果是硬件I2C应该不能随便换个引脚吧,难道是模拟的时序? 2. 下一个奇怪的地方,这个 ...

  2. 「题目代码」P1066~P1070(Java)

    P1066 谭浩强C语言(第三版)习题8.6 import java.util.*; import java.io.*; import java.math.*; import java.lang.Ch ...

  3. TW实习日记:第17天

    今天又改了一堆bug,比如界面的显示bug,Html字符串的处理.优化了一些交互界面,处理了一个模块数据传输的问题.我发现这些bug真的有一半是粗心导致的,真的真的是,写代码一定要细心细心再细心,不然 ...

  4. 227. Mock Hanoi Tower by Stacks【LintCode java】

    Description In the classic problem of Towers of Hanoi, you have 3 towers and N disks of different si ...

  5. C++clock()延时循环

    函数clock(),返回程序开始执行后所用的系统时间,但是有两个复制问题. 1.clock()返回时间的单位不一定是秒 2.该函数的返回类型在某些系统上可能是Long,也可能是unsigned lon ...

  6. day-16 CNN卷积神经网络算法之Max pooling池化操作学习

    利用CNN卷积神经网络进行训练时,进行完卷积运算,还需要接着进行Max pooling池化操作,目的是在尽量不丢失图像特征前期下,对图像进行downsampling. 首先看下max pooling的 ...

  7. jQuery实现checkbox(复选框)选中、全选反选代码

    谁都知道 在html 如果一个复选框被选中 是 checked="checked". 但是我们如果用jquery alert($("#id").attr(&qu ...

  8. Centos下的SVN搭建

    需求: 搭建SVN实现本地开发环境,方便线上代码的更新. 步骤: 1. 安装SVN服务 yum install -y subversion 2.创建SVN代码库的目录.创建版本库 mkdir -p / ...

  9. Thunder团队——文案+美工

    团队名称:Thunder 组长:王航 成员:李传康.代秋彤.邹双黛.苗威.宋雨.胡佑蓉.杨梓瑞 项目名称:爱阅app 需求概述: 现在市面上有很多手机阅读器,但是基本上不是收费就是广告满天飞.基于这种 ...

  10. javaIO--字符流

    java提供字符流对自否刘式文件进行数据读写操作.字符输入流类是Reader及其子类,输出流是Writer及其子类. 另外,上一篇javaIO写的是字节流,字节流方式也可以对以字符为基本类型的流式文件 ...