首页 > 其他分享 >2024CCPC吉林省赛:B题

2024CCPC吉林省赛:B题

时间:2024-09-02 11:37:50浏览次数:2  
标签:吉林省 val 奇数 int 奇偶性 2024CCPC 序号 节点

前言

这是我的第一篇文章,并没有真正补题,只是尝试着用一下Markdown。今天睡觉来着,明天开始发补题文章。下面是一道简单题,但我犯了一些愚蠢的错误,被这玩意卡了将近三小时,导致整场比赛自己只写了B和F两个题。好不容易写完代码,交一发直接WA on 2,多亏实力强到允许我摆烂的队友一眼找出bug,不然这题直接挂了……

唉,我怎么这么菜啊

B. Dfs Order 0.5

题意

给出一棵树,节点编号从1到n,1号节点为根。每个节点都有一定的权重。定义一个dfs序的得分为:在dfs序中的编号(以下简称为序号)为偶数的的节点的权重之和。其中1号节点序号为1。求最大得分。

解法

此题显然是树形DP,维护以每个节点为根的子树可以获得的最大得分。如果以x号节点为根的子树共有奇数个节点,不妨称x为奇数点,反之为偶数点。在x的序号分别为奇数、偶数的情况下,设以x为根的子树的最大得分分别为val[x][1]和val[x][0]。如果x的子节点全为偶数点,那么它们序号的奇偶性一定与x不同;如果x的子节点中存在奇数点,那么所有偶数子节点的序号的奇偶性可以任取[1],而对于所有奇数子节点,序号为奇数和偶数的各占一半[2]

[1] 考虑第一个走到的奇数子节点s,如果一个偶数子节点在s之前走到,那它序号的奇偶性就和s相同,也就是和根x不同;如果在s之后走到,则序号奇偶性和x相同。所以可以任取。
[2] 每走完一棵以奇数点为根的子树,序号奇偶性都会切换奇数次,也就是说,下一个走到的子节点的序号的奇偶性和当前这个一定不同。所以奇偶各占一半。

可以先假设所有奇数子节点的序号都是奇数,现在需要把其中一部分改为偶数。对于每个奇数子节点s,算出序号由奇变为偶的得分增益

tr[s] = val[s][0] - val[s][1]

把tr数组从大到小排序,取前一半就好了。
然后就做完了。最终答案就是val[1][1]。

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
#define ll long long
using namespace std;
const int N = 2e5 + 5;

int ti, n;
bool vis[N], f[N];
ll a[N], val[N][2], tr[N];
vector<int> ve[N];

bool cmp(ll t1, ll t2){
    return t1 > t2;
}

void dfs(int x){
    vis[x] = 1;
    int sz = ve[x].size();
    if(x != 1 && sz == 1){
        val[x][0] = a[x];
        return;
    }
    int pos = -1;
    bool flagji = 0, flagou = 0;
    for(int i = 0; i < sz; i++){
        int to = ve[x][i];
        if(!vis[to]){
            dfs(to);
            if(f[to]) flagou = 1;
            else flagji = 1;
        }
        else pos = i;
    }
    if(!flagji){
        for(int i = 0; i < sz; i++){
            if(i == pos) continue;
            int to = ve[x][i];
            val[x][0] += val[to][1];
            val[x][1] += val[to][0];
        }
        val[x][0] += a[x];
        return;
    }
    int p = 0;
    for(int i = 0; i < sz; i++){
        if(i == pos) continue;
        int to = ve[x][i];
        if(f[to]){
            val[x][0] += max(val[to][0], val[to][1]);
            continue;
        }
        tr[++p] = val[to][0] - val[to][1];
        val[x][0] += val[to][1];
    }
    if(p % 2) f[x] = 1;
    sort(tr + 1, tr + 1 + p, cmp);
    for(int i = 1; i <= p / 2; i++){
        val[x][0] += tr[i];
    }
    val[x][1] = val[x][0];
    if(p % 2) val[x][1] += tr[p / 2 + 1];
    val[x][0] += a[x];
}

int main(){
    scanf("%d", &ti);
    while(ti--){
        scanf("%d", &n);
        for(int i = 1; i <= n; i++){
            scanf("%lld", &a[i]);
            val[i][0] = 0;
            val[i][1] = 0;
            f[i] = 0;
            vis[i] = 0;
            ve[i].clear();
        }
        int u, v;
        for(int i = 1; i < n; i++){
            scanf("%d%d", &u, &v);
            ve[u].push_back(v);
            ve[v].push_back(u);
        }
        if(n == 1){
            printf("0\n");
            continue;
        }
        dfs(1);
        printf("%lld\n", val[1][1]);
    }
    return 0;
}

标签:吉林省,val,奇数,int,奇偶性,2024CCPC,序号,节点
From: https://www.cnblogs.com/qjsswz/p/18392409

相关文章

  • 提前看!24年吉林省直事业单位报名注意事项
    要参加24年吉林省直事业单位的宝子们注意啦⏰报名时间本周日:7月9日9:00—7月11日16:00;报名只有三天时间,所以一定要提前准备材料防止报名的时候手忙脚乱,⚠️特别注意的是:1️⃣首次使用该平台,需上传近期6个月内的正面免冠证件数码彩色照片2️⃣未取得毕业证的同学们,需提前准备本......
  • 2024CCPC东北四省邀请赛VP
    ProblemJ.Breakfast直接根据题意模拟即可:#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;constintN=1e6+10,mod=1e9+7;signedmain(){std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);doublex=32*0.6+20;printf("......
  • 2024CCPC郑州邀请赛暨河南省赛总结-lzg
    这次比赛总体来说发挥的不太好,最后就过了三道,本来以为这次又要毫无收获了,结果居然邀请赛和省赛奖分开发,拿到了省赛的小铜牌,稍微治愈了一下我幼小的心灵~一开始写的还挺快的,F题签到题直接过了,接着码的B题,杨姐提供的思路,就是中间代码小细节写错了,wa了两发,但问题不大。然后......
  • 「游记」2024 吉林省赛和 2024 东北四省赛
    Before本文是\(2024\)中国大学生程序设计竞赛全国邀请赛(长春)暨第\(17\)届吉林省大学生设计竞赛和新建比赛的游记写的很烂写的很烂写的很烂Day0省赛报到及热身赛。\(14:00\)前报到。\(12:00\)和一名队员在校门口集合了,但另一名队员才起床。会合后打车前往东师净月校区......
  • 2024CCPC郑州邀请赛
    2024CCPC郑州邀请赛题解[比赛地址](2024NationalInvitationalofCCPC(Zhengzhou),2024CCPCHenanProvincialCollegiateProgrammingContest)A:解题思路:设\(n=12153,m=5\),其中\(m\)是\(n\)十进制数位个数。我们构造一个数\(N=123456789d\times10^k\)为答......
  • 喜报!中国工商银行长春分行荣获吉林省“巾帼建功”先进集体称号
    近日,为表彰先进、树立榜样,进一步引领和激励全省广大妇女以更加饱满的热情、更加昂扬的斗志,为新时代吉林全面振兴贡献巾帼力量,吉林省委、省政府决定对全省“巾帼建功”先进集......