이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include "split.h"
#include <bits/stdc++.h>
using namespace std;
typedef long long lo;
typedef pair< lo,lo > PII;
#define fi first
#define se second
#define mp make_pair
#define endl "\n"
#define pb push_back
#define fio() ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL)
#define FOR for(int i=1;i<=n;i++)
#define mid ((start+end)/2)
#define ort ((bas+son)/2)
const lo inf = 2000000000;
const lo KOK = 100000;
const lo LOG = 30;
const lo li = 500005;
const lo mod = 1000000007;
int n,m,b[li],a[li],k,flag,t,ind,mn=inf,mx,mx1,par[li],vis[li],say,gel,sub[li];
int cev;
string s;
vector<int> v[li];
inline void dfs(int node,int ata){
if(vis[node])return;
sub[node]=1;
for(int i=0;i<(int)v[node].size();i++){
int go=v[node][i];
if(go==ata)continue;
if(vis[go])continue;
dfs(go,node);
sub[node]+=sub[go];
}
par[node]=ata;
if(sub[node]>=mx && sub[node]<mn){ind=node;mn=sub[node];}
}
inline void dfs1(int node,int ata,int aa,int bb,int cc){
if(vis[node])return;
if(say>=mx)return ;
if(mx==aa && (b[1]==0 || b[1]==gel)){vis[node]=1;b[1]=gel;say++;}
else if(mx==bb && (b[2]==0 || b[2]==gel)){vis[node]=2;b[2]=gel;say++;}
else if(mx==cc && (b[3]==0 || b[3]==gel)){vis[node]=3;b[3]=gel;say++;}
if(say>=mx)return ;
for(int i=0;i<(int)v[node].size();i++){
int go=v[node][i];
if(go==ata)continue;
dfs1(go,node,aa,bb,cc);
}
}
inline void dfs3(int node,int bb,int cc){
if(say>=mx)return ;
if(vis[node])return ;
//~ if(mx==aa){vis[node]=1;b[1]=1;say++;}
if(mx==bb){vis[node]=2;b[2]=1;say++;}
else if(mx==cc){vis[node]=3;b[3]=1;say++;}
if(say==mx)return;
for(int i=0;i<(int)v[node].size();i++){
int go=v[node][i];
dfs3(go,bb,cc);
}
}
vector<int> find_split(int n, int aa, int bb, int cc, vector<int> p, vector<int> q) {
if((int)p.size()==n-1){
flag=0;
vector<int> res;
a[1]=aa;
a[2]=bb;
a[3]=cc;
sort(a+1,a+4);
mx=a[1];
mx1=a[2];
for(int i=0;i<(int)p.size();i++){
v[p[i]].pb(q[i]);
v[q[i]].pb(p[i]);
}
gel=1;
ind=-1;
dfs(0,-1);
if(ind==-1){
flag=1;
}
dfs1(ind,par[ind],aa,bb,cc);
mx=mx1;
gel=2;
say=0;
mn=inf;
ind=-1;
dfs(0,-1);
if(ind==-1){
flag=1;
}
dfs1(ind,par[ind],aa,bb,cc);
if(flag==0){
for(int i=0;i<n;i++){
if(vis[i])res.pb(vis[i]);
else{
if(b[1]==0)res.pb(1);
if(b[2]==0)res.pb(2);
if(b[3]==0)res.pb(3);
}
}
return res;
}
res.clear();
memset(vis,0,sizeof(vis));
memset(b,0,sizeof(b));
a[1]=aa;
a[2]=bb;
a[3]=cc;
sort(a+1,a+4);
mx=a[2];
FOR v[i-1].clear();
mx1=a[1];
for(int i=0;i<(int)p.size();i++){
v[p[i]].pb(q[i]);
v[q[i]].pb(p[i]);
}
say=0;
mn=inf;
gel=1;
ind=-1;
dfs(0,-1);
if(ind==-1){
FOR res.pb(0);
return res;
}
dfs1(ind,par[ind],aa,bb,cc);
mx=mx1;
gel=2;
say=0;
mn=inf;
ind=-1;
dfs(0,-1);
if(ind==-1){
FOR res.pb(0);
return res;
}
dfs1(ind,par[ind],aa,bb,cc);
//~ if(flag==0){
for(int i=0;i<n;i++){
if(vis[i])res.pb(vis[i]);
else{
if(b[1]==0)res.pb(1);
if(b[2]==0)res.pb(2);
if(b[3]==0)res.pb(3);
}
}
//~ }
return res;
}
vector<int> res;
a[1]=aa;
a[2]=bb;
a[3]=cc;
sort(a+1,a+3+1);
mx=a[2];
dfs3(0,bb,cc);
for(int i=0;i<n;i++){
if(vis[i])res.pb(vis[i]);
else{
if(aa){res.pb(1);aa=0;}
else if(b[2]==0)res.pb(2);
else if(b[3]==0)res.pb(3);
}
}
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... |