每日一题 6月18日 颓红警 树形DP-维护区间平方差距离

题目链接:https://ac.nowcoder.com/acm/problem/19314
题目大意:就是有一棵树,每个节点有一个防御力mi[i], 你的攻击力为P,你1是根节点,每次你可以选择一个节点i进行攻击,对i造成的伤害为P,对i的子孙j造成图片说明 的伤害,并且攻击i节点时,保证他的所有祖先全部被击败,mi[i]<0就被击败。问你最少的攻击次数,把树上节点全部打败。
思路:
图片说明
ps:siz[], di1[], di2[]:直接维护1-i的前缀和会爆LL

#include<bits/stdc++.h>
#define LL long long
using namespace std;

LL mi[1000005];
vector<vector<LL> > v(1000005);
LL len, n, p;
LL di2[1000005], di1[1000005], siz[1000005], cnt[1000005], ans=0;
void DFS(LL u, LL fa, LL d){
    if(d>len){//减去之前不会造成影响祖先的贡献
        LL t=d-len;
        siz[u]-=cnt[t];
        di1[u]-=cnt[t]*t;
        di2[u]-=cnt[t]*t*t;
    }
    mi[u]-=siz[u]*(p-d*d)-di2[u]+2*di1[u]*d;
    LL pos=0;
    if(mi[u]>=0){
        pos=(mi[u])/p+1; ans+=pos;
    }
    cnt[d]=pos;
    for(auto x: v[u]){
        if(x!=fa){
            siz[x]=siz[u]+pos; di1[x]=di1[u]+d*pos; di2[x]=di2[u]+pos*d*d;
            DFS(x, u, d+1);
        }
    }
}

int main(){

    LL x, y; scanf("%lld%lld", &n, &p);
    len=sqrt(p)+1;
    for(LL i=1; i<=n; i++){
        scanf("%lld", &mi[i]);
    }
    for(LL i=1; i<n; i++){
        scanf("%lld%lld", &x, &y);
        v[x].push_back(y);
        v[y].push_back(x);
    }
    DFS(1, 0, 1);
    cout<<ans<<endl;

    return 0;
}
全部评论

相关推荐

litbisc:你先说会,然后去速成课自学一个月,出门在外,身份都是自己给的
点赞 评论 收藏
分享
我生之初尚无疚:举报了哥,你什么都没做错,全怪我那令人作呕的嫉妒和卑微的自尊心,看见你的文字我完全破防了,我直接丢盔弃甲了,看见你这图的那一秒,我满头大汗,浑身发冷,亿郁症瞬间发作了,生活仿佛没了颜色,像是被抓住尾巴的赛亚人,带着海楼石的能力者,抽离尾兽的人柱力,像是没了光的奥特曼,彻底断绝了生的希望。我几乎都快羡慕得疯了,倒在床上蒙住被子就开始抱着枕头尖叫流泪,嘴里一边喊着卧槽卧槽,一边又忍着,我边发边哭,打字的手都是抖的,后来我的手抖得越来越厉害,从心头涌起的思想、情怀和梦想,这份歆羡和悔恨交织在一起,我的笑还挂在脸上,可是眼泪一下子就掉下来了。求你了别发了,我生活再难再穷我都不会觉得难过,只有你们发这种东西的时候,我的心里像被刀割一样的痛,打着字泪水就忍不住的往下流。每天早上7点起床晚上9点睡觉,年复一年地学到现在,憧憬着一个月赚上万块的幸福生活,憧憬着美好阳光的未来。我打开了手机,看到你的图,我感到了深深的差距,我直接跳进了家门口的井里。
点赞 评论 收藏
分享
10-12 18:38
门头沟学院 Java
想问一下字节提前实习发实习offer,不发正式offer这样正常吗
WhisperK:秋招转实习别去,至少得正式offer下来再说
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务