Submission #1216421

#TimeUsernameProblemLanguageResultExecution timeMemory
1216421thelegendary08Dungeons Game (IOI21_dungeons)C++17
37 / 100
7084 ms326864 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 = 30;
struct Node{
	int nxt, sum, req;
};
vector<signed> s,p,w,l; int n; vi type;
vector<vector<Node>> jmp; vi rngs;
vi pv;
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); pv.resize(n); f0r(i,n)pv[i] = -1;
	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(i,n){
		jmp[i][0] = {w[i], s[i], s[i]};
	}
	
	FOR(j, 1, lg){
		f0r(i,n){
			if(jmp[i][j-1].nxt == n)jmp[i][j] = jmp[i][j-1];
			else{
				int nx = jmp[jmp[i][j-1].nxt][j-1].nxt;
				int su = jmp[jmp[i][j-1].nxt][j-1].sum + jmp[i][j-1].sum;
				int rq;
				if(jmp[jmp[i][j-1].nxt][j-1].req <= jmp[i][j-1].sum + jmp[i][j-1].req){
					rq = jmp[i][j-1].req;
				}
				else{
					rq = jmp[jmp[i][j-1].nxt][j-1].req - jmp[i][j-1].sum;
				}
				jmp[i][j] = {nx, su, rq};
			}
		}
	}
	// cout<<jmp[1][1].req<<' '<<jmp[1][1].sum<<'\n';
	// 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;
	vi mod;
	int pre = -1;
	while(cur != n){
		// dout(curtype);
		// dout2(cur,a);
		for(int i = lg - 1; i>=0; i--){
			if(a >= jmp[cur][i].req){
				a += jmp[cur][i].sum;
				cur = jmp[cur][i].nxt;
				// cout<<a<<' '<<cur<<"SEDF"<<endl;
			}
			if(cur == n)break;
		}
		// dout2(cur,a);
		if(cur == n)break;
		if(!(pre == cur)){
			mod.pb(cur);
			pv[cur] = a;
			a += p[cur];
			cur = l[cur];
		}
		else{
			// dout2(a, cur);
			int dif = a - pv[cur];
			a += (s[cur] - a + dif - 1)/ dif * dif;
			a += s[cur];
			cur = w[cur];
			
		}
	}
	// vout(mod);
	for(auto u : mod)pv[u] = -1;
	// dout(a);
	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...