首页 > 其他分享 >Codeforces Round #748 (Div. 3) E

Codeforces Round #748 (Div. 3) E

时间:2022-10-16 21:44:32浏览次数:50  
标签:const 748 Codeforces back int push Div 节点

E. Gardener and Tree

显然我们对于每一个叶节点是度数为1的
我们如果删除外层叶节点的时候
显然也要改变与他与他连接的节点的度数
而只有可以能在这些节点里诞生新的叶节点 注意也可能不会诞生
所以对于每一次我们一层一层的去bfs就可以了
当然我们要特判n==1的情况

#include <bits/stdc++.h>
using namespace std;
const int N = 4e5+10;
const int M = 998244353;
const int mod = 20220911;
#define int long long
int up(int a,int b){return a<0?a/b:(a+b-1)/b;}
#define endl '\n'
#define all(x) (x).begin(),(x).end()
#define YES cout<<"YES"<<endl;
#define NO cout<<"NO"<<endl;
#define _ 0
#define pi acos(-1)
#define INF 0x3f3f3f3f3f3f3f3f
#define fast ios::sync_with_stdio(false);cin.tie(nullptr);
int n,k,d[N];
vector<int>g[N];
void solve() {
    cin>>n>>k;
    for(int i=1;i<=n;i++)g[i].clear(),d[i]=0;
    for(int i=1;i<n;i++){
        int u,v;cin>>u>>v;
        g[u].push_back(v);
        g[v].push_back(u);
        d[u]++,d[v]++;
    }
    if(n==1){cout<<0<<endl;return;}
    vector<int>q;
    for(int i=1;i<=n;i++)if(d[i]==1)q.push_back(i);
    int cnt=q.size();
    int c=1;
    if(c==k){cout<<n-cnt<<endl;return;}
    while(q.size()){
        vector<int>nxt;
        for(auto u:q)
            for(auto v:g[u]){
                d[v]--;
                if(d[v]==1)nxt.push_back(v);
            }
        q=nxt;
        cnt+=q.size();
        c++;
        if(c==k){cout<<n-cnt<<endl;return;}
    }
    cout<<0<<endl;
}
signed main(){
    fast
    int t;t=1;cin>>t;
    while(t--) {
        solve();
    }
    return ~~(0^_^0);
}

标签:const,748,Codeforces,back,int,push,Div,节点
From: https://www.cnblogs.com/ycllz/p/16797303.html

相关文章

  • Codeforces Round #752 B
    B.ModerateModularMode先列式子n=k1x+by=k2n+b我们把第二个式子n单独提出来(y-b)/k2=k1x+by=k1k2x+(k2+1)b因为题中给出xy都是偶数显然我们可以构造k1=1k2=1......
  • [题解] Codeforces Global Round 23 1746 A B C D E1 F 题解
    点我看题求点赞A.Maxmina首先序列全0的情况肯定是NO。否则,如果\(k\ge3\),则在序列中随便找一个1,把他左边和右边分别用第一种操作不断缩,直到序列长度为k为止,最后用一次2......
  • Codeforces Global Round 23
    A.Maxmina显然结果全为0时,结果为NO,若有1,我们通过操作1使长度变为k,里面包含至少1,通过操作2,结果即为YES1#include<bits/stdc++.h>2usingnamespacestd;3consti......
  • Codeforces Global Round 23题解
    T1link大水题,不想说最后一定可以把一个序列消成长度为\(k\)的带一序列,前提是其原来就有一所以贪心就是如果有一,就行,反之不行codeT2linkwssb,考试的时候居然想了大......
  • Codeforces Global Round 23 (A-E1)个人题解
    A-Maxmina给定一个01串,我们可以将k个数变为他们的最大值(k个数变成1个数),或者将相邻的两个数变为他们的最小值(2个数变成1个数),询问是否可以将这个01串变成仅含有一个1的......
  • Codeforces Global Round 23 题解
    ContestLink我是智障。A.MaxminaProblemLink显然当数组中全是\(0\)的时候,最后不可能变成\(1\),因为我们只有相邻取\(\min\)和区间取\(\max\)两种操作,并没有任......
  • Codeforces试题乱做 Part8
    搬机房的第一天.\(\text{[CF1270I]XoronFigures}\)\(\color{red}{\text{[HARD]}}\)为数不多的\(3500\)清新题.观察到这是个二维循环卷积的形式,考虑矩阵刻画.重......
  • 748. 数组的右下半部分
    文章目录​​Question​​​​Ideas​​​​Code​​Question输入一个二维数组M[12][12],根据输入的要求,求出二维数组的右下半部分元素的平均值或元素的和。右下半部分是指......
  • Codeforces Global Round 17 C
    C.KeshiIsThrowingaParty我们显然可以二分答案我们的最优解情况就是从小到大的选择要是a[i]>=x-cnt-1(还要减去自身)&&b[i]>=cnt我们就把他算进去这样肯定是最优......
  • [Editorial] Codeforces Contest 878D
    中文题面好题,写篇题解记录一下。首先如果值域是\(\{0,1\}\),那么直接搞一个bitset维护一下。由于只有\(2^k\)中不同的初始取值,所以维护\(2^k\)长度即可。然后考虑值......