제출 #520203

#제출 시각아이디문제언어결과실행 시간메모리
520203A_DDungeons Game (IOI21_dungeons)C++17
0 / 100
7030 ms124792 KiB
#include "dungeons.h"
#include <bits/stdc++.h>
using namespace std;
const int N=4e5+100;
const int L=26;
long long st[N][L][6];
long long we[N][L][6];
set<long long> stt;
vector<long long> vec;
int sz;
int nnn;
void init(int nn,vector<int> s,vector<int> p,vector<int> w,vector<int> l){
    nnn=nn;
    for(auto x:s){
        stt.insert(x);
    }
    vec.push_back(0);
    for(auto x:stt)vec.push_back(x);
    vec.push_back(1e18);
    sz=vec.size();
    for(int k=0;k<sz-1;k++){
  //      cout<<k<<" "<<vec[k]<<endl;
        for(int i=0;i<nnn;i++){
            if(vec[k]>=s[i]){
                st[i][0][k]=w[i];
                we[i][0][k]=s[i];
            }
            else{
                st[i][0][k]=l[i];
                we[i][0][k]=p[i];
            }
//            cout<<st[i][0][k]<<" ";
        }
  //      cout<<nnn<<" ";
    //    cout<<endl;
        st[nnn][0][k]=nnn;
        for(int j=1;j<L;j++){
            for(int i=0;i<=nnn;i++){
                st[i][j][k]=st[st[i][j-1][k]][j-1][k];
                we[i][j][k]=we[i][j-1][k]+we[st[i][j-1][k]][j-1][k];
      //          cout<<st[i][j][k]<<" ";
            }
        //    cout<<endl;
        }
//        cout<<endl;
    }
}

long long simulate(int xx, int zz){
    long long x=xx;
    long long z=zz;
    /*
    for(int k=0;k<sz-1;k++){
        for(int i=0;i<=nnn;i++){
            cout<<we[i][0][k]<<" ";
        }
        cout<<endl;
    }
    cout<<x<<" "<<z<<endl;
    */
    for(int k=0;k<sz-1;k++){
        if(vec[k+1]<=z)continue;
        for(int j=0;j>=0;){
            long long nx=st[x][j][k];
            long long nz=z+we[x][j][k];
            if(nx!=nnn&&nz<vec[k+1]){
      //          cout<<x<<" "<<k<<" "<<we[x][j][k]<<" "<<z<<" "<<nz<<endl;
                x=nx;
                z=nz;
        //        cout<<x<<" "<<z<<endl;
            }
            else{
                break;
            }
        }
        if(x!=nnn&&z<vec[k+1]){
          //  cout<<x<<" "<<k<<" "<<we[x][0][k]<<" "<<z<<" "<<z+we[k][0][k]<<endl;
            z=z+we[x][0][k];
            x=st[x][0][k];
            //cout<<x<<" "<<z<<endl;
        }
    }
    return z;
}







#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...