Submission #1271337

#TimeUsernameProblemLanguageResultExecution timeMemory
1271337nerrrmin던전 (IOI21_dungeons)C++20
37 / 100
7096 ms308088 KiB
#include "dungeons.h" #include <bits/stdc++.h> #include <vector> using namespace std; const int maxn = 4e5 + 10; int nn; vector < long long > a, b; vector < long long > win, lose; long long req, jump[maxn][30], collect[maxn][30], limit[maxn][30]; void init(int n, std::vector<int> s, std::vector<int> p, std::vector<int> w, std::vector<int> l) { nn = n; a.resize(n, 0); b.resize(n, 0); req = s[0]; for (int i = 0; i < nn; ++ i) a[i] = s[i]; for (int i = 0; i < nn; ++ i) b[i] = p[i]; win.resize(n, 0); lose.resize(n, 0); for (int i = 0; i < nn; ++ i) win[i] = w[i]; for (int i = 0; i < nn; ++ i) lose[i] = l[i]; for (int j = 0; j < 30; ++ j) { jump[n][j] = n; collect[n][j] = 0; limit[n][j] = 0; } for (int i = n-1; i >= 0; -- i) { jump[i][0] = win[i]; collect[i][0] = a[i]; limit[i][0] = a[i]; } for (int j = 1; j < 30; ++ j) { for (int i = 0; i < n; ++ i) { jump[i][j] = jump[jump[i][j-1]][j-1]; collect[i][j] = collect[i][j-1] + collect[jump[i][j-1]][j-1]; limit[i][j] = max(limit[i][j-1], limit[jump[i][j-1]][j-1] - collect[i][j-1]); } } } bool check(long long start, long long s, long long x) { long long pos = start, power = s; for (int i = 29; i >= 0; -- i) { if((1 << i) & x) { power += collect[pos][i]; pos = jump[pos][i]; if(pos == nn)return 1; if(power >= req)return 1; } } return (power >= req); } pair < long long, long long > stimulate_losing(int pos, long long power) { if(power >= a[pos])return make_pair(pos, power); return stimulate_losing(lose[pos], power + b[pos]); } long long simulate(int x, int z) { long long pos = x, power = z; while(pos != nn) { // cout << pos << " " << power << endl; for (int bit = 29; bit >= 0; -- bit) { if(jump[pos][bit] > pos && limit[pos][bit] <= power) { // cout << "movingggg " << endl; power += collect[pos][bit]; pos = jump[pos][bit]; } } if(pos == nn)return power; pair < long long, long long > op = stimulate_losing(pos, power); pos = op.first; power = op.second; } return power; } /*** 3 2 2 6 9 3 1 2 2 2 3 1 0 1 0 1 2 3 */
#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...