제출 #1162887

#제출 시각아이디문제언어결과실행 시간메모리
1162887tw20000807Rainforest Jumps (APIO21_jumps)C++20
48 / 100
484 ms51308 KiB
#include<bits/stdc++.h>

#define ll long long
#define all(v) v.begin(), v.end()
#define SZ(x) (int)x.size()
#define pii pair<int, int>
#define X first
#define Y second

using namespace std;

struct TABLE{
    int n;
    int g;
    vector< vector< int > > dp;
    TABLE(){}
    TABLE(vector< int > &v){
        n = SZ(v);
        g = __lg(n) + 1;
        dp.resize(g, vector< int >(n));
        for(int i = 0; i < n; ++i){
            dp[0][i] = v[i];
        }
        for(int j = 1; j < g; ++j){
            for(int i = 0; i + (1 << j) - 1 < n; ++i){
                dp[j][i] = max(dp[j - 1][i], dp[j - 1][i + (1 << (j - 1))]);
            }
        }
    }
    int query(int l, int r){
        int lg = __lg(r - l + 1);
        return max(dp[lg][l], dp[lg][r - (1 << lg) + 1]);
    }
};
TABLE RMQ;
vector< vector< int > > big, rig;
vector< int > h, p;
void init(int n, vector<int> H) {
	h = H;
	p.resize(n + 2);
    vector< int > l(n, n), r(n, n);
	h.push_back(n + 1);
    {
        vector< int > stk;
        for(int i = 0; i < n; ++i){
            while(!stk.empty() && h[stk.back()] < h[i]){
                r[stk.back()] = i;
                stk.pop_back();
            }
            l[i] = stk.empty() ? n : stk.back();
            stk.push_back(i);
        }
    }
    RMQ = TABLE(h);
    big.resize(20, vector< int >(n + 1));
	rig.resize(20, vector< int >(n + 1));
    for(int i = 0; i < n; ++i){
		p[h[i]] = i;
		if(h[l[i]] > h[r[i]]) big[0][i] = l[i];
		else big[0][i] = r[i];
		rig[0][i] = r[i];
    }
	big[0][n] = rig[0][n] = n;
	for(int i = 1; i < 20; ++i){
		for(int j = 0; j <= n; ++j){
			big[i][j] = big[i - 1][big[i - 1][j]];
			rig[i][j] = rig[i - 1][rig[i - 1][j]];
		}
	}
}

int minimum_jumps(int a, int b, int c, int d) {
	int l = a, r = b, ans = b;
	int hi = p[RMQ.query(c, d)];
	while(l <= r){
		int mid = (l + r) >> 1;
		int t = RMQ.query(mid, b);
		if(RMQ.query(mid, b) <= h[hi]){
			ans = p[t];
			r = mid - 1;
		}
		else l = mid + 1;
	}

    int now = ans;
	int cnt = 0;
	for(int i = 19; i >= 0; --i){
		int bjump = big[i][now], rjump = rig[i][now];
		if(c <= rjump) continue;
		if(bjump >= c) continue;
		if(h[bjump] > h[hi]) continue;
		now = bjump; cnt += (1 << i);
	}
	for(int i = 19; i >= 0; --i){
		int jump = rig[i][now];
		if(jump >= c) continue;

		now = rig[i][now];
		cnt += (1 << i);
	}
	now = rig[0][now];
	++cnt;
	if(c <= now && now <= d) return cnt;
	return -1;
}
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...