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;
}
辣鸡老年选手AFO在即