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;
typedef vector<int> vi;
typedef pair<int,int> ii;
vector<vi> G;
int pa[100010];
int vis[100010];
int sb[100010];
vector<ii> aux;
int dfs(int u,int p){
pa[u]=p;
int ans=1;
for(auto &v:G[u]){
if(pa[v]==-1){
ans+=dfs(v,u);
}
}
sb[u]=ans;
return ans;
}
vi path;
int ca;
void dfs_path(int u,int npr){
path.push_back(u);
vis[u]=1;
ca--;
if(ca==0) return;
for(auto &v:G[u]){
if(!vis[v] and v!=npr){
dfs_path(v,npr);
if(ca==0) return;
}
}
}
int t;
bool sep=0;
vector<int> pa1,pa2;
void dfs1(int u,int sw){
if(ca<=0){
sep=1;
return;
}
if(sw==0) pa1.push_back(u);
if(sw==1) pa2.push_back(u);
ca--;
vis[u]=1;
//cout<<u<<" "<<vis[u]<<endl;
if(ca==0){ sep=1; return;}
for(auto &v:G[u]){
if(vis[v]==0){
dfs1(v,sw);
if(ca==0) return;
}
}
}
vector<int> points24(){
vector<int> r1;
r1.resize(t);
for(int i=0;i<t;i++){
memset(vis,0,sizeof vis);
ca=aux[0].first;
pa1.clear();
dfs1(i,0);
for(int j=0;j<t;j++){
//cout<<vis[j]<<endl;
sep=0;
if(vis[j]==0){
ca=aux[1].first;
pa2.clear();
dfs1(j,1);
if(sep==1){
break;
}
}
}
if(sep==1) break;
//cout<<endl;
}
if(sep==1){
for(int i=0;i<pa1.size();i++){
//cout<<pa1[i]<<" ";
r1[pa1[i]]=aux[0].second;
}
// cout<<endl;
for(int i=0;i<pa2.size();i++){
//cout<<pa2[i]<<" ";
r1[pa2[i]]=aux[1].second;
}
//cout<<endl;
for(int i=0;i<r1.size();i++){
if(r1[i]==0){
r1[i]=aux[2].second;
}
}
}
return r1;
}
vector<int> find_split(int n, int a, int b, int c, vector<int> p, vector<int> q) {
G.resize(n+1);
t=n;
for(int i=0;i<p.size();i++){
G[p[i]].push_back(q[i]);
G[q[i]].push_back(p[i]);
}
aux.push_back(ii(a,1));
aux.push_back(ii(b,2));
aux.push_back(ii(c,3));
sort(aux.begin(),aux.end());
if(n<=2500 and p.size()<=5000){
vector<int> r2=points24();
return r2;
}
memset(pa,-1,sizeof pa);
dfs(0,-2);
vector<int> res;
res.resize(n);
bool sw=0;
for(int i=0;i<n;i++){
int at=sb[i];
int bt=n-sb[i];
sw=0;
if(at>bt) {sw=1;swap(at,bt);}
if(at>=aux[0].first and bt>=aux[1].first){
memset(vis,0,sizeof vis);
ca=aux[0].first;
if(sw==1) dfs_path(pa[i],i);
else
dfs_path(i,pa[i]);
for(int j=0;j<path.size();j++){
res[path[j]]=aux[0].second;
}
ca=aux[1].first;
path.clear();
if(sw==1) dfs_path(i,pa[i]);
else
dfs_path(pa[i],i);
for(int j=0;j<path.size();j++){
res[path[j]]=aux[1].second;
}
sw=1;
break;
}
}
if(sw==0){
for(int i=0;i<n;i++){
res[i]=0;
}
}
else{
for(int i=0;i<n;i++){
if(res[i]==0) res[i]=aux[2].second;
}
}
return res;
}
Compilation message (stderr)
split.cpp: In function 'std::vector<int> points24()':
split.cpp:81:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
81 | for(int i=0;i<pa1.size();i++){
| ~^~~~~~~~~~~
split.cpp:86:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
86 | for(int i=0;i<pa2.size();i++){
| ~^~~~~~~~~~~
split.cpp:91:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
91 | for(int i=0;i<r1.size();i++){
| ~^~~~~~~~~~
split.cpp: In function 'std::vector<int> find_split(int, int, int, int, std::vector<int>, std::vector<int>)':
split.cpp:102:16: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
102 | for(int i=0;i<p.size();i++){
| ~^~~~~~~~~
split.cpp:130:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
130 | for(int j=0;j<path.size();j++){
| ~^~~~~~~~~~~~
split.cpp:138:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
138 | for(int j=0;j<path.size();j++){
| ~^~~~~~~~~~~~
# | 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... |