【Luogu】P3574FAR_FarmCraft(树形贪心)

  题解链接

  想了一个错的贪心爆零了,气死。

  题目链接

#include<cstdio>
#include<cctype>
#include<cstring>
#include<algorithm>
#include<cstring>
#define maxn 500050
using namespace std;

inline long long read(){
    long long num=0,f=1;
    char ch=getchar();
    while(!isdigit(ch)){
        if(ch==‘-‘)    f=-1;
        ch=getchar();
    }
    while(isdigit(ch)){
        num=num*10+ch-‘0‘;
        ch=getchar();
    }
    return num*f;
}

struct Edge{
    int next,to;
}edge[maxn*2];
int head[maxn],num;
inline void add(int from,int to){
    edge[++num]=(Edge){head[from],to};
    head[from]=num;
}

long long q[maxn];
long long f[maxn];
long long s[maxn];
int sta[maxn],top;

bool cmp(int a,int b){    return f[a]>f[b];    }

void dfs(int x,int fa){
    int ret=top;
    for(int i=head[x];i;i=edge[i].next){
        int to=edge[i].to;
        if(to==fa)    continue;
        dfs(to,x);
        s[x]+=2+s[to];
        sta[++top]=to;
    }
    if(x^1)    f[x]=q[x]-s[x];
    int now=s[x];
    sort(sta+ret+1,sta+top+1,cmp);
    for(int i=ret+1;i<=top;++i){
        int to=sta[i];
        now-=s[to]+2;
        f[x]=max(f[x],f[to]-now-1);
    }
    f[x]=max(f[x],0LL);
    top=ret;
}

int main(){
    int n=read();
    for(int i=1;i<=n;++i)    q[i]=read();
    for(int i=1;i<n;++i){
        int from=read(),to=read();
        add(from,to);
        add(to,from);
    }
    dfs(1,1);
    printf("%lld\n",max(f[1],q[1])+n*2-2);
    return 0;
}

原文地址:https://www.cnblogs.com/cellular-automaton/p/8351126.html

时间: 2024-11-09 05:09:09

【Luogu】P3574FAR_FarmCraft(树形贪心)的相关文章

BZOJ 2525 [Poi2011]Dynamite 二分+树形贪心

题意: n个点,一棵树,有些点是关键点,可以将m个点染色. 求所有关键点到最近的被染色点的距离的最大值最小. 解析: 反正从这道题我是学了一种做题思路? 大爷讲课的时候说的:一般选择某些点的代价相同的话都是贪心,代价不同的话一般都是DP. 想想也挺对的,不过就是没有感悟到过? 反正这题考试的时候我是直接D了贪心的- -! 忘了为啥D了. 显然最大值最小我们需要二分一下这个值. 然后接下来我们从下往上扫整棵树. 节点的状态有几个? 第一种是 子树内没有不被覆盖的关键点,并且子树中有一个节点的贡献可

BZOJ 4027 HEOI2015 兔子与樱花 树形贪心

题目大意:给定一棵有根树,每个点上有一些樱花,现在要求删除一些节点,删除节点的樱花和子节点都会连到父节点上,要求每个节点的樱花数+子节点数不超过m,求最多删多少个节点 这数据范围也只能贪心了吧= = 令fi为以节点i为根的子树中能删除的最多节点(i节点不删),gi为删除最多节点的情况下i号节点的最小负重 那么首先对于每个节点我们对于所有的子节点为根的子树尽量删,然后考虑如何删除子节点 对于节点x以及x的子节点y,若删除y节点,对gx的贡献为gy?1 因此我们对x节点的所有子节点按gy?1排序,从

BZOJ 2525 Poi2011 Dynamite 二分答案+树形贪心

题目大意:给定一棵树,有一些点是关键点,要求选择不超过m个点,使得所有关键点到最近的选择的点距离最大值最小 二分答案,问题转化为: 给定一棵树,有一些点是关键点,要求选择最少的点使得每个关键点到选择的点的距离不超过limit 然后我们贪心DFS一遍 对于以一个节点为根的子树,有三种状态: 0.这棵子树中存在一个选择的点,这个选择的点的贡献还能继续向上传递 1.这棵子树中存在一个未被覆盖的关键点,需要一些选择的点去覆盖他 2.这棵子树中既没有能继续向上传递的选择的点也不存在未覆盖的关键点 是不是少

73: luogu 2014 树形dp

$des$ 在大学里每个学生,为了达到一定的学分,必须从很多课程里选择一些课程来学习,在课程里有些课程必须在某些课程之前学习,如高等数学总是在其它课程之前学习.现在有N门功课,每门课有个学分,每门课有一门或没有直接先修课(若课程a是课程b的先修课即只有学完了课程a,才能学习课程b).一个学生要从这些课程里选择M门课程学习,问他能获得的最大学分是多少? $des$ 建出完整的树后 dp #include <bits/stdc++.h> using namespace std; #define R

[总结+题解]20141028

// 此博文为迁移而来,写于2014年11月4日,不代表本人现在的观点与看法.原始地址:http://blog.sina.com.cn/s/blog_6022c4720102vew9.html 这次考试200分,第一题这水题让人精神一振.更让人开心的事第二题,我看主要是数据太水了吧...用一种奇葩的方式打了贪心就AC了.但是以后考试要抓紧时间.不然后面不太会做的题目就没有时间打暴力了. 1/新杨辉三角 [100分][正解:数学] 杨辉三角大家一定都知道,图片省略. ld非常有趣,他问xqz左图第

APIO2015 八邻旁之桥/巴邻旁之桥

题目描述: bz luogu 题解: 贪心+权值线段树. $K=1$的时候,答案为$\sum |x-l| + |x-r|$,所以所有端点排序后取中位数即可. $K=2$的时候,一定是左边的一些走左边的桥,右边的一些走右边的桥. 问题是按什么顺序排序. 答案是按线段中点排序. 原因是,对于河两岸的一对点和两座桥,选择的一定是离线段中点近的那个. 考虑如何快速计算答案,我们可以用权值线段树维护区间和与中位数.(当然也可以用平衡树) 代码: #include<cstdio> #include<

「CF161B」Discounts

传送门 Luogu 解题思路 贪心地想一想,我们肯定要让凳子去给价格越高的商品打半价,那么我们就先按照价格排序,但是要优先把凳子排在前面. 然后我们发现一条凳子肯定只能给价格小于等于它本身的物品打半价,所以我们就尽量把所有凳子单独放一个购物车,但是要注意判断一下凳子数量和购物车数量的关系,这里不啰嗦了. 细节注意事项 分类讨论的过程不能少,但要是想做到码量少就要细心一点 参考代码 #include <algorithm> #include <iostream> #include &

hdu4313 贪心并查集 || 树形dp

http://acm.hdu.edu.cn/showproblem.php?pid=4313 Problem Description Machines have once again attacked the kingdom of Xions. The kingdom of Xions has N cities and N-1 bidirectional roads. The road network is such that there is a unique path between any

51nod 1378 夹克老爷的愤怒(树形DP+贪心)

题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1378 大致题意: 一棵1e5节点的树,安放某些位置,一个位置可以控制距他的距离不超过K的所有节点, 输入树和K,求控制全图(所有节点)需要安放最少的个数 思路: 假如是线性结构,一定是从边界开始每距离2k安放一个,然后最后正好或者再放置一个,这个贪心思路所有人都会. 当是树形结构时,仍然用那个贪心,显然安放的位置越靠近根节点控制的其他节点数越多,所以这里必须从