首页 > 其他分享 >CF1914F Programming Competition 贪心原则的DP?

CF1914F Programming Competition 贪心原则的DP?

时间:2023-12-26 21:25:32浏览次数:26  
标签:CF1914F 匹配 int siz Programming Competition son 子树 mx

终于理解了...

希望写给小伙伴们,希望大伙可以理解。

先确定贪心规则,即当最大子树不超过根子树减一的一半时,内部节点可以完全匹配。否则,可以先拿其他子树节点与最大子树内部节点匹配,子树内部再进行匹配。啥你说子树内部不够匹配怎么办?可以这么想,你这样都到匹配上限了,已经完全可以达到最优秀情况,取max即可。

设f[u]为以u为根的子树的最大匹配数。转移方程略。

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=(a);i<=(b);++i)
#define per(i,a,b) for(int i=(a);i>=(b);--i)
using namespace std;
const int N=2e5+5;

int siz[N],n;
vector<int> son[N];
int f[N];

void find_siz(int u){
    siz[u]=1;
    for(int& v:son[u]){
        find_siz(v);
        siz[u]+=siz[v];
    }
}

void dfs(int u){
    int mx=-1;
    for(int v:son[u]){
        if(mx==-1||siz[v]>siz[mx]) mx=v;
        dfs(v);
    }
    if(mx==-1) {
        f[u]=0;
        return;
    }
    int res=siz[u]-siz[mx]-1;
    if(res>=siz[mx]){
        f[u]=(siz[u]-1)/2;
        return;
    }
    f[u]=min(res+f[mx],(siz[u]-1)/2);
}

void solve(){
    fill(f,f+N,0);
    fill(siz,siz+N,0);
    cin>>n;
    rep(i,0,n) son[i].clear();

    rep(i,2,n){
        int x;cin>>x;
        son[x].push_back(i);
    }
    find_siz(1);
    dfs(1);
    cout<<f[1]<<'\n';
}

signed main(){
    int T;
    cin>>T;
    while(T--)
        solve();
}

  

标签:CF1914F,匹配,int,siz,Programming,Competition,son,子树,mx
From: https://www.cnblogs.com/Kopicy/p/17929375.html

相关文章

  • Programming Abstractions in C阅读笔记:p235-p241
    《ProgrammingAbstractionsinC》学习第66天,p235-p241总结。一、技术总结1.backtrackingalgorithm(回溯算法)(1)定义p236,Formanyreal-worldproblem,thesolutionprocessconsitsofworkingyourwaythroughasequenceofdecisionpointsinwhicheachchoicleadsyo......
  • CF1914F Programming Competition
    原题链接感觉有点类似agc034eCompleteCompress,但那题比这个难得多。定义\(f_x\)为以\(x\)为根的子树中,尽可能组队后最多剩下多少人,\(siz_x\)为子树大小。记\(y\inson(x)\)中\(f_y\)最大的点为\(hson_x\)。当\(\sum\limits_{y\inson(x),y\not=hson_x}siz_y<......
  • (15-418)Lecture 3 Parallel Programming Abstractions
    抽象VS实现实例:ISPC程序ISPC是一种SPMD(singleprogrammultipledata)编译器。利用ISPC编写的计算sin(x)的程序如下图:ISPC提供了一种抽象,当调用ISPC函数时(即程序中调用sinx的语句),会产生一个gang,这个gang含有多个ISPC实例,每个实例会执行自己的代码,当每个实例都执行完后,恢复原先......
  • 2023 China Collegiate Programming Contest (CCPC) Guilin Onsite (The 2nd Universa
    题解:https://files.cnblogs.com/files/clrs97/2023Guilin_Tutorial.pdf Code:A.EasyDiameterProblem#include<bits/stdc++.h>usingnamespacestd;constintN=300;constintmod=1e9+7;typedefpair<int,int>pii;vector<pair<int,int......
  • Toyota Programming Contest 2023#8(AtCoder Beginner Contest 333)
    ToyotaProgrammingContest2023#8(AtCoderBeginnerContest333)A-ThreeThrees代码:#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;constintN=1e6+10;typedefpair<ll,ll>pii;#definefifirst#definesesecondvoid......
  • docker启动容器报错:Error response from daemon: driver failed programming external
    安装的docker启动报错如下:Errorresponsefromdaemon:driverfailedprogrammingexternalconnectivityonendpointnacos(2b0f4edff8f640559af9626936d1b38d965302ef525af483716e8e8c9121583e):(iptablesfailed:iptables--wait-tnat-ADOCKER-ptcp-d0/0--dp......
  • 《Function Programming in C++》
    说明《FunctionalProgramminginC++》书中代码练习测试以及一些笔记,部分代码需要用到C++20可以使用在线编译器编译代码地址:https://coliru.stacked-crooked.com/或者自己编译gcc-11.2及以上版本安装1介绍1.1什么是函数式编程用常用的函数范式模板代替一些循环等,比如std......
  • 2023 CCPC Henan Provincial Collegiate Programming Contest
    Preface徐神在训练前宣称要复习计通网,结果最后还是相当于全程参与了我们的训练这场我纯纯战犯表现,Easy题E狂挂7发最后发现原来是多测没清空干净,直接红温占用中期1h机时但好在祁神稳切了一手压轴计算几何,同时最后2h把卡着的题都过完了,最后又靠着题数捧杯(唉还在打弱省省赛找自信)......
  • Daiwa Securities Co. Ltd. Programming Contest 2023(AtCoder Beginner Contest 331)
    DaiwaSecuritiesCo.Ltd.ProgrammingContest2023(AtCoderBeginnerContest331)A-Tomorrow解题思路:模拟。代码:#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;typedefpair<int,int>pii;#definefifirst#definesesecondcons......
  • The Main Idea of Basic Dynamic Programming Side A
    Front对zjk的BasicDynamicProgrammingSideA的补充、总结以及Code。SideA:DP状态设计。常见的DP状态树树上DP常见的状态是考虑子树内的情况,然后通过子树的状态向上合并。复杂度一般是\(O(n^3)\),一些特殊的DP转移方程通常可以通过分析优化掉一个\(n\)。......