Submission #1187376

#TimeUsernameProblemLanguageResultExecution timeMemory
11873768pete8The Ties That Guide Us (CEOI23_incursion)C++20
100 / 100
148 ms6040 KiB
#include<bits/stdc++.h>
#include "incursion.h"
using namespace std;
#define f first
#define s second
#define pii pair<int,int>
#define ppii pair<int,pii>
#define vi vector<int>
#define pb push_back
#define all(x) x.begin(),x.end()
#define rall(x) x.rbegin(),x.rend()
#define F(n) for(int i=0;i<n;i++)
#define lb lower_bound
#define ub upper_bound
#define fastio ios::sync_with_stdio(false);cin.tie(NULL);
#pragma GCC optimize ("03,unroll-lopps")
#define sz(x) (int)((x).size())
const int mxn=5e4;
vector<int>adj[mxn];
int sz[mxn],target,val[mxn],pa[mxn],n;
int root[mxn];
void getsz(int cur,int p){
  sz[cur]=1;for(auto i:adj[cur])if(i!=p&&root[i]==0){
    pa[i]=cur;
    getsz(i,cur),sz[cur]+=sz[i];
  }
}
vector<int>have;
bool find(int cur,int p){
  val[cur]=0;
  if(cur==target)val[cur]=1;
  for(auto i:adj[cur])if(i!=p&&root[i]==0){
    val[cur]|=find(i,cur);
  }
  return val[cur];
}
void getroot(){
  getsz(1,-1);
  for(int i=1;i<=n;i++){
    int yes=1;
    for(auto j:adj[i])if(j!=pa[i])yes&=(sz[j]<=(n)/2);
    if(i!=1)yes&=((n-sz[i])<=((n)/2));
    if(yes)have.pb(i);
  }
  if(have.size()>2||have.empty())assert(0);
  for(auto i:have)root[i]=1;
  for(auto i:have)find(i,-1);
}
vector<int> mark(vector<pii>F, int safe){
  n=F.size()+1;
  have.clear();
  for(int i=1;i<=n;i++)adj[i].clear(),val[i]=root[i]=pa[i]=0;
  for(auto i:F){
    adj[i.f].pb(i.s);
    adj[i.s].pb(i.f);
  }
  target=safe;
  getroot();
  vector<int>ans;
  for(int i=1;i<=n;i++)ans.pb(val[i]);
  return ans;
}
void locate(vector<pii>F, int curr, int t){
  n=F.size()+1;
  int cur=curr;
  have.clear();
  for(int i=1;i<=n;i++)adj[i].clear(),val[i]=root[i]=pa[i]=0;
  for(auto i:F){
    adj[i.f].pb(i.s);
    adj[i.s].pb(i.f);
  }
  for(int i=1;i<=n;i++)if(adj[i].empty())assert(0);
  getroot();
  for(auto i:have)getsz(i,-1);
  if(have.size()>1)pa[have[0]]=have[1],pa[have[1]]=have[0];
  else pa[have[0]]=0;
  while(t==0){
    cur=pa[cur];
    t=visit(cur);
  }
  vector<pii>choice;
  while(1){
    choice.clear();
    for(auto i:adj[cur]){
      if(i!=pa[cur])choice.pb({sz[i],i});
    }
    sort(rall(choice));
    int yes=1;
    for(auto i:choice){
      t=visit(i.s);
      if(t){
        cur=i.s;
        yes=0;
        break;
      }
      else t=visit(cur);
    }
    if(yes)return;
  }
}

Compilation message (stderr)

incursion.cpp:16:40: warning: bad option '-funroll-lopps' to pragma 'optimize' [-Wpragmas]
   16 | #pragma GCC optimize ("03,unroll-lopps")
      |                                        ^
incursion.cpp:22:25: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
   22 | void getsz(int cur,int p){
      |                         ^
incursion.cpp:29:24: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
   29 | bool find(int cur,int p){
      |                        ^
incursion.cpp:37:14: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
   37 | void getroot(){
      |              ^
incursion.cpp:49:40: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
   49 | vector<int> mark(vector<pii>F, int safe){
      |                                        ^
incursion.cpp:63:42: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
   63 | void locate(vector<pii>F, int curr, int t){
      |                                          ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...