一千八的题也不会做了呜呜呜

size[u]表示结点u下的叶子结点,

思维:可以想到一个子树对其父亲会有一个消耗值

   考虑一个点如果是max,那么其最大值可以是size[u]-p,p是消耗值最小的子树

   一个点如果是min,那么其最大值是size[u]-所有子树的消耗值之和

那么dp[u]表示结点u的最大值为size[u]-dp[u]+1

dp[u]表示结点u的消耗值

叶子结点的消耗值为1,

max结点的消耗值为消耗值最小的子树

  dp[u]=min(dp[v])

那么这个结点的结果是size[u]-dp[u]+1

min结点的消耗值为子树的消耗值之和dp[u]=sum(dp[v])

最后的答案是size[1]-dp[1]+1

#include<bits/stdc++.h>
using namespace std;
#define maxn 300005
struct Edge{int to,nxt;}edge[maxn<<];
int flag[maxn],a[maxn],head[maxn],tot,n;
void addedge(int u,int v){
edge[tot].to=v;edge[tot].nxt=head[u];head[u]=tot++;
}
void init(){
tot=;
memset(head,-,sizeof head);
}
int size[maxn];
void getsize(int u,int fa){
if(flag[u]==){size[u]=;return;}
for(int i=head[u];i!=-;i=edge[i].nxt){
int v=edge[i].to;
if(v==fa)continue;
getsize(v,u);
size[u]+=size[v];
}
}
int dp[maxn];
void dfs(int u,int fa){
if(flag[u]==){dp[u]=;return;}
int sum=,Min=0x3f3f3f3f;
for(int i=head[u];i!=-;i=edge[i].nxt){
int v=edge[i].to;
if(v==fa)continue;
dfs(v,u);
sum+=dp[v];
Min=min(Min,dp[v]);
}
if(a[u])dp[u]=Min;
else dp[u]=sum;
} int main(){
init();
cin>>n;
for(int i=;i<=n;i++)cin>>a[i];
for(int u=;u<=n;u++){
int fa;
cin>>fa;
flag[fa]=;
addedge(u,fa);
addedge(fa,u);
}
getsize(,);
dfs(,);
cout<<size[]-dp[]+<<endl;
}

cf1153D 树形dp+思维的更多相关文章

  1. Codeforces 1088E 树形dp+思维

    比赛的时候看到题意没多想就放弃了.结果最后D也没做出来,还掉分了,所以还是题目做的太少,人太菜. 回到正题: 题意:一棵树,点带权值,然后求k个子连通块,使得k个连通块内所有的点权值相加作为分子除以k ...

  2. CF482D Random Function and Tree 树形DP + 思维 + 神题

    Code: #include<bits/stdc++.h> #define ull unsigned long long #define MOD 1000000007 #define ll ...

  3. 【树形dp 思维题】HHHOJ#483. NOIP司马懿

    要注意利用一些题目的特殊条件吧. 题目大意 有一颗$n$个点带点权$a_i$的树,$q$次询问树上是否存在长度为$l$的路径. $n,q,l\le 10^5,0 \le a_i \le 2$ 题目分析 ...

  4. 洛谷AT2046 Namori(思维,基环树,树形DP)

    洛谷题目传送门 神仙思维题还是要写点东西才好. 树 每次操作把相邻且同色的点反色,直接这样思考会发现状态有很强的后效性,没办法考虑转移. 因为树是二分图,所以我们转化模型:在树的奇数层的所有点上都有一 ...

  5. HDU5758 Explorer Bo 思维+树形dp

    题意自己看题目吧,挺短的. 思考过程:昨天感觉一天不做题很对不起自己,于是晚上跑到实验室打开别人树形dp的博客做了上面最后一个HDU的题,也是个多校题..一开始没有头绪了很久,因为起点不固定,所以这1 ...

  6. 宝藏(树形DP)

      这道题目是十分考验思维的,n^2应该还是比较好想的,主要是如何转移根的问题.转移根,在我看来应该是树形dp最难的一部分了, 一般学会如何转移根,也就差不多考验通吃树形dp了. 下面转一转大佬链接: ...

  7. BZOJ5419[Noi2018]情报中心——线段树合并+虚树+树形DP

    题目链接: [NOI2018]情报中心 题目大意:给出一棵n个节点的树,边有非负边权,并给出m条链,对于每条链有一个代价,要求选出两条有公共边的链使两条链的并的边权和-两条链的代价和最大. 花了一天的 ...

  8. cf796c 树形,思维题

    一开始以为是个树形dp,特地去学了..结果是个思维题 /* 树结构,设最大点权值为Max,则答案必在在区间[Max,Max+2] 证明ans <= Max+2 任取一个点作为根节点,那么去掉这个 ...

  9. POJ 1849 - Two - [DFS][树形DP]

    Time Limit: 1000MS Memory Limit: 30000K Description The city consists of intersections and streets t ...

随机推荐

  1. mysql int(19) float(7,2) decimal(7,2)对比

    nt(19):指定数字的显示宽度为19,与实际存储数值的范围无关 float(7,2):  7是显示宽度指示器,指定显示的浮点数为7位数字(与float实际存储值的范围无关),2代表小数点后只有两位小 ...

  2. 转:Flutter动画二

    1. 介绍 本文会从代码层面去介绍Flutter动画,因此不会涉及到Flutter动画的具体使用. 1.1 Animation库 Flutter的animation库只依赖两个库,Dart库以及phy ...

  3. supervisor进程管理的使用

    介绍 Supervisor是用Python开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启.它是通过fork/exec的方式把这些被管理 ...

  4. 初步了解Bootstrap4

    Bootstrap 是全球最受欢迎的前端组件库,用于开发响应式布局.移动设备优先的 WEB 项目. Bootstrap4 目前是 Bootstrap 的最新版本,是一套用于 HTML.CSS 和 JS ...

  5. Eclipse 添加 Source 源代码、Javadoc 文档

    源代码 Source 按住 Ctrl 键,鼠标放到对应的类.方法上,出现 Open Declaration,Open Implementation ,可查看对应的实现.声明源代码. 也可以在[Proj ...

  6. Kubernetes集群调度器原理剖析及思考

    简述 云环境或者计算仓库级别(将整个数据中心当做单个计算池)的集群管理系统通常会定义出工作负载的规范,并使用调度器将工作负载放置到集群恰当的位置.好的调度器可以让集群的工作处理更高效,同时提高资源利用 ...

  7. ubuntu:基本操作;

    1.系统时间与网络时间同步: sudo dpkg-reconfigure tzdata 注: 该博文为扩展型:

  8. DirectX11 With Windows SDK--14 深度测试

    前言 当使用加法/减法/乘法颜色混合,或者使用透明混合的时候,在经过深度测试时可能会引发一些问题.例如现在我们需要使用加法混合来绘制一系列对象,而这些对象彼此之间不会相互阻挡.若我们仍使用原来的深度测 ...

  9. numpy&pandas基础

    numpy基础 import numpy as np 定义array In [156]: np.ones(3) Out[156]: array([1., 1., 1.]) In [157]: np.o ...

  10. [物理学与PDEs]第5章习题3 第二 Piola 应力张量的对称性

    试证明: 在物质描述下, 动量矩守恒定律等价于第二 Piola 应力张量的对称性. 证明: 由 $$\beex \bea \int_{G_t}\rho\sex{{\bf y}\times\cfrac{ ...