Submission #741304

#TimeUsernameProblemLanguageResultExecution timeMemory
741304Username4132Passport (JOI23_passport)C++14
100 / 100
305 ms22472 KiB
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
using pii = pair<int, int>;
#define forn(i, n) for(int i=0; i<(int)n; ++i)
#define dforn(i, n) for(int i=n-1; i>=0; --i)
#define PB push_back
#define F first
#define S second

const int MAXN=200010, INF=1e7;
int n, q, x, dl[MAXN], dr[MAXN], ans[2*MAXN], order[MAXN];
vector<pii> low[MAXN];
pii arr[MAXN], ext[2*MAXN];

template<typename T>
void build(T* tr){
    dforn(i, n) tr[i]=min(tr[i<<1], tr[i<<1|1]);
}

template<typename T>
T query(int l, int r, T* tr, T ret){
    for(l+=n, r+=n; l<r; l>>=1, r>>=1){
        if(l&1) ret=min(ret, tr[l++]);
        if(r&1) ret=min(ret, tr[--r]);
    }
    return ret;
}

template<typename T>
void modify(int p, T value, T* tr){
    for(p+=n, tr[p]=value; p>1; p>>=1) tr[p>>1]=min(tr[p], tr[p^1]);
}

struct segment{
    segment(){
        forn(i, n) low[arr[i].S-1].PB({arr[i].F-1, i});
        forn(i, n) sort(low[i].begin(), low[i].end(), greater<pii>());
        forn(i, n) ext[i+n]={(low[i].empty()? INF : low[i].back().F), i};
        build(ext);
    }
    int extract(int p){
        pii pos = query(p, n, ext, {INF, INF});
        if(pos.F<=p){
            int ret = low[pos.S].back().S;
            low[pos.S].pop_back();
            modify(pos.S, {(low[pos.S].empty()? INF : low[pos.S].back().F), pos.S}, ext);
            return ret;
        }
        else return -1;
    }
};


void bfs(int start, int* dis){
    segment seg;
    queue<int> Q;
    forn(i, n) dis[i]=INF;
    dis[start]=-1;
    Q.push(start);
    while(!Q.empty()){
        int v=Q.front(), to;
        Q.pop();
        while((to=seg.extract(v))!=-1) if(to!=start){
            dis[to]=dis[v]+1;
            Q.push(to);
        }
    }
    dis[start]=0;
}

int main(){
    scanf("%d", &n);
    forn(i, n) scanf("%d %d", &arr[i].F, &arr[i].S), order[i]=i;
    bfs(0, dl);
    bfs(n-1, dr);
    forn(i, 2*n) ans[i]=INF;
    sort(order, order+n, [](int a, int b){
        return dl[a]+dr[a]<dl[b]+dr[b];
    });
    forn(i, n){
        int ind=order[i];
        modify(ind, query(arr[ind].F - 1, arr[ind].S, ans, dl[ind]+dr[ind])+1, ans);
    }
    scanf("%d", &q);
    forn(i, q) scanf("%d", &x), printf("%d\n", ans[n+x-1]>=INF? - 1 : ans[n+x-1]);
}

Compilation message (stderr)

passport.cpp: In function 'int main()':
passport.cpp:75:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   75 |     scanf("%d", &n);
      |     ~~~~~^~~~~~~~~~
passport.cpp:76:21: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   76 |     forn(i, n) scanf("%d %d", &arr[i].F, &arr[i].S), order[i]=i;
      |                ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
passport.cpp:87:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   87 |     scanf("%d", &q);
      |     ~~~~~^~~~~~~~~~
passport.cpp:88:21: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   88 |     forn(i, q) scanf("%d", &x), printf("%d\n", ans[n+x-1]>=INF? - 1 : ans[n+x-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...
#Verdict Execution timeMemoryGrader output
Fetching results...