제출 #1216291

#제출 시각아이디문제언어결과실행 시간메모리
1216291thelegendary08던전 (IOI21_dungeons)C++17
0 / 100
7093 ms2162688 KiB
#include "dungeons.h"
#include<bits/stdc++.h>
#define int long long
#define pb push_back
#define mp make_pair
#define vi vector<int>
#define f0r(i,n) for(int i = 0; i<n; i++)
#define FOR(i, k, n) for(int i = k; i<n; i++)
#define pii pair<int,int>
#define vvi vector<vector<int>>
#define vb vector<bool>
#define vpii vector<pair<int,int>>
#define vout(v) for(auto u : v)cout<<u<<' '; cout<<endl;
#define dout(x) cout<<x<<' '<<#x<<endl;
#define dout2(x,y) cout<<x<<' '<<#x<<' '<<y<<' '<<#y<<endl;
using namespace std;
const int lg = 16;
vector<signed> s,p,w,l; int n; vi type;
vector<vector<vpii>> jmp; vi rngs;
void init(signed n, std::vector<signed> s, std::vector<signed> p, std::vector<signed> w, std::vector<signed> l) {
	::s=s; ::p=p; ::w=w; ::l=l; ::n=n;
	set<int>si;
	f0r(i,n){
		si.insert(s[i]);
	}
	for(auto u : si){
		rngs.pb(u);
	}
	type.resize(n);
	f0r(i,n){
		f0r(j, rngs.size()){
			if(rngs[j] == s[i]){
				type[i] = j;
			}
		}
	}
	
	vi tmp(n);
	jmp.resize(n);
	f0r(i,n){
		jmp[i].resize(lg);
		f0r(j, lg){
			jmp[i][j].resize(rngs.size() + 1);
		}
	}
	f0r(i,rngs.size() + 1){
		f0r(j, n){
			if(tmp[j]){
				jmp[j][0][i] = mp(w[j],s[j]);
			}
			else{
				if(i == 0 && j == 0){
					// dout2(l[j], p[j]);
				}
				jmp[j][0][i] = mp(l[j],p[j]);
			}
		}
		// dout2(jmp[0][0][0].first, jmp[0][0][0].second);
		FOR(j, 1, lg){
			f0r(k, n){
				if(jmp[k][j-1][i].first == n)jmp[k][j][i] = jmp[k][j-1][i];
				else jmp[k][j][i] = mp(jmp[jmp[k][j-1][i].first][j-1][i].first, jmp[k][j-1][i].second + jmp[jmp[k][j-1][i].first][j-1][i].second);
			}
		}
		if(i != rngs.size()){
			f0r(j,n){
				if(type[j] == i)tmp[j] = 1;
			}
		}
	}
	
	// dout2(jmp[0][0][0].first, jmp[0][0][0].second);
	
	return;
}

long long simulate(signed x, signed z) {
	int cur = x;
	int a = z;
	int curtype = 0;
	int nxt = 4e18;
	int ptr = rngs.size();
	int cnt = 0;
	for(auto u : rngs){
		if(a >= u)curtype++;
		else{
			ptr = cnt;
			nxt = u; break;
		}
		cnt++;
	}
	
	while(cur != n){
		// dout(curtype);
		for(int i = lg - 1; i>=0; i--){
			if(a + jmp[cur][i][curtype].second < nxt){
				a += jmp[cur][i][curtype].second;
				cur = jmp[cur][i][curtype].first;
				// cout<<a<<' '<<cur<<"SEDF"<<endl;
			}
			if(cur == n)break;
		}
		if(cur == n)break;
		// cout<<a<<' '<<cur<<endl;
		// dout2(jmp[cur][0][curtype].first, jmp[cur][0][curtype].second);
		a += jmp[cur][0][curtype].second;
		cur = jmp[cur][0][curtype].first;
		// cout<<a<<' '<<cur<<endl;
		// vout(rngs);
		while(ptr != rngs.size() && rngs[ptr] < a){
			ptr++; curtype++;
		}
	}
	
	return a;
}

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