제출 #534781

#제출 시각아이디문제언어결과실행 시간메모리
534781DanerZein던전 (IOI21_dungeons)C++17
0 / 100
1 ms512 KiB
#include "dungeons.h"
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll,ll> ii;
typedef vector<ii> vii;
typedef vector<ll> vi;
const int MAX_N=5e4+10;
vector<vii> Gl;
vector<vi> Gw;
int pa[MAX_N][32];
int tag[MAX_N];
ll dw[MAX_N],dl[MAX_N];
bool vis[MAX_N];
vector<vi> ci;
vector<vi> su;
int n,disp;
void distancia(int u){
  for(auto &v:Gw[u]){
    dw[v]=dw[u]+1;
    distancia(v);
  }
}
int ciclo(int u){
  vis[u]=1;
  for(auto &v:Gl[u]){
    if(!vis[v.first]){
      int aux=ciclo(v.first);
      if(aux!=-1){
	ci[aux].push_back(v.first);
	return tag[u]=aux;
      }
    }
    else{
      int t=ci.size();
      ci.push_back(vi());
      ci[t].push_back(u);
      return tag[u]=t;
    }
  }
  return tag[u];
}
void spare(int u,int p){
  vis[u]=1;
  pa[u][0]=p;
  for(int i=1;i<=20;i++){
    pa[u][i]=pa[pa[u][i-1]][i-1];
  }
  for(auto &v:Gl[u]){
    if(!vis[v.first]){
      dl[v.first]=dl[u]+v.second;
      spare(v.first,u);
    }
  }
}
void init(int N, std::vector<int> s, std::vector<int> p, std::vector<int> w, std::vector<int> l) {
  n=N;
  disp=s[0];
  for(int i=0;i<N;i++){
    Gw[w[i]].push_back(i);
    Gl[l[i]].push_back(ii(i,p[i]));
  }
  dw[n]=0;
  distancia(n);
  memset(tag,-1,sizeof tag);
  for(int i=0;i<n;i++){
    if(!vis[i]) ciclo(i);
  }
  memset(vis,0,sizeof vis);
  for(int i=0;i<ci.size();i++){
    dl[ci[i][0]]=0;
    spare(ci[i][0],ci[i][0]);
  }
  spare(N,N);
  for(int i=0;i<ci.size();i++){
    su.push_back(vi());
    su[i].push_back(0);
    for(int j=0;j<ci[i].size();j++){
      su[i].push_back(su[i][j]+p[ci[i][j]]);
    }
  }
}
int subir(int x,int z){
  for(int i=20;i>=0;i--){
    int d=dl[pa[x][i]]-dl[x];
    if(d+z<disp){
      z+=d;
      x=pa[x][i];
    }
  }
  return pa[x][0];
}
long long simulate(int x, int z) {
  int y=subir(x,z);
  z+=dl[y]-dl[x];
  if(y==n) return z;
  vector<ll> c=ci[tag[y]];
  vector<ll> s=su[tag[y]];
  int ts=s.size()-1;
  int ti=(disp-z)/s[ts];
  z+=ti*s[ts];
  auto it=lower_bound(s.begin(),s.end(),disp-z);
  int id=it-s.begin();
  z+=dw[c[id]]*disp;
  return z;
}

컴파일 시 표준 에러 (stderr) 메시지

dungeons.cpp: In function 'void init(int, std::vector<int>, std::vector<int>, std::vector<int>, std::vector<int>)':
dungeons.cpp:70:16: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::vector<long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   70 |   for(int i=0;i<ci.size();i++){
      |               ~^~~~~~~~~~
dungeons.cpp:75:16: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::vector<long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   75 |   for(int i=0;i<ci.size();i++){
      |               ~^~~~~~~~~~
dungeons.cpp:78:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   78 |     for(int j=0;j<ci[i].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...
#Verdict Execution timeMemoryGrader output
Fetching results...