首页 > 其他分享 >P7215 JOISC2020 首都

P7215 JOISC2020 首都

时间:2024-11-27 16:32:59浏览次数:6  
标签:int siz JOISC2020 dfs book edge maxn P7215 首都

P7215 JOISC2020 首都

点分治好题。

思路

求出当前分治中心,把当前分治中心作为首都,暴力跑需要合并多少个城市,不能越过上一层分治中心。

如果越过了上一个分治中心,把上一个分治中心作为首都也可以起到相同的效果,就没有必要再跑一次了。

时间复杂度 \(O(n\log n)\)。

CODE

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

const int maxn=2e5+5;

struct Edge
{
    int tot;
    int head[maxn];
    struct edgenode{int to,nxt;}edge[maxn*2];
    inline void add(int x,int y)
    {
        tot++;
        edge[tot].to=y;
        edge[tot].nxt=head[x];
        head[x]=tot;
    }
}T;

int n,ans;
int col[maxn],fa[maxn],bol[maxn];

vector<int>vec[maxn];

int siz[maxn];
bool cut[maxn],book[maxn],vis[maxn];
inline void dfs_siz(int u)
{
    book[u]=true;siz[u]=1;
    for(int i=T.head[u];i;i=T.edge[i].nxt)
    {
        int v=T.edge[i].to;
        if(book[v]||cut[v]) continue;
        dfs_siz(v);siz[u]+=siz[v];
    }
    book[u]=false;
}
inline int dfs_rt(int u,const int tot)
{
    book[u]=true;int ret=u;
    for(int i=T.head[u];i;i=T.edge[i].nxt)
    {
        int v=T.edge[i].to;
        if(book[v]||cut[v]) continue;
        if(siz[v]*2>=tot){ret=dfs_rt(v,tot);break;}
    }
    book[u]=false;return ret;
}
int cnt;
inline void bfs(int g)
{
    queue<int>que;
    for(auto v:vec[col[g]])
    {
        que.push(v),vis[v]=true;
        if(bol[v]!=g) {cnt=n;return ;}
    }
    while(!que.empty())
    {
        int u=que.front();que.pop();
        if(vis[fa[u]]) continue;
        for(auto v:vec[col[fa[u]]])
        {
            que.push(v),vis[v]=true;
            if(bol[v]!=g) {cnt=n;return ;}
        }
        cnt++;
    }
}
inline void dfs2(int u,const int g)
{
    book[u]=true;vis[u]=false;bol[u]=g;
    for(int i=T.head[u];i;i=T.edge[i].nxt)
    {
        int v=T.edge[i].to;
        if(book[v]||cut[v]) continue;
        fa[v]=u;
        dfs2(v,g);
    }
    book[u]=false;
}
inline void dfs(int u)
{
    dfs_siz(u);int g=dfs_rt(u,siz[u]);cut[g]=true;
    fa[g]=g;dfs2(g,g);cnt=0;bfs(g);ans=min(ans,cnt);
    for(int i=T.head[g];i;i=T.edge[i].nxt)
    {
        int v=T.edge[i].to;
        if(cut[v]) continue;
        dfs(v);
    }
}

int main()
{
    scanf("%d%d",&n,&ans);
    for(int i=1;i<n;i++)
    {
        int u,v;
        scanf("%d%d",&u,&v);
        T.add(u,v),T.add(v,u);
    }
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&col[i]);
        vec[col[i]].emplace_back(i);
    }
    dfs(1);
    printf("%d",ans);
}

标签:int,siz,JOISC2020,dfs,book,edge,maxn,P7215,首都
From: https://www.cnblogs.com/binbin200811/p/18572584

相关文章

  • JOISC2020 Day 4 A 首都 题解
    JOISC2020Day4A首都JOIAtCoderLuogu考虑一条链的情形。如图,将每个城市视为一条线段,容易发现交错(有交但不包含)的若干线段必须全部合并才能符合条件。但如果这么写会出错,原因是线段有包含关系,外层线段需要统计内层线段的答案,但内层线段不需要统计外层线段的答案。如果设内......
  • P7215 [JOISC2020] 首都]
    P7215[JOISC2020]首都考虑对于颜色\(c_i\),若在此颜色集合内所有节点之间的路径上出现了其他颜色(如\(c_j\)),那我们则不得不将这两种颜色合并在一起,操作数加一。即对于颜色\(c_i\),若设其为首都,其答案(操作数)为所有颜色为\(c_i\)的节点之间的路径上的颜色种类......
  • P7219 [JOISC2020] 星座 3 题解
    会发现题目的坐标其实是平面直角坐标系。我们按\(y\)坐标从小到大考虑所有的星星,假设当前考虑到了星星\(i\)。我们先计算出之前所有能够影响到\(i\)的星星的代价和为\(cost\)(可以用树状数组维护)。然后分类讨论。若\(c_i\lecost\),那么肯定直接将\(i\)直接涂黑,因为它更......
  • P7219 [JOISC2020] 星座 3【笛卡尔树+整体dp】
    P7219[JOISC2020]星座3笛卡尔树+整体dp(线段树合并维护dp)考虑转化题意,不存在矩形为星座,即对于每个极大矩形中都只有一颗星星。而观察题目的方格,对于两个位置是否能够成为一个矩形,只和两个位置的区间最大值(小白船的位置)有关①。图中的红蓝矩形即为两个极大矩形。将删除星......
  • JOISC2020
    [JOISC2020]最古の遺跡3好难的题。首先考虑给出\(h\)怎么求\(A\),设\(h'_i\)为\(i\)位置剩下的高度,没了就\(=0\)。方便起见,我们把原序列翻转一下,那么题目的操作就是,每种高度的最靠左的位置不变。我们从左到右依次求解,先令\(h'_i=h_i\),若\(h'_i\)在\(j<i\)的\(......
  • [JOISC2020] 扫除
    现在Bitaro准备用扫帚打扫房间。我们认为扫帚是放置在房间里的一条线段,并且将这条线段的长度称为扫帚的宽度。由于Bitaro很有条理,所以他只会用以下的两种方式打扫房间:Bitaro将扫帚平行于\(y\)轴放置,一端位于原点。然后他会垂直向右移动扫帚,直到不能移动为止。如果扫帚的......
  • [JOISC2020] 最古の遺跡 3
    [JOISC2020]最古の遺跡3题目背景JOI教授是一名研究IOI王国的历史学家。题目描述他发现了一行古代石柱的废墟及一份古代文献。古代文献上的记载如下:刚建造完成的时候,有\(2\timesN\)个石柱,对于\(1\lek\leN\)均有两个石柱高度为\(k\),同时记第\(i\)个石柱的高度......
  • JOISC2020题解
    \(\text{ByDaiRuiChen007}\)ContestLinkA.Building4ProblemLink题目大意给\(2n\)个数对\((a_i,b_i)\),构造一个非降序列\(c_i\)满足\(\forall1\lei\len,c_i\in\{a_i,b_i\}\),且\(c_i=a_i\)的位置恰好有\(n\)个。数据范围:\(n\le5\times10^5\)。思路......
  • 云行 | 云启新境 智赋未来,天翼云智绘数字首都新图景!
    2023年12月12日,以“云启新境,智赋未来”为主题的天翼云中国行·北京站活动在北京圆满举行,会上中国信息通信研究院和天翼云科技有限公司联合发布央国企上云白皮书,为推动政府企事业单位上云用云制定标准,为各单位生产方式、业务形态、商业模式的数字化创新转型持续助力。国wu院国有资产......
  • 力扣2477. 到达首都的最少油耗(dfs+贪心)
    给你一棵 n 个节点的树(一个无向、连通、无环图),每个节点表示一个城市,编号从 0 到 n-1 ,且恰好有 n-1 条路。0 是首都。给你一个二维整数数组 roads ,其中 roads[i]=[ai,bi] ,表示城市 ai 和 bi 之间有一条 双向路 。每个城市里有一个代表,他们都要去首都参......