結果
問題 |
No.2987 Colorful University of Tree
|
ユーザー |
|
提出日時 | 2025-05-24 16:08:51 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 525 ms / 5,000 ms |
コード長 | 2,330 bytes |
コンパイル時間 | 4,921 ms |
コンパイル使用メモリ | 201,912 KB |
実行使用メモリ | 127,756 KB |
最終ジャッジ日時 | 2025-05-24 16:09:15 |
合計ジャッジ時間 | 21,009 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 42 |
ソースコード
#include<bits/stdc++.h> using namespace std; const int N=2e5+5; mt19937 rnd(114514); int T,n,d[N],id[N],cnt[N],ans,rt[N],ls[N*50],rs[N*50],tree[N*50],tot1,c[N],p1[N],p2[N]; vector<int>v1[N],e[N],g[N],col[N]; bool Check; bool cmp(int x,int y){return d[x]<d[y];} bool check(int x) { for(int i=0;i<=n;i++)col[i].clear(); for(int i=1;i<=x;i++)col[0].emplace_back(i); int l=0; for(int i=n;i;i--) { while(l<=x&&!col[l].size())l++; if(l+d[id[i]]>x)return false; c[id[i]]=col[l].back(); col[l+d[id[i]]].emplace_back(col[l].back()),col[l].pop_back(); } return true; } void change(int &x,int l,int r,int pos) { if(!x)x=++tot1,ls[x]=rs[x]=tree[x]=0; tree[x]++; if(l==r)return; int mid=(l+r)/2; if(pos<=mid)change(ls[x],l,mid,pos); else change(rs[x],mid+1,r,pos); } int solve(int x,int l,int r,int k) { if(l==r)return l; int mid=(l+r)/2,val=mid-l+1-tree[ls[x]]; if(val<k)return solve(rs[x],mid+1,r,k-val); return solve(ls[x],l,mid,k); } void dfs(int x,int prt,int col1) { int tot=-1; for(auto y:e[x]) { tot++; if(y==prt) { int al=ans-tree[rt[c[x]]],k=rnd()%al+1; int v=solve(rt[c[x]],1,ans,k); if(col1==v)v=solve(rt[c[x]],1,ans,k%al+1); if(col1==v)Check=1; g[x][tot]=v,change(rt[c[x]],1,ans,v); } } tot=-1; for(auto y:e[x]) { tot++; if(y!=prt) { int al=ans-tree[rt[c[x]]],k=rnd()%al+1; int v=solve(rt[c[x]],1,ans,k); g[x][tot]=v,change(rt[c[x]],1,ans,v),dfs(y,x,v); } } } int main() { ios::sync_with_stdio(false); cin.tie(0),cout.tie(0); cin>>T; while(T--) { cin>>n; for(int i=1;i<=n;i++)v1[i].clear(),e[i].clear(),g[i].clear(),p1[i]=p2[i]=0; for(int i=1;i<=n;i++) { cin>>d[i],id[i]=i; for(int j=1,x;j<=d[i];j++) { cin>>x,v1[i].emplace_back(x); if(!p1[x])p1[x]=i; else p2[x]=i; } g[i].resize(v1[i].size()); } for(int i=1;i<=n;i++) { for(auto j:v1[i]) { if(p1[j]==i)e[i].emplace_back(p2[j]); else e[i].emplace_back(p1[j]); } } sort(id+1,id+n+1,cmp); int l=1,r=n; while(l<=r) { int mid=(l+r)/2; if(check(mid))r=mid-1; else l=mid+1; } cout<<l<<'\n',check(l); ans=l; while(1) { for(int i=1;i<=n;i++)rt[i]=0; tot1=Check=0,dfs(1,0,-1); if(!Check)break; } for(int i=1;i<=n;i++) { cout<<c[i]<<' '; for(auto j:g[i])cout<<j<<' '; cout<<'\n'; } } return 0; }