제출 #887824

#제출 시각아이디문제언어결과실행 시간메모리
887824Danet밀림 점프 (APIO21_jumps)C++14
100 / 100
942 ms55500 KiB
/****************************D a N E T****************************
***     ██████╗     █████╗    ███╗    ██╗   ███████╗ ████████╗   ***
***     ██╔══██╗   ██╔══██╗   ████╗   ██║   ██╔════╝ ╚══██╔══╝   ***
***     ██║   ██║  ███████║   ██╔██╗  ██║   █████╗      ██║      ***
***     ██║   ██║  ██╔══██║   ██║╚██╗ ██║   ██╔══╝      ██║      ***
***     ██████╔╝   ██║  ██║   ██║  ╚████║   ███████╗    ██║      ***
***     ╚═════╝    ╚═╝  ╚═╝   ╚═╝   ╚═══╝   ╚══════╝    ╚═╝      ***   
****************************D a N E T****************************/
#include <bits/stdc++.h>
using namespace std;
/**************************P R a G M as**************************/
#pragma Gcc optimize("O3")
/**************************D E F I N Es**************************/
#define Tof_Io  		ios_base::sync_with_stdio(false);cin.tie(0) , cout.tie(0);
//#define int  			long long int
#define double  		long double
#define pb				push_back
#define endl 			'\n'
/*****************D E F I N Es-F U N c T I O Nes*****************/
#define debug(x)    	cerr << #x << ": " << x << endl
#define kill(x)     	cout << x << endl, exit(0)
#define all(x) 			x.begin(),x.end()
#define yes             cout << "Yes"
#define no              cout <<"No"
/***************************c O N S Ty***************************/
const double 			PI = 3.141592653589793;
const int 				mod = 998244353;//1e9+7 998244353
const int 				inf = 1e9+9;
const int 				lg = 19;
const int               N = 2e5 + 23;
/***************************b U I L Dy***************************/
int fac[N];
int inv[N];
vector<int> adj[N];

vector<pair<int, int> > dx = {{-1, 0}, {1, 0}, {0, 1}, {0, -1}};
/****************************N O T Ey****************************/
/*

*/
/***********************F U N c T I O N es***********************/
int  dnt_pow	(int a, int b, int md = mod){int ans = 1; while(b){if(b&1){ans = (a*ans)%md;}a = (a*a)%md;b >>= 1;}return ans ;}
void dnt_bld	(){fac[0] = 1; inv[0] = dnt_pow(fac[0],mod-2) ;for(int i = 1 ; i < N ; i++) {fac[i] = (fac[i-1] * i) % mod;inv[i] = dnt_pow( fac[i] , mod-2);}}
int  dnt_ncr	(int n,int r){return fac[n] * inv[r] % mod * inv[n-r] % mod;}
/****************************************************************/ 
int jm[2][20][N];
int er[20][N];
vector<int> h;
int n;

void init(int nn, vector<int> hh) 
{
    stack<int> s;
    n = nn;
    h.push_back(1e9);
    for(int i = 0; i < hh.size(); i++)
    {
        h.push_back(hh[i]);
    }
    h.push_back(1e9);
    n++;
    n++;
    for(int i = 0; i < n; i++)
    {
        while(!s.empty() and (h[s.top()] < h[i]))
        {
            s.pop();
        }
        if(s.empty())
        {
            jm[0][0][i] = i;
        }
        else
        {
            jm[0][0][i] = s.top();
        }
        s.push(i);
    }
    ///
    while(!s.empty())
    {
        s.pop();
    }
    ///
    ///
    ///
    ///
    //

    for(int i = n - 1; i >= 0; i--)
    {
        while(!s.empty() and (h[s.top()] < h[i]))
        {
            s.pop();
        }
        //
        if(s.empty())
        {
            jm[1][0][i] = i;
        }
        else
        {
            jm[1][0][i] = s.top();
        }
        s.push(i);

        ////
        er[0][i] = jm[0][0][i];
        if(h[jm[1][0][i]] >= h[jm[0][0][i]]) er[0][i] = jm[1][0][i];
    }
    //

    for(int i = 1; i < 20; i++)
    {
        for(int j = 0; j < n; j++)
        {
            jm[0][i][j] = jm[0][i - 1][jm[0][i - 1][j]];

            jm[1][i][j] = jm[1][i - 1][jm[1][i - 1][j]];

            er[i][j] = er[i - 1][er[i - 1][j]];
        }
    }
}
 
int minimum_jumps(int a, int b, int c, int d) 
{
    a++, b++, c++, d++;
    if(b + 1 == c)
    {
        if(jm[1][0][b] > d)
        {
            return -1;
        }
        return 1;
    }
    //
    int mid = b + 1;
    for(int i = lg; i >= 0; i--)
    {
        if(jm[1][i][mid] <= c - 1)
        {
            mid = jm[1][i][mid];
        }
    }
    //
    if(h[b] > h[mid])
    {
        if(jm[1][0][b] <= d) return 1;
        return -1;
    }
    int tmp = b;
    for(int i = lg; i >= 0; i--)
    {
        if(a <= jm[0][i][tmp] and (h[jm[0][i][tmp]] <= h[mid]))
        {
            tmp = jm[0][i][tmp];
        }
    }
    int ans = 0;
    if(a <= jm[0][0][tmp])
    {
        if(jm[1][0][jm[0][0][tmp]] <= d)
        {
            return 1;
        }
    }
    else
    {
        for(int i = lg; i >= 0; i--)
        {
            if(h[er[i][tmp]] <= h[mid])
            {
                ans += (1 << i);
                tmp = er[i][tmp];
            }
        }
        if(tmp == mid)
        {
            if(jm[1][0][tmp] <= d) return ans + 1;
            return -1;
        }
        if(jm[0][0][tmp] > 0 and jm[1][0][jm[0][0][tmp]] <= d)
        {
            return ans + 2;
        }
    }
    for(int i = lg; i >= 0; i--)
    {
        if(jm[1][i][tmp] < c)
        {
            ans = ans + (1 << i);
            tmp = jm[1][i][tmp];
        }
    }
    tmp = jm[1][0][tmp];
    if(c <= tmp and tmp <= d)
    {
        return ans + 1;
    }
    return -1;
}

컴파일 시 표준 에러 (stderr) 메시지

jumps.cpp:12: warning: ignoring '#pragma Gcc optimize' [-Wunknown-pragmas]
   12 | #pragma Gcc optimize("O3")
      | 
jumps.cpp: In function 'void init(int, std::vector<int>)':
jumps.cpp:56:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   56 |     for(int i = 0; i < hh.size(); i++)
      |                    ~~^~~~~~~~~~~
#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...