結果
問題 | No.2987 Colorful University of Tree |
ユーザー |
|
提出日時 | 2025-05-24 11:52:20 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 161 ms / 5,000 ms |
コード長 | 2,310 bytes |
コンパイル時間 | 2,319 ms |
コンパイル使用メモリ | 209,516 KB |
実行使用メモリ | 29,192 KB |
最終ジャッジ日時 | 2025-05-24 11:52:45 |
合計ジャッジ時間 | 21,817 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 42 |
ソースコード
#include<bits/stdc++.h> #define LL long long #define LLL __int128 #define uint unsigned #define ldb long double #define uLL unsigned long long using namespace std; const int N=2e5+5; int n,ans,cnt; vector<int>F[N]; pair<int,int>E[N]; vector<pair<int,int>>G[N]; int id[N],A[N],B[N],C[N],sz[N],lst[N]; mt19937 rng(chrono::system_clock::now().time_since_epoch().count()); inline bool solve(){ cnt=0; iota(id+1,id+n+1,1); sort(id+1,id+n+1,[&](int x,int y){ return G[x].size()>G[y].size(); }); int r=n; while(G[id[r]].size()==1)--r; for(int i=1;i<=r;++i){ ++cnt; sz[cnt]=G[id[i]].size(); F[cnt].emplace_back(id[i]); for(;i<r&&sz[cnt]+G[id[r]].size()<=ans;sz[cnt]+=G[id[r]].size(),--r)F[cnt].emplace_back(id[r]); } for(int i=1,j=1;i<=n;++i)if(G[i].size()==1){ while(sz[j]>=ans)++j; F[j].emplace_back(i),++sz[j]; if(j>cnt)++cnt; } if(cnt>ans){ for(int i=1;i<=cnt;++i)F[i].clear(),sz[i]=0; return 0; } for(int i=1;i<=cnt;++i){ vector<int>S; for(int u:F[i])A[u]=i; for(;;){ S.clear(); for(int j=1;j<=ans;++j)S.emplace_back(j); shuffle(S.begin(),S.end(),rng); int ok=1; for(int u:F[i])for(auto [v,w]:G[u]){ int c=(u==E[w].first?C[w]:B[w]); if(!c)c=lst[v]; if(c==S.back()&&S.size()==1){ok=0;break;} int d=(c==S.back()?S.end()[-2]:S.back()); if(d!=S.back())S.erase(S.end()-2); else S.pop_back(); (u==E[w].first?B[w]:C[w])=d,lst[v]=d; } if(ok)break; for(int u:F[i])for(auto [v,w]:G[u])(u==E[w].first?B[w]:C[w])=0; } } return 1; } void work() { cin>>n,ans=cnt=0; for(int i=1;i<n;i++) E[i]=make_pair(0,0); for(int i=1;i<=n;i++) F[i].clear(),id[i]=A[i]=B[i]=C[i]=sz[i]=lst[i]=0; for(int u=1;u<=n;++u){ int d;cin>>d,G[u].resize(d); for(auto&[v,w]:G[u]) cin>>w,(E[w].first?E[w].second:E[w].first)=u; ans=max(ans,d); } for(int u=1;u<=n;++u)for(auto&[v,w]:G[u]) v=E[w].first^E[w].second^u; while(1ll*ans*ans<(n-1)*2)++ans; if(!solve())++ans,solve(); cout<<ans<<'\n'; for(int u=1;u<=n;++u){ cout<<A[u]; for(auto&[v,w]:G[u])cout<<' '<<(u==E[w].first?B[w]:C[w]); cout<<'\n'; } } signed main(){ cin.tie(0)->sync_with_stdio(0); int t; cin>>t; while(t--) work(); return 0; } /* */