Submission #1339302

#TimeUsernameProblemLanguageResultExecution timeMemory
1339302khanhphucscratchObstacles for a Llama (IOI25_obstacles)C++20
13 / 100
243 ms38020 KiB
#include "obstacles.h"
#include<bits/stdc++.h>
using namespace std;
struct SparseTable
{
    int sparse[200005][20];
    void init(vector<int> a)
    {
        int n = a.size();
        for(int i = 0; i < n; i++) sparse[i][0] = a[i];
        for(int j = 1; j <= 18; j++){
            for(int i = 0; i < n; i++){
                sparse[i][j] = sparse[i][j-1];
                int p = i + (1 << (j-1));
                if(p < n) sparse[i][j] = max(sparse[i][j], sparse[p][j-1]);
            }
        }
    }
    int query(int l, int r)
    {
        int x = __lg(r-l+1);
        return max(sparse[l][x], sparse[r-(1<<x)+1][x]);
    }
};
struct SparseTableMin
{
    int sparse[200005][20];
    void init(vector<int> a)
    {
        int n = a.size();
        for(int i = 0; i < n; i++) sparse[i][0] = a[i];
        for(int j = 1; j <= 18; j++){
            for(int i = 0; i < n; i++){
                sparse[i][j] = sparse[i][j-1];
                int p = i + (1 << (j-1));
                if(p < n) sparse[i][j] = min(sparse[i][j], sparse[p][j-1]);
            }
        }
    }
    int query(int l, int r)
    {
        int x = __lg(r-l+1);
        return min(sparse[l][x], sparse[r-(1<<x)+1][x]);
    }
};
vector<int> t, h;
SparseTable st;
SparseTableMin stm;
void initialize(vector<int> T, vector<int> H) {
    t = T; h = H;
    st.init(h); stm.init(h);
}

bool can_reach(int L, int R, int S, int D) {
    //Subtask 3
    if(S > D) swap(S, D);
    int m = h.size();

    int l = 0, r = S, p = 0;
    while(l <= r){
        int mid = (l+r)/2;
        if(st.query(mid, S) >= t[0]) l = mid+1;
        else{p = mid; r = mid-1;}
    }
    int l1 = p;

    l = S, r = m-1, p = 0;
    while(l <= r){
        int mid = (l+r)/2;
        if(st.query(S, mid) >= t[0]) r = mid-1;
        else{p = mid; l = mid+1;}
    }
    int r1 = p;

    l = 0, r = D, p = 0;
    while(l <= r){
        int mid = (l+r)/2;
        if(st.query(mid, D) >= t[0]) l = mid+1;
        else{p = mid; r = mid-1;}
    }
    int l2 = p;

    l = D, r = m-1, p = 0;
    while(l <= r){
        int mid = (l+r)/2;
        if(st.query(D, mid) >= t[0]) r = mid-1;
        else{p = mid; l = mid+1;}
    }
    int r2 = p;
    /**/
    if(r1 >= l2) return 1;
    if(stm.query(l1, r1) > 0 || stm.query(l2, r2) > 0) return 0;
    if(st.query(S, D) < 3) return 1;
    else return 0;
}
#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...