Submission #1369608

#TimeUsernameProblemLanguageResultExecution timeMemory
1369608edga1Obstacles for a Llama (IOI25_obstacles)C++20
0 / 100
86 ms8692 KiB
#include <iostream>
#include "obstacles.h"
#define fi first
#define se second
#define ll long long
#define pb push_back
using namespace std;

const int N=200005;
int st[4*N];
int g[N];
int t[N],h[N];
int n,MAXT=0;

void build(int x, int xl, int xr){
    if(xl==xr){
        st[x]=h[xl];
        return;
    }
    int mid=(xl+xr)/2;
    build(x*2+1,xl,mid);
    build(x*2+2,mid+1,xr);
    st[x]=max(st[x*2+1],st[x*2+2]);
    return;
}

int f(int x, int xl, int xr, int l, int r){
    if(xl>=l && xr<=r) return st[x];
    if(xr<l || xl>r) return 0;
    int mid=(xl+xr)/2;
    return max(f(x*2+1,xl,mid,l,r),f(x*2+2,mid+1,xr,l,r));
}

void initialize(vector<int> T, vector<int> H) {
    for(int i=0; i<T.size(); i++){
        t[i]=T[i];
        MAXT=max(MAXT,t[i]);
    }
    for(int i=0; i<H.size(); i++){
        h[i]=H[i];
        if(h[i]==0) g[i]=1;
    }
    for(int i=1; i<n; i++){
        if(g[i-1] && h[i]<2) g[i]=1;
    }
    for(int i=n-2; i>=0; i--){
        if(g[i+1] && h[i]<2) g[i]=1;
    }
    n=H.size();
    build(0,0,n-1);
    return;
}

bool can_reach(int L, int R, int S, int D) {
    int l=L,r=R,s=S,d=D;
    if(s>d) swap(s,d);
    if(s==d || s+1==d) return 1;
    int mah=f(0,0,n-1,s+1,d-1);
    if(mah>=3) return 0;
    if(mah<2) return 1;
    if(g[s] && g[d]) return 1;
    return 0;
}

/*
3 4
2 1 3
0 1 2 0
1
0 3 1 3
*/
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...