結果
| 問題 |
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;
}