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 longconst 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
真的想二分,但是人类智慧