Submission #1277383

#TimeUsernameProblemLanguageResultExecution timeMemory
1277383Muhammad_AneeqObstacles for a Llama (IOI25_obstacles)C++20
83 / 100
356 ms53120 KiB
#include "obstacles.h"
#include "bits/stdc++.h"
using namespace std;
int const MAXN=2e5+10,LG=19;
int rec[MAXN]={};
bool dead[MAXN]={},done[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]])
        {
            if (!done[j])
                f.push_back(j);
        }
    }
    for (auto i:f)
    {
        done[i]=1;
        rec[i]=min(rec[i],k);
    }
}
void initialize(vector<int> T, vector<int> H) 
{
    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]=n-1,dead[i]=1;
        vls.push_back({h[i],i});
        par[i]=i;
        mn[i]=h[i];
        ch[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<m&&!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)// 105636 85190
{
    if (D<S)
        swap(D,S);
    int z=mh.get(S,D);
    int h=min(rec[S],rec[D]);
    int g=mt.get(0,h);
    // if (D==105636&&S==85190)
    // {
    //     cout<<rec[S]<<' '<<rec[D]<<endl;
    //     cout<<z<<' '<<h<<' '<<g<<endl;
    // }
    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...