CF780E Underground Lab

做做水题水下博客

这题刚开始看错题目了以为至多选\(\lceil\frac{n}{k}\rceil\)心想这个题还挺难的,后面仔细一看是\(\lceil\frac{2n}{k}\rceil\)那不就是个纯纯傻逼题

首先题目保证图连通,因此我们直接给它搞一个生成树出来,考虑直接处理树的情况

看到\(2n\)会联想到什么,没错就是树的欧拉序,欧拉序的性质就是其中连续的一段对应的点在树上一定是连续的,并且其总长度为\(2n-1\)

然后这题就做完了,我们求出欧拉序后把它分成若干段即可

#include<cstdio>
#include<iostream>
#include<utility>
#include<vector>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<algorithm>
#include<queue>
#include<set>
#include<map>
#include<set>
#include<array>
#include<random>
#include<bitset>
#include<ctime>
#include<limits.h>
#include<assert.h>
#include<unordered_set>
#include<unordered_map>
#define RI register int
#define CI const int&
#define mp make_pair
#define fi first
#define se second
#define Tp template <typename T>
using namespace std;
typedef long long LL;
typedef long double LDB;
typedef unsigned long long u64;
typedef __int128 i128;
typedef pair <int,int> pi;
typedef vector <int> VI;
typedef array <int,3> tri;
const int N=200005;
int n,m,k,x,y,fa[N],seq[N<<1],idx,sz; vector <int> v[N],ans[N];
inline int getfa(CI x)
{
	return x!=fa[x]?fa[x]=getfa(fa[x]):x;
}
inline void DFS(CI now=1,CI fa=0)
{
	seq[++idx]=now; for (auto to:v[now]) if (to!=fa) DFS(to,now),seq[++idx]=now;
}
int main()
{
	//freopen("CODE.in","r",stdin); freopen("CODE.out","w",stdout);
	RI i; for (scanf("%d%d%d",&n,&m,&k),i=1;i<=n;++i) fa[i]=i;
	for (i=1;i<=m;++i)
	{
		scanf("%d%d",&x,&y); if (getfa(x)==getfa(y)) continue;
		v[x].push_back(y); v[y].push_back(x); fa[getfa(x)]=getfa(y);
	}
	for (DFS(),sz=(2*n+k-1)/k,i=1;i<=idx;++i)
	ans[(i-1)/sz+1].push_back(seq[i]);
	for (i=1;i<=k;++i)
	{
		if (ans[i].empty()) ans[i].push_back(1);
		printf("%d ",ans[i].size());
		for (auto x:ans[i]) printf("%d ",x); putchar('\n');
	}
	return 0;
}
posted @ 2023-10-25 18:44  空気力学の詩  阅读(5)  评论(0编辑  收藏  举报