제출 #1251261

#제출 시각아이디문제언어결과실행 시간메모리
1251261bronze_coder장애물 (IOI25_obstacles)C++20
83 / 100
212 ms28480 KiB
#include "obstacles.h"
#include <bits/stdc++.h>
using namespace std;

vector<int> h;
vector<int> parent;

struct DSU{
    vector<int> e;
    vector<int> z;
    DSU(int n){
        for(int i=0;i<n;i++){
            e.push_back(-1);
            z.push_back(i);
        }
    }
    int parent(int i){
        if(e[i]<0){
            return i;
        }
        e[i] = parent(e[i]);
        return e[i];
    }
    bool join(int i,int j){
        int x = parent(i);
        int y = parent(j);
        if(x==y){
            return false;
        }
        if(e[x]<e[y]){
            swap(x,y);
        }
        e[y] += e[x];
        e[x] = y;
        if(h[z[x]]<h[z[y]]){
            z[y] = z[x];
        }
        return true;
    }
};

DSU ans(0);

struct SegmentTree{
    vector<int> l;
    int n;
    SegmentTree(int m){
        n = m;
        for(int i=0;i<2*n;i++){
            l.push_back(0);
        }
    }
    void update(int i,int x){
        i += n;
        l[i] = x;
        while(i>0){
            i /= 2;
            l[i] = min(l[2*i],l[2*i+1]);
        }
    }
    int query(int i,int j){
        i += n;
        j += n;
        int ans = l[i];
        while(i<j){
            if(i&2){
                ans = min(l[i],ans);
                i++;
            }
            if(j&2){
                ans = min(l[j-1],ans);
                j--;
            }
            i /= 2;
            j /= 2;
        }
        return ans;
    }
};

void initialize(vector<int> T, vector<int> H){
    int n = T.size();
    int m = H.size();
    vector<int> t1 = {T[0]};
    vector<pair<int,int>> l;
    for(int i=1;i<n;i++){
        t1.push_back(min(t1[i-1],T[i]));
    }
    for(int i=0;i<m;i++){
        h.push_back(H[i]);
    }

    for(int i=0;i<n;i++){
        l.push_back({T[i],-i-1});
    }
    for(int i=0;i<m;i++){
        l.push_back({H[i],i});
    }

    sort(l.begin(),l.end());
    vector<int> stop(m);
    int cur = n;
    for(int i=0;i<n+m;i++){
        if(l[i].second<0){
            cur = min(cur,-l[i].second-1);
        }
        else{
            stop[l[i].second] = cur;
        }
    }


    vector<pair<int,int>> l1;
    for(int i=0;i<m;i++){
        l1.push_back({stop[i],i});
    }
    for(int i=0;i<n;i++){
        l1.push_back({i,-i-1});
    }
    sort(l1.begin(),l1.end());
    cur = -1;
    vector<int> start(m);
    for(int i=0;i<n+m;i++){
        if(l1[i].second<0){
            cur = max(cur,0);
            int x = -l1[i].second-1;
            if(T[x]>T[cur]){
                cur = x;
            }
        }
        else{
            start[l1[i].second] = cur;
        }
    }
    

    vector<pair<int,int>> l2;
    for(int i=0;i<m;i++){
        l2.push_back({H[i],i});
    }
    for(int i=0;i<n;i++){
        l2.push_back({T[i],-i-1});
    }
    sort(l2.begin(),l2.end());
    vector<int> first(m);
    cur = n;
    for(int i=n+m-1;i>=0;i--){
        if(l2[i].second<0){
            cur = min(cur,-l2[i].second-1);
        }
        else{
            first[l2[i].second] = cur;
        }
    }


    vector<pair<int,int>> s1;
    for(int i=0;i<m-1;i++){
        int x;
        if(H[i]>H[i+1]){
            x = i;
        }
        else{
            x = i+1;
        }
        s1.push_back({first[x],-i-1});
    }
    for(int i=0;i<m;i++){
        s1.push_back({start[i],i});
    }
    sort(s1.begin(),s1.end());
    DSU dsu(m);
    for(int i=0;i<m;i++){
        ans.e.push_back(-1);
        ans.z.push_back(i);
    }
    for(int i=0;i<m;i++){
        parent.push_back(-1);
    }
    for(int i=0;i<2*m-1;i++){
        if(s1[i].second<0){
            dsu.join(-s1[i].second,-s1[i].second-1);
        }
        else{
            if(s1[i].second!=dsu.z[dsu.parent(s1[i].second)]){
                parent[s1[i].second] = dsu.z[dsu.parent(s1[i].second)];
                ans.join(s1[i].second,dsu.z[dsu.parent(s1[i].second)]);
            }
        }
    }
}

bool can_reach(int L, int R, int S, int D){
    return ans.parent(S)==ans.parent(D);
}
#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...