惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

腾讯CDC
The Cloudflare Blog
IT之家
IT之家
V
V2EX
雷峰网
雷峰网
MyScale Blog
MyScale Blog
P
Proofpoint News Feed
Stack Overflow Blog
Stack Overflow Blog
博客园 - Franky
Engineering at Meta
Engineering at Meta
S
SegmentFault 最新的问题
GbyAI
GbyAI
Microsoft Azure Blog
Microsoft Azure Blog
博客园 - 司徒正美
云风的 BLOG
云风的 BLOG
小众软件
小众软件
博客园 - 叶小钗
Blog — PlanetScale
Blog — PlanetScale
C
Check Point Blog
A
About on SuperTechFans
B
Blog
月光博客
月光博客
宝玉的分享
宝玉的分享
Last Week in AI
Last Week in AI

某岛

AtCoder Beginner Contest 409 Luogu P5325. 【模板】Min_25 筛 UOJ #188. 【UR #13】Sanrd AtCoder Beginner Contest 371 AtCoder Beginner Contest 369 RPGMaker 2k3 百科 OneShot 的考古 2024“开创拓芯”游戏创享节的相关记录 CJ 回来后的戒断反应 Luogu P10221. [省选联考 2024] 重塑时光 Luogu P5308 [COCI2018-2019#4] Akvizna wqs 二分 歌唱王国 Lean 相关 BZOJ 3153. Sone1 The 2023 ICPC World Finals Luxor 新巴别塔 Sora 的想象与思考 Facebook Hacker Cup 2023 Round 1 AtCoder Beginner Contest 322 LLaMA 2 相关 HuggingFace AI Game Jam ACL 2023 Trans 相关… Luogu P2053. [SCOI2007] 修车 Luogu P1973. [NOI2011] NOI 嘉年华 Luogu P1933. [NOI2010] 旅行路线 Luogu P1954. [NOI2010] 航空管制 Luogu P2048. [NOI2010] 超级钢琴 Luogu P2046. [NOI2010] 海拔
换根 dp
2023-06-02 · via 某岛
#include <lastweapon/number>
using namespace lastweapon;

const int N = int(1e5) + 9;
VI adj[N]; Int f[N][3]; int c[N];
int n, k;

Int s(int u) {
    return f[u][0] + f[u][1] + f[u][2];
}

void dfs(int u = 0, int p = -1) {

    REP(i, 3) if (!c[u] || (c[u]-1) == i) f[u][i] = 1;

    for (auto v: adj[u]) if (v != p) {
        dfs(v, u);
        REP(i, 3) f[u][i] *= s(v) - f[v][i];
    }
}

int main() {

#ifndef ONLINE_JUDGE
    freopen("barnpainting.in", "r", stdin);
    freopen("barnpainting.out", "w", stdout);
#endif

    RD(n, k);
    DO(n-1) {
        int a, b; RD(a, b); --a, --b;
        adj[a].PB(b);
        adj[b].PB(a);
    }
    DO(k) {
        int a; RD(a); --a;
        RD(c[a]);
    }
    dfs();
    cout << s(0) << endl;
}

#include <lastweapon/number>
using namespace lastweapon;

const int N = int(3e5) + 9;
VI adj[N];PII f[N], g[N], h[N];int a[N], m[N], s[N];
int n;
LL k;

void dfs1(int u, int p) {
    for(int& v : adj[u]) {
        if(v == p) continue;
        dfs1(v, u);
        PII val = max(f[v], PII{a[v], -v});
        val.first--;
        if (val > f[u]) {
            h[u] = f[u];
            f[u] = val;
        } else if (val > h[u]) {
            h[u] = val;
        }
    }
}

void dfs2(int u, int p) {
    for(int& v : adj[u]) {
        if(v == p) continue;
        g[v] = max(g[u], (f[u] == max(PII{f[v].first-1, f[v].second}, {a[v]-1, -v}) ? h[u] : f[u]), PII{a[u], -u});
        g[v].first--;
        dfs2(v, u);
    }
}

int main() {

#ifndef ONLINE_JUDGE
    freopen("in.txt", "r", stdin);
    //freopen("out.txt", "w", stdout);
#elif
    //freopen("barnpainting.in", "r", stdin);
    //freopen("barnpainting.out", "w", stdout);
#endif

    RD(n, k);
    REP(i, n) RD(a[i]);
    int a, b;
    DO(n-1) {
        RD(a, b);
        a--, b--;
        adj[a].PB(b);
        adj[b].PB(a);
    }
    REP(i, n) {
        f[i] = {-INT_MAX, -INT_MAX};
        g[i] = {-INT_MAX, -INT_MAX};
        h[i] = {-INT_MAX, -INT_MAX};
    }
    dfs1(0, 0);
    dfs2(0, 0);

    //REP(i, n) cout << i << '/' << f[i] << '/' << g[i] << endl;

    int j = 0;
    REP_1(i, n+1) {
        j = -max(f[j], g[j]).second;
        if(m[j]) {
            int ans;
            if(k <= m[j]) {
                ans = k;
            } else {
                ans = ((k-m[j]) % (i-m[j])) + m[j];
            }
            cout << s[ans]+1 << endl;
            break;
        }
        m[j] = i;
        s[i] = j;
    }
}

Posted by xiaodao
Category: 日常