Submission #1277365

#TimeUsernameProblemLanguageResultExecution timeMemory
1277365Muhammad_AneeqObstacles for a Llama (IOI25_obstacles)C++20
24 / 100
246 ms54700 KiB
#include "obstacles.h"
#include "bits/stdc++.h"
using namespace std;
int const MAXN=2e5+10,LG=19;
int rec[MAXN]={};
bool dead[MAXN]={};
int par[MAXN]={};
int mn[MAXN]={};
vector<int>ch[MAXN]={};
struct spr
{
    int tbl[MAXN][LG]={};
    void build(vector<int>a)
    {
        int n=a.size();
        for (int i=0;i<n;i++)
            tbl[i][0]=a[i];
        for (int i=1;(1<<i)<=n;i++)
            for (int j=0;j+(1<<i)-1<n;j++)
                tbl[j][i]=max(tbl[j][i-1],tbl[j+(1<<(i-1))][i-1]);
    }  
    int get(int l,int r)
    {
        int lg=log2(r-l+1);
        return max(tbl[l][lg],tbl[r+1-(1<<lg)][lg]);
    }
};
int root(int n)
{
    return (par[n]==n?n:par[n]=root(par[n]));
}
set<pair<int,int>>S;
void merge(int u,int v)
{
    u=root(u);
    v=root(v);
    if (u==v)
        return;
    ch[u].push_back(v);
    S.erase({mn[u],u});
    S.erase({mn[v],v});
    par[v]=u;
    mn[u]=min(mn[u],mn[v]);
    S.insert({mn[u],u});
}
vector<int>t,h;
spr mh,mt;
void rem(int u,int k)
{
    vector<int>f;
    f.push_back(u);
    for (int i=0;i<f.size();i++)
    {
        for (auto j:ch[f[i]])
            f.push_back(j);
    }
    for (auto i:f)
    {
        rec[i]=k;
        dead[i]=1;
    }
}
void initialize(vector<int> T, vector<int> H) 
{
    H.push_back(1e9+10);
    T.push_back(-1e9);
    t=T;
    h=H;
    int n=t.size(),m=h.size();
    mh.build(h);
    mt.build(t);
    vector<pair<int,int>>vls;
    for (int i=0;i<m;i++)
    {
        rec[i]=-1,dead[i]=1;
        vls.push_back({h[i],i});
        par[i]=i;
        mn[i]=h[i];
    }
    sort(begin(vls),end(vls));
    reverse(begin(vls),end(vls));
    for (int i=0;i<n;i++)
    {
        while (vls.size()&&t[i]>vls.back().first)
        {
            int ind=vls.back().second;
            vls.pop_back();
            dead[ind]=0;
            S.insert({mn[ind],ind});
            if (ind+1<n&&!dead[ind+1])
                merge(ind,ind+1);
            if (ind-1>=0&&!dead[ind-1])
                merge(ind,ind-1);
        }
        while (S.size()&&(*rbegin(S)).first>=t[i])
        {
            int z=(*rbegin(S)).second;
            rem(z,i-1);
            S.erase(*rbegin(S));
        }
    }
    // cerr<<1<<endl;
    return;
}

bool can_reach(int L, int R, int S, int D)
{
    if (D<S)
        swap(D,S);
    int z=mh.get(S,D);
    int h=min(rec[S],rec[D]);
    if (h<0)
        return false;
    int g=mt.get(0,h);
    if (g>z)
        return 1;
    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...