<span>HDU4799 LIKE vs CANDLE(树形dp)</span>

题意:

若 干微博账户形成了一个转发树(即一个有根树)。每个账户有自己的价值,每个账户也有自己的态度(赞或蜡烛)。如果一个账户的态度是“赞”,它的价值就会被 加到“赞”的一边,反之亦然。Edward可以从“赞”的一边拿出X 的价值去翻转一个账户,即把它的态度换到相反的一边。但是Edward 发现,有的账户已经被别人翻转过了,对于这些账户,Edward就要花费Y的价值去翻转它们。一旦一个账户被翻转了一次,它的所有子账户也会被翻转一次。 求“赞”的一边的价值总数与“蜡烛”一边的价值总数的最大差值。若最大差值为负数则输出“HAHAHAOMG”。

输入:N个账户,X flip一个没有fliped的账户需要的花费,Y flip一个已经fliped的账户需要的花费。

四个数:账户价值,转发来源,是否要被flip(1表示要),被flip之前的状态(1表示蜡烛,0表示like)

思路:

dp[i][0]为第i个账户没有被翻转的最大价值,dp[i][1]为第i个账户被翻转的最大(负)价值

即dp[i][0]为赞减蜡烛的最大值,dp[i][1]为蜡烛减赞的最大值。

这样更新时

dp[u][0]直接可以由dp[v][0]或者dp[v][1]-(x or y)更新他

dp[v][0]更新dp[u][0]没什么好说的,子节点赞减蜡烛的最大值更新上一层

dp[v][1]-(x or y)更新dp[u][0]即为子节点被Edward翻转更新上一层

这样子节点的赞和蜡烛要被反转,而dp[v][1]保存的正是蜡烛减赞的最大值,翻转后正好是赞减蜡烛的最大值

然后再减去Edward翻转的消耗就可以了

/* ***********************************************
Author        :devil
Created Time  :2016/3/30 11:9:29
************************************************ */
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <cmath>
#include <stdlib.h>
using namespace std;
#define N 50010
int dp[N][2],n,x,y,v[N],f,s[N],p;
bool vis[N],flag;
vector<int>eg[N];
void init()
{
    for(int i=0; i<N; i++)
        eg[i].clear();
    memset(vis,false,sizeof(vis));
    memset(dp,0,sizeof(dp));
    flag=false;
}
void dfs(int u)
{
    vis[u]=true;
    if(s[u]) flag^=1;
    if(flag) v[u]=-v[u];
    dp[u][0]=v[u];
    dp[u][1]=-v[u];
    for(int i=0; i<eg[u].size(); i++)
    {
        int to=eg[u][i];
        if(!vis[to])
        {
            dfs(to);
            if(s[to])
            {
                dp[u][0]=dp[u][0]+max(dp[to][0],dp[to][1]-y);
                dp[u][1]=dp[u][1]+max(dp[to][1],dp[to][0]-y);
            }
            else
            {
                dp[u][0]=dp[u][0]+max(dp[to][0],dp[to][1]-x);
                dp[u][1]=dp[u][1]+max(dp[to][1],dp[to][0]-x);
            }
        }
    }
    if(s[u]) flag^=1;
}
int main()
{
    //freopen("in.txt","r",stdin);
    while(~scanf("%d%d%d",&n,&x,&y))
    {
        init();
        for(int i=1; i<=n; i++)
        {
            scanf("%d%d%d%d",&v[i],&f,&s[i],&p);
            if(p) v[i]=-v[i];
            eg[f].push_back(i);
        }
        dfs(0);
        if(dp[0][0]<0) printf("HAHAHAOMG\n");
        else printf("%d\n",dp[0][0]);
    }
    return 0;
}

 

全部评论

相关推荐

不愿透露姓名的神秘牛友
10-05 10:13
已编辑
HHHHaos:让这些老登来现在秋招一下,简历都过不去
点赞 评论 收藏
分享
感性的干饭人在线蹲牛友:🐮 应该是在嘉定这边叭,禾赛大楼挺好看的
点赞 评论 收藏
分享
秋招进行到现在终于能写总结了。完全没想到战线会拉这么长,过程会如此狼狈,不过更应该怪自己太菜了。好在所有的运气都用在了最后,也是有个去处。背景:双2本硕科班,无竞赛,本科一段研究所实习,硕士一段大厂暑期实习但无转正。技术栈是C++&nbsp;&amp;&nbsp;Golang,实习是客户端音视频(而且是鸿蒙端开发),简历两个C++项目一个Golang项目。主要投递岗位:后端,cpp软开,游戏服务端,测开,以及一些不拘泥于Java的岗位。从8月起总共投递123家公司,笔试数不清了,约面大约30家。offer/oc/意向:友塔游戏(第一个offer,面试体验很好,就是给钱好少南瑞继保(计算机科班点击就送(限男生),不...
乡土丁真真:佬很厉害,羡慕~虽然我还没有到校招的时候,也想讲一下自己的看法:我觉得不是CPP的问题,佬的背书双2,技术栈加了GO,有两段实习。投了123,面了30.拿到11个offer。这个数据已经很耀眼了。这不也是CPP带来的吗?当然也不止是CPP。至少来说在这个方向努力过的也会有好的结果和选择。同等学历和项目选java就会有更好的吗?我个人持疑问态度。当然CPP在方向选择上确实让人头大,但是我觉得能上岸,至于最后做什么方向,在我看来并不重要。至于CPP特殊,有岗位方向的随机性,java不是不挑方向,只是没得选而已。也希望自己以后校招的时候能offer满满
点赞 评论 收藏
分享
评论
点赞
收藏
分享
正在热议
# 25届秋招总结 #
442570次浏览 4512人参与
# 春招别灰心,我们一人来一句鼓励 #
41986次浏览 533人参与
# 北方华创开奖 #
107437次浏览 599人参与
# 地方国企笔面经互助 #
7964次浏览 18人参与
# 同bg的你秋招战况如何? #
76743次浏览 563人参与
# 实习必须要去大厂吗? #
55775次浏览 961人参与
# 阿里云管培生offer #
120264次浏览 2220人参与
# 虾皮求职进展汇总 #
115687次浏览 886人参与
# 如果你有一天可以担任公司的CEO,你会做哪三件事? #
11584次浏览 287人参与
# 实习,投递多份简历没人回复怎么办 #
2454714次浏览 34857人参与
# 提前批简历挂麻了怎么办 #
149906次浏览 1977人参与
# 在找工作求抱抱 #
906025次浏览 9421人参与
# 如果公司给你放一天假,你会怎么度过? #
4757次浏览 55人参与
# 你投递的公司有几家约面了? #
33206次浏览 188人参与
# 投递实习岗位前的准备 #
1195950次浏览 18549人参与
# 机械人春招想让哪家公司来捞你? #
157635次浏览 2267人参与
# 双非本科求职如何逆袭 #
662248次浏览 7397人参与
# 发工资后,你做的第一件事是什么 #
12734次浏览 62人参与
# 工作中,努力重要还是选择重要? #
35815次浏览 384人参与
# 简历中的项目经历要怎么写? #
86920次浏览 1516人参与
# 参加完秋招的机械人,还参加春招吗? #
20133次浏览 240人参与
# 我的上岸简历长这样 #
452024次浏览 8088人参与
牛客网
牛客企业服务