Submission #288779

#TimeUsernameProblemLanguageResultExecution timeMemory
288779DanerZeinSplit the Attractions (IOI19_split)C++14
18 / 100
227 ms13944 KiB
#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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...