Submission #1257267

#TimeUsernameProblemLanguageResultExecution timeMemory
1257267yhx3Obstacles for a Llama (IOI25_obstacles)C++20
0 / 100
87 ms8636 KiB
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
using namespace std;
using namespace __gnu_pbds;
#define ord_set tree < int ,  null_type ,  less ,  rb_tree_tag ,  tree_order_statistics_node_update>
#define ll unsigned long long
#define rep(i,a,b) for (int i = a; i < b; i++)
#define rrep(i,a,b) for (int i = a; i >= b; i--)
void N() {cout<<"NO\n";}
void Y() {cout<<"YES\n";}
void isTrue(bool ope) {
    if (ope) Y();else N();
}
int MD = 1e9+7;
ll MX_VL = 1e18;
int MX_ll = 2e9;

vector<int> T;
vector<int> H;
vector<int> pref;
vector<int> pref2;
vector<int> pnt;
vector<int> cnc2;
int m;
int n;

void initialize(std::vector<int> Tp, std::vector<int> Hp) {
    T = Tp;
    H = Hp;
    m = Hp.size();
    n = Tp.size();
    pref.resize(m,0);
    pref2.resize(m,0);
    pref2[0] = H[0] >= 2;
    pref[0] = Tp.back() <= Hp[0];
    rep(i,0,m) {
        if (H[i] == 0) pnt.push_back(i);
        if (H[i] >= 2) {
            cnc2.push_back(i);
            pref2[i] = pref2[i-1]+1;
        } else pref2[i] = pref2[i-1];
    }
    rep(i,1,m) {
        pref[i] = (Tp.back() <= Hp[i]) + pref[i-1];
    }
}

bool can_reach(int L, int R, int S, int D) {
    auto tt = lower_bound(cnc2.begin(),cnc2.end(),S);
    if (tt == cnc2.end() || *tt > D) return true;
    int i1 = lower_bound(cnc2.begin(),cnc2.end(),D)-cnc2.begin();
    int l = i1-1 >= 0 ? cnc2[i1-1]+1 : 0;
    int r = i1 < cnc2.size() ? cnc2[i1]-1 : m-1;
    if (pref[D]!=pref[S]) return false;
    auto it = lower_bound(pnt.begin(),pnt.end(),l);
    if (it == pnt.end() || *it > r) return false;
    auto it2 = lower_bound(pnt.begin(),pnt.end(),S);
    if (it2 != pnt.end() && *it2 < *tt && pref[(*it)]==pref[S]) {
        return true;
    }
    int cs = upper_bound(pnt.begin(),pnt.end(),S)-pnt.begin()-1;
    int x =  lower_bound(cnc2.begin(),cnc2.end(),S) - cnc2.begin() - 1;
    int prev = x >= 0 ? cnc2[x] : -1;
    if (cs >= 0 && pnt[cs] > prev && pref[S] == pref[pnt[cs]]) return true;
    return false;
}
#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...