This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include "split.h"
#include <bits/stdc++.h>
using namespace std;
#define sf scanf
#define pf printf
#define fi first
#define se second
#define pb push_back
#define sz(x) (int)x.size()
#define all(x) x.begin(),x.end()
typedef pair<int,int> ii;
#define maxn 100005
int a,b,c,rem,col,mark[3],sub[maxn],s1,s2,cut,flag[maxn],vis[maxn];
bool backedge[maxn];
vector<int> res;
vector<int> AL[maxn];
vector<ii> x;
set<int> s,st1,st2;
void dfs(int u,int p){
sub[u]=1;
for(int v:AL[u]){
if(sub[v]!=0)continue;
dfs(v,u);
sub[u]+=sub[v];
}
}
void dfs2(int u,int p,int f=0){
vis[u]=true;
for(int v:AL[u]){
if(v==p)continue;
if(!f&&sub[v]>sub[cut]){//back edge
if(s1-sub[u]>=a){
s1-=sub[u];
s2+=sub[u];
flag[u]=1;
dfs2(v,u,1);
}
return;
}
if(vis[v])continue;
dfs2(v,u,f);
}
}
void dfs3(int u,int oflag){
vis[u]=true;
if(flag[u]!=-1)oflag=flag[u];
if(oflag==0)st1.insert(u);
else st2.insert(u);
for(int v:AL[u]){
if(vis[v])continue;
dfs3(v,oflag);
}
}
void dfs4(int u,int f){
//pf("dfs4: %d %d %d\n",u,rem,f);
if(rem==0)return;
--rem;res[u]=f;
for(int v:AL[u]){
if(s.find(v)==s.end())continue;
if(res[v]!=0)continue;
dfs4(v,f);
}
}
vector<int> find_split(int n,int _a,int _b,int _c,vector<int> p,vector<int> q){
a=_a;b=_b;c=_c;
x.pb({a,1});x.pb({b,2});x.pb({c,3});
sort(all(x));
//for(ii pr:x)pf("(%d %d) ",pr.fi,pr.se);pf("\n");
for(int i=0;i<3;++i)mark[i]=x[i].se;
tie(a,b,c)={x[0].fi,x[1].fi,x[2].fi};
res.resize(n);
for(int i=0;i<sz(p);++i){
AL[p[i]].pb(q[i]);
AL[q[i]].pb(p[i]);
}
dfs(0,-1);
//for(int i=0;i<n;++i)pf("%d ",sub[i]);pf("\n");
cut=-1;
for(int u=0;u<n;++u){
bool can=true;
if(sub[u]<a)can=false;
for(int v:AL[u]){
if(sub[v]<sub[u]&&sub[v]>=a)can=false;
}
if(can){
cut=u;break;
}
}
//pf("%d\n",cut);
s1=sub[cut],s2=n-sub[cut];
memset(flag,-1,sizeof flag);
dfs2(cut,-1);
flag[cut]=0;
memset(vis,0,sizeof vis);
dfs3(0,1);
if(sz(st2)<a)return res;
if(sz(st1)>b)swap(st1,st2);
//for(int i:st1)pf("%d ",i);pf("\n");
//for(int i:st2)pf("%d ",i);pf("\n");
s=st1;rem=a;
dfs4(*st1.begin(),x[0].se);
s=st2;rem=b;
dfs4(*st2.begin(),x[1].se);
for(int i=0;i<n;++i)if(res[i]==0)res[i]=x[2].se;
return res;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |