結果
| 問題 |
No.2987 Colorful University of Tree
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2025-05-24 18:33:04 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,974 bytes |
| コンパイル時間 | 2,213 ms |
| コンパイル使用メモリ | 179,460 KB |
| 実行使用メモリ | 64,580 KB |
| 最終ジャッジ日時 | 2025-05-24 18:33:29 |
| 合計ジャッジ時間 | 23,613 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 40 WA * 2 |
ソースコード
#include <bits/stdc++.h>
#define ll long long
#define debug(...) fprintf(stderr,__VA_ARGS__)
using namespace std;
inline static int read(){
int sum=0,neg=0,ch=getchar();
while(!isdigit(ch)) neg|=(ch=='-'),ch=getchar();
while(isdigit(ch)) sum=sum*10+(ch^48),ch=getchar();
return neg?-sum:sum;
}
vector<int>e[200005],Ans[200005]; int n,id[200005],head[200005],ecnt;
struct{int v,w,nxt;}_e[400005]; int col[200005],ptr[200005],eid[200005];
void _add(int u,int v,int w){_e[++ecnt]={v,w,head[u]},head[u]=ecnt;}
void add(int u,int v,int i,int j){_add(u,v,i),_add(v,u,j);}
int dfs(int u,int fa){
for(int&x:Ans[u]) x=++ptr[col[u]]; vector<int>vec; int e2f=0;
for(int i=head[u];i;i=_e[i].nxt){
int v=_e[i].v; if(v==fa){e2f=_e[i].w; continue;}
if(dfs(v,u)==Ans[u][_e[i].w]) vec.push_back(_e[i].w);
}
if(vec.size()&1) vec.push_back(e2f);
for(int i=0;i<vec.size();i+=2)
swap(Ans[u][vec[i]],Ans[u][vec[i+1]]);
return Ans[u][e2f];
}
set<pair<int,int>>Set; int ord[200005];
vector<int>leaf;
bool check(int Q,int rt){
Set.clear(); int _rt=_e[head[rt]].v; for(int i=2;i<=Q;i++) Set.emplace(Q,i);
col[rt]=col[_rt]=1,Set.emplace(Q-e[rt].size()-e[_rt].size(),1);
for(int _i=1,i=ord[1];_i<=n;i=ord[++_i]) if(i!=rt && i!=_rt){
auto it=prev(Set.end()); if(it->first<e[i].size()) return 0;
Set.emplace(it->first-e[i].size(),col[i]=it->second),Set.erase(it);
} return 1;
}
signed main(){
// freopen("hjx.in","r",stdin);
// freopen("hjx.out","w",stdout);
for(int T=read();T;T--){
n=read(),leaf.clear(),memset(head,ecnt=0,4*n+4); int C=0,rt=0;
memset(id,0,4*n),memset(eid,0,4*n),memset(ptr,0,4*n+4);
for(int i=1,k;i<=n;i++){
k=read(),e[i].assign(k,0),Ans[i]=e[i],C=max(k,C); if(k==1) leaf.push_back(i);
for(int j=0,t;j<k;j++){
t=e[i][j]=read(); if(id[t]) add(id[t],i,eid[t],j); else id[t]=i,eid[t]=j;
}
}
if(n==2){puts("2\n1 1\n2 2"); continue;}
else if(C==n-1){
printf("%d\n",C);
for(int i=1;i<=n;i++) if(e[i].size()==C){
for(int j=0;j<C;j++) col[e[i][j]]=j+1; break;
}
for(int i=1;i<=n;i++) if(e[i].size()==C){
printf("1 ");
for(int j=1;j<=C;j++) printf("%d ",j); puts("");
}else printf("2 %d\n",col[e[i][0]]%C+1);
continue;
}
for(int i:leaf){int v=_e[head[i]].v; if(!rt || e[v].size()<e[_e[head[rt]].v].size()) rt=i;}
int l=e[rt].size()+e[_e[head[rt]].v].size(),r=n-1,Q; iota(ord+1,ord+n+1,1);
sort(ord+1,ord+n+1,[](int x,int y){return e[x].size()>e[y].size();}); // 这里会不会有什么特殊性质?
while(l<=r) if(check(Q=(l+r)>>1,rt)) r=Q-1; else l=Q+1;
printf("%d\n",Q=l),check(Q,rt),dfs(rt,0);
for(int i=1;i<=n;puts(""),i++){printf("%d ",col[i]); for(int j:Ans[i]) printf("%d ",j);}
} return 0;
}