首页 > 其他分享 >P9847 [ICPC2021 Nanjing R] Crystalfly

P9847 [ICPC2021 Nanjing R] Crystalfly

时间:2024-02-18 16:56:15浏览次数:32  
标签:ICPC2021 P9847 max2 ll max1 next Crystalfly now 节点

前景导入

当 \(t\in [1,2]\) 时,本题如何求解?

答:树形dp

设 \(f[i]\) 为以 \(i\) 为根的树,根节点的晶蝶已消散且儿子节点的晶蝶还未被惊动,能获得的最大晶蝶数。

则有状态转移方程 \(f[i]=(\sum f[u])+max(a[u])\) ,其中 \(u\) 为 \(i\) 的儿子。

最终的答案即为 \(f[1]+a[1]\)

划向更深处

当 \(t=3\) 时,特殊点在哪?

我可以在踏入儿子节点后,再返回根节点,然后踏入 \(t=3\) 的节点,这样的决策存在着可能的更大值

设此时踏入的儿子节点为 \(v\) , \(g[i]\) 为以 \(i\) 为根的树,根节点的晶蝶和儿子节点的晶蝶均已消散,能获得的最大晶蝶数。

则可能的更大值为
\(f[i]=(\sum f[u])-f[v]+g[v]+a[v]+maxs\)
,其中 \(i_{maxs} \neq v\) 且 \(maxs\) 为所有 \(t=3\) 的节点中最大的 \(a\)

\(Code\)

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

vector<ll> E[100005];
ll g[100005];
ll f[100005];
ll t[100005];
ll a[100005];

inline void read(ll &x) {
    x = 0;
    ll flag = 1;
    char c = getchar();
    while(c < '0' || c > '9'){
        if(c == '-') flag = -1;
        c = getchar();
    }
    while(c >= '0' && c <= '9') {
        x = (x << 3) + (x << 1) + (c ^ 48);
        c = getchar();
    }
    x *= flag;
}

inline void write(ll x) {
    if(x < 0) {
        putchar('-');
        x = -x;
    }
    if(x > 9) write(x / 10);
    putchar(x % 10 + '0');
}

void ss(ll now, ll fa) {
    ll max1=0, max1_i, max2=0, max2_i;

    ll add=0;
    for(auto next: E[now]) {
        if(next == fa) continue;

        ss(next, now);

        g[now] += f[next];
        add = max(add, a[next]);

        if(t[next] == 3) {
            if(a[next] > max1) {
                max2 = max1;
                max2_i = max1_i;
                max1 = a[next];
                max1_i = next;
            } else if(a[next] > max2) {
                max2 = a[next];
                max2_i = next;
            }
        }
    }

    f[now] = g[now] + add;

    for(auto next: E[now]) {
        if(next == fa) continue;
        if(next != max1_i) {
            f[now] = max(f[now], g[now] - f[next] + g[next] + a[next] + max1);
        } else {
            f[now] = max(f[now], g[now] - f[next] + g[next] + a[next] + max2);
        }
    }
}

int main() {
    ll N;
    read(N);
    while(N--) {
        ll n;
        read(n);
        for(ll i=1; i<=n; i++) {
            read(a[i]);
            E[i].clear();
            f[i] = 0;
            g[i] = 0;
            t[i] = 0;
        }

        for(ll i=1; i<=n; i++) read(t[i]);

        for(ll i=1; i<n; i++) {
            ll x, y;
            read(x); read(y);

            E[x].push_back(y);
            E[y].push_back(x);
        }

        ss(1, 0);

        write(f[1]+a[1]);
        putchar('\n');
    }
    return 0;
}


标签:ICPC2021,P9847,max2,ll,max1,next,Crystalfly,now,节点
From: https://www.cnblogs.com/pure4knowledge/p/18019563

相关文章

  • 洛谷 P9843 [ICPC2021 Nanjing R] Paimon Sorting 题解
    Descirption给出一个排序算法(用伪代码表示):SORT(A)forifrom1tonforjfrom1tonifa[i]<a[j]Swapa[i]anda[j]算出对于一个序列\(A=a_1,a_2,\cdots,a_n\)的所有前缀\(A_k=a_1,a_2,\cdots,a_k\)(\(1\lek\len\)),\(\operatorname{SORT}(A_......
  • ICPC2021Kunming G Glass Bead Game 题解
    QuestionICPC2021KunmingGGlassBeadGame有\(n\)个玻璃珠,\(B_1,B_2,\cdots,B_n\)每一步你可以选择一个\(B_i\)移道第一个位置上,花费的代价为操作前\(B_i\)前面的玻璃珠的个数。已知每一步选择玻璃珠\(B_i\)的概率\(p_i\),问当\(m\rightarrow\infty\)时,在第\(......
  • ICPC2021Kunming G Find the Maximum 题解
    QuestionFindtheMaximum给出一个树,每个点有一个权值\(b_n\),求一条树上路径\(V\),要求\(\frac{\sum_{u\inV(-x^2+b_ux)}}{|V|}\)最大,其中\(x\)是自己选择的一个树Solution先转化一下\(\frac{\sum_{u\inV(-x^2+b_ux)}}{|V|}\),得到\[\frac{\sum_{u\inV(-x^2+b_......
  • P9447 [ICPC2021 WF] Spider Walk 题解
    更好的阅读体验很有意思的一道题。设\(f_i\)表示第\(i\)根线的答案,首先有一个关键结论:任意两根相邻的线答案只差一定小于\(1\)。原因显然,可以在无限远的地方加一根线来构造。该结论可以扩展一下,对于距离为\(d\)的两根线,答案之差不会超过\(d\)。考虑进行倒着加线,考虑加......
  • P9842 [ICPC2021 Nanjing R] Klee in Solitary Confinement
    P9842[ICPC2021NanjingR]KleeinSolitaryConfinement你说得对,但是Klee比根号可爱捏题意简述给定\(n,k\)和一个长为\(n\)的序列,你可以选择对区间\([l,r]\)的数整体加上\(k\),也可以不加。最大化众数出现次数并输出。分析直接做肯定是不好做的,考虑转换思路,考虑区......
  • P9840 [ICPC2021 Nanjing R] Oops, It's Yesterday Twice More
    P9840[ICPC2021NanjingR]Oops,It'sYesterdayTwiceMore注意到最后袋鼠要集中到一个点上,显然先走到四个角落之一再移动到点\((a,b)\)是最优的,可以证明,步数一定不超过\(3(n-1)\)。因为不知道具体要到哪一个角落里,因此记录\((a,b)\)到每个角落的距离并大力分类讨论即可......
  • P9847 [ICPC2021 Nanjing R] Crystalfly
    P9847[ICPC2021NanjingR]Crystalfly你说得对,但是刻晴更可爱捏翻译给定一个\(n(1\len\le10^5)\)个节点的树,每个节点上有\(a_i\)只晶蝶。派蒙最初在\(1\)号节点,并获得\(1\)号节点的所有晶蝶,接下来每一秒她可以移动到相邻的节点上并获得节点上的所有晶蝶,但是当她每到......