社区讨论

求hack

P15268「UTOI 1C」Delirium Of Aeons参与者 3已保存回复 3

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
3 条
当前快照
1 份
快照标识符
@mlhxmxw9
此快照首次捕获于
2026/02/11 19:14
上周
此快照最后确认于
2026/02/13 17:45
6 天前
查看原帖
我知道我这个肯定是错的,但构造不出来hack数据。
找到一个度数大于等于 22 的点开始跑,但是一开始没想到根节点的 corner case,然后我就随了 4040 个度数大于等于 22 的点跑就过了。
代码:
CPP
#include<bits/stdc++.h>
using namespace std;
constexpr int N=2e5+5;
int n,m;
vector<int>e[N];
int cnt[N],siz[N],rt,ans;
inline void dfs(int u,int fa){
	int maxn=0;
	for(auto v:e[u]){
		if(v==fa)continue;
		dfs(v,u);maxn=max(maxn,siz[v]);
		++cnt[siz[v]];
	}
	if(maxn!=0)--cnt[maxn];
	else ++ans;
	siz[u]=maxn+1;
	if(u==rt){
		int ma2=0;maxn=0;
		for(auto v:e[u]){
			if(v==fa)continue;
			if(siz[v]>=maxn)ma2=maxn,maxn=siz[v];
			else if(siz[v]>=ma2)ma2=siz[v];
		}
		--cnt[ma2],++cnt[ma2+maxn];
	}
}
mt19937 rnd(time(NULL));
inline void solve()
{
	cin>>n>>m;
	for(int i=1,u,v;i<n;++i)cin>>u>>v,e[u].emplace_back(v),e[v].emplace_back(u);
	if(m<=2){
		cout<<m<<'\n';
		for(int i=0;i<=n;++i)e[i].clear(),cnt[i]=0;ans=0;
		return;
	}
	int minn=0x3f3f3f3f,c;
	for(int k=1;k<=40;++k){
		ans=0;
		for(rt=rnd()%n+1;1;rt=rnd()%n+1)if(e[rt].size()>=2)break;
		dfs(rt,0);
		c=n-m;
		for(int i=1;i<=n;++i){
			while(cnt[i]--){
				if(c>=i)--ans,c-=i;
			}
		}
		for(int i=0;i<=n;++i)cnt[i]=0;
		minn=min(minn,ans);
	}
	cout<<minn<<'\n';
	for(int i=0;i<=n;++i)e[i].clear();
}

signed main()
{
	ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
	int T;cin>>T;while(T--)solve();
	return 0;
}

回复

3 条回复,欢迎继续交流。

正在加载回复...