首页 > 其他分享 >CF708C Centroids 换根dp

CF708C Centroids 换根dp

时间:2023-06-22 21:01:15浏览次数:48  
标签:maxx CF708C int siz fath cut Max 换根 dp

CF708C Centroids

一道换根 DP。

我们可以先找出树的一个重心,那么对于其他所有不是重心的点,它不能成为重心时因为它父亲的那一支节点数大于一半,而可以改造成功,则意味着可以在他父亲那一支里,可以找到子树u,使 $siz[u] \le n/2$ && $siz[fa]-siz[u] \le n/2 $ 。简而言之,就是对于每个节点,我们要找除了节点本身以外的部分中不超出 $\left \lfloor \frac{n}{2}  \right \rfloor$  的最大子树大小,我们记为cut(u),接下来就是换根dp。

 我们用 $Max[u][0/1]$ 记录子树u中最大/次大的子树大小,maxx为u的祖先节点中最大的子树大小(dfs的时候带的参数)。

$\left\{\begin{matrix}cut[v]= \max(maxx,Max[u][0]),if(siz[v]!=Max[u][0]) \\cut[v]=max(maxx,Max[u][1]),if(siz[v]!=Max[u][0])\end{matrix}\right. $ 

对于每一个节点 $u$,我们只需要看 $N-siz[u]-cut[u]\le\left \lfloor \frac{N}{2}  \right \rfloor  $ 是否成立即可。

#include<bits/stdc++.h>
using namespace std;
const int N=8e5+5;
struct edge{
    int to,nex;
}e[N];
int cnt,h[N],n,siz[N],Max[N][3];
void adda(int u,int v){
    e[++cnt].nex=h[u];e[cnt].to=v;h[u]=cnt;
}
int rt,fa[N];
void dfs1(int u,int fath){
    bool p=1;
    siz[u]=1;
    for(int i=h[u];i;i=e[i].nex){
        int v=e[i].to;
        if(v==fath) continue; 
        dfs1(v,u);
        //if(siz[v]<=n/2) Max[u]=max(Max[u],siz[v]);
        siz[u]+=siz[v];
        if(siz[v]>(n/2)) p=0;
    }
    if(n-siz[u]>(n/2)) p=0;
    if(p) rt=u;
    return;
}
void dfs2(int u,int fath){
    fa[u]=fath;
    siz[u]=1;
    for(int i=h[u];i;i=e[i].nex){
        int v=e[i].to;
        if(v==fath) continue;
        dfs2(v,u);
        siz[u]+=siz[v];
        if(siz[v]>n/2) continue;
        if(siz[v]>Max[u][0]) Max[u][1]=Max[u][0],Max[u][0]=siz[v];
        else if(siz[v]>Max[u][1]) Max[u][1]=siz[v];
    }
}
int cut[N];
bool ans[N];
void dfs3(int u,int maxx){
    cut[u]=maxx;
    if(n-siz[u]-cut[u]<=n/2) ans[u]=1;
    if(n-siz[u]<=n/2) maxx=max(maxx,n-siz[u]);
    for(int i=h[u];i;i=e[i].nex){
        int v=e[i].to;
        if(v==fa[u]) continue;
        //dfs3(v,maxx);
        if(siz[v]==Max[u][0]) dfs3(v,max(maxx,Max[u][1]));
        else dfs3(v,max(maxx,Max[u][0]));
    }
}
int main(){
    cin>>n;
    for(int i=1,u,v;i<n;i++){
        scanf("%d%d",&u,&v);
        adda(u,v);adda(v,u);
    }
    dfs1(1,0);
    ans[rt]=1;
    //cout<<rt;
    dfs2(rt,0);
    dfs3(rt,0);
    for(int i=1;i<=n;i++){
        if(ans[i]) printf("1 ");
        else printf("0 ");
    }
}
View Code

 

标签:maxx,CF708C,int,siz,fath,cut,Max,换根,dp
From: https://www.cnblogs.com/DongPD/p/17498336.html

相关文章

  • RAW域算法之坏点消除DPC
    坏点检测/消除(DefectPixelDetection/Correction)与FPN类似,坏点的产生也与Sensor的工艺有关。与FPN不同的是,坏点有固定点和疑似坏点两种。而后者的出现相对不固定,会随着曝光时间以及温度的变化而变。因此进行坏点消除之前需要首先进行坏点检测(DefectPixelDetection)......
  • UDP recvfrom error错误10022
    fromlen参数没有初始化from参数没有设置正确,也就是结构问题终于发现原来是bind函数的问题。由于在文件开头使用了usingnamespacestd导致默认的bind变成了functional中的那个,而不是socket的bind,导致绑定一直没有成功。当然,也可能是套接字端口被占用......
  • DPU-DOCA编程
    2.1.DOCAAppShield/  DOCA应用程序屏蔽DOCAAppShieldlibraryAPIoffersintrusiondetectioncapabilitiesusingthebuilt-inhardwareservicesoftheDPUtocollectdatafromthehost'smemoryspace.AppShieldmakesitpossibletodetectattacksoncri......
  • 西门子Tecnomatix PDPS软件安装问题
    安装教程和相应的百度网盘文件可自行搜索下载:安装过程遇到的问题1:Association时,提示:ThefollowingerroroccurredwhileappliyingSystemRoot:拒绝访问。解决方法:gpedit.msc打开,找到:计算机配置-->Windows设置-->安全设置-->本地策略-->安全选项,找到并禁用如下两项:(1)用户账......
  • 探索WordPress:开源内容管理系统的强大功能和灵活性
    WordPress是一款广泛使用的开源内容管理系统(CMS),它提供了许多强大的功能和灵活性,使其成为建立和管理网站的首选工具。在本篇博客中,我们将深入探讨WordPress的一些关键功能和技术,以及如何最大限度地发挥其潜力。1.简单易用的界面和内容管理WordPress提供了一个直观且用户友好的管......
  • SPSS Modeler用K-means(K-均值)聚类、CHAID、CART决策树分析31省市土地利用情况和GDP数
    全文链接:http://tecdat.cn/?p=32840原文出处:拓端数据部落公众号随着经济的快速发展和城市化进程的不断推进,土地资源的利用和管理成为了一项极为重要的任务。而对于全国各省市而言,如何合理利用土地资源,通过科学的方法进行规划和管理,是提高土地利用效率的关键。本文旨在应用SPSS......
  • px、pt、in、dp、dpi
      PPI与DPIppi的运算方式是:PPI=√(长度像素数²+宽度像素数²)/屏幕对角线英寸数。即:长、宽各自平方之和的开方,再除以屏幕对角线的英寸数。以iphone5为例,其ppi=√(1136px²+640px²)/4in=326ppi(视网膜Retina屏)可以参考:http://www.paintcodeapp.com/news/iphone-6-screens......
  • 狂刷DP
    不行啊都开始卷了,补一下弱项P5020货币系统个人认为题面写复杂了,真没啥必要。。。很明显的背包问题。设\(dp_i\)为面值为\(i\)的钱最多需要多少张货币来表示。那么就直接跑背包就行了,表示不了的为\(dp_i=-inf\),能表示的且只有它自己能的为\(dp_i=1\)。点击查看代码#......
  • UVA12222 Mountain Road 山路 题解 dp
    UVA12222山路题意:--一个山路只有一条车道,因此不能有两辆方向相反的车同时在车道内。同时,为了保证安全,车道内不能超车,且同向行驶的车间距必须大于10分钟。现在给你n辆车,三个参数依次表示行驶方向,到达时刻,行驶时间。问如何安排能使最后一个通过的车通过时的时刻最小,输出这个值......
  • 通用能力及AI核心能力表现优异!合合信息智能文档处理系统(IDP)高评级通过中国信通院评估
    数字经济快速发展的背后,全球数据总量呈现出爆发式增长趋势。智能文档处理(IDP)技术能够高效地从多格式文档中捕捉、提取和处理数据,帮助机构和企业大幅提升文档处理效率,节约时间和人力成本。近期,合合信息智能文字识别产品通过中国信息通信研究院(以下简称“中国信通院”)“可信AI—智能......