Submission #1020532

#TimeUsernameProblemLanguageResultExecution timeMemory
1020532vjudge1Roller Coaster Railroad (IOI16_railroad)C++17
0 / 100
345 ms116372 KiB
#include "railroad.h"
#include <bits/stdc++.h>

#define ll long long
#define pii pair<int,int>
#define F first
#define S second
#define sz(s) (int)s.size()
#define in insert
#define pb push_back
#define all(v) v.begin(),v.end()
#define mem(a,i) memset(a,i,sizeof(a))

using namespace std;

const int MAX=2e5+10;

int n,cnt;
int t[4*MAX];
vector<int> g[6*MAX],g1[6*MAX];
vector<pii> vect;

void add(int x,int y){
    g[x].pb(y);
    g1[y].pb(x);
}

void build(int v,int tl,int tr){
    if(tl==tr){
        t[v]=vect[tl].S;
        return;
    }
    int tm=(tl+tr)/2;
    build(2*v,tl,tm);
    build(2*v+1,tm+1,tr);
    t[v]=cnt++;
    add(t[v],t[2*v]);
    add(t[v],t[2*v+1]);
}

void update(int v,int tl,int tr,int l,int r,int i){
    if(l>r||tl>r||l>tr)return;
    if(l<=tl&&tr<=r){
        add(i,t[v]);
        return;
    }
    int tm=(tl+tr)/2;
    update(2*v,tl,tm,l,r,i);
    update(2*v+1,tm+1,tr,l,r,i);
}

vector<int> top;
bool use[6*MAX];

void dfs(int v){
    use[v]=1;
    for(auto to:g[v]){
        if(use[to])continue;
        dfs(to);
    }
    top.pb(v);
}

int cmp[MAX];

void dfs1(int v,int c){
    cmp[v]=c;
    use[v]=1;
    for(auto to:g1[v]){
        if(use[to])continue;
        dfs1(to,c);
    }
}

long long plan_roller_coaster(vector<int> s, vector<int> t) {
    n=sz(s);
    cnt=n;
    for(int i=0;i<n;i++){
        vect.pb({s[i],i});
    }
    sort(all(vect));
    build(1,0,n-1);
    vector<pii> tv;
    for(int i=0;i<n;i++){
        tv.pb({t[i],i});
    }
    sort(all(tv));
    reverse(all(tv));
    int r=n;
    for(int i=0;i<n;i++){
        while(r>0&&tv[i].F<=vect[r-1].F){
            r--;
        }
        update(1,0,n-1,r,n-1,tv[i].S);
    }
    for(int i=0;i<cnt;i++){
        if(!use[i])dfs(i);
    }
    mem(use,0);
    reverse(all(top));
    int c=0;
    for(int v:top){
        if(!use[v])dfs1(v,++c);
    }
    int ok=1;
    for(int i=1;i<n;i++){
        ok&=(cmp[i]==cmp[0]);
    }
    return (ok^1);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...