UNIQUE VISION Programming Contest 2024 Christmas (AtCoder Beginner Contest 385)

D - Santa Claus 2

map<int,set>

E - Snowflake Tree

开始想到枚举中心点,x=度数,y=min儿子度数-1,其余全要删除,删除越少留下越多,留下1+x+xy,删n-(1+x+xy)
样例1告诉我们可以删除某个子树,这样还是y=min儿子度数-1,就排序,这样现在处理的就是最小的

#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
#define yes cout << "Yes" << endl
#define no cout << "No" << endl
#define pii pair<int,int>
#define ll long long
#define pb push_back
#define ft first
#define se second
#define inf 0x3f3f3f3f
#define INF 0x3f3f3f3f3f3f3f3f
#define int long long

const int N=300010;
int n;
vector<int> G[N];int ind[N];
bool cmp(int x,int y){
    return ind[x]<ind[y];
}
void solve(){
cin>>n;
for(int i=1;i<=n-1;i++){
    int u,v;cin>>u>>v;
    G[u].pb(v);G[v].pb(u);
    ind[u]++;ind[v]++;
}
for(int i=1;i<=n;i++)sort(G[i].begin(),G[i].end(),cmp);

int ans=n;
for(int i=1;i<=n;i++){
    int x=ind[i];
    for(int j=0;j<G[i].size();j++){
        int y=ind[G[i][j]]-1;
        ans=min(ans,n-(1+x+x*y));
        x--;
    }
}
cout<<ans<<'\n';
}
signed main(){
    std::ios::sync_with_stdio(false);
    int T=1;
    while(T--){
        solve();
    }
}

F - Visible Buildings

真的想二分,但是人类智慧

posted @ 2025-10-29 22:57  arin876  阅读(5)  评论(0)    收藏  举报