답안 #730884

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
730884 2023-04-26T14:59:31 Z grogu Passport (JOI23_passport) C++14
16 / 100
2000 ms 930620 KB
#define here cerr<<"===========================================\n"
#define dbg(x) cerr<<#x<<": "<<x<<endl;
#include <bits/stdc++.h>
#define ld double
#define ll long long
#define ull unsigned long long
#define llinf 100000000000000000LL // 10^17
#define iinf 2000000000 // 2*10^9
#define pb push_back
#define popb pop_back
#define fi first
#define sc second
#define endl '\n'
#define pii pair<int,int>
#define pll pair<ll,ll>
#define pld pair<ld,ld>
#define all(a) a.begin(),a.end()
using namespace std;

#define maxn 5005
#define maxx 200005
#define lg 15
ll n,q;
pll a[maxx];
vector<ll> g[maxn*maxn];
ll dis[maxn*maxn];
ll lg2[maxn];
pll st[lg][maxn];
ll st2[lg][maxn];
ll kod(pll p){return p.fi*(n+1) + p.sc;}
pll rev(ll x){return {x/(n+1),x%(n+1)};}
void upd(ll x,ll y,ll w){
    g[x].pb(y);
    //cerr<<rev(x).fi<< " "<<rev(x).sc<< " "<<rev(y).fi<< " "<<rev(y).sc<<endl;
}
void getdis(ll poc){
    for(ll i = 1;i<maxn*maxn;i++) dis[i] = llinf;
    dis[poc] = 0;
    queue<ll> pq;
    pq.push(poc);
    while(pq.size()){
        ll u = pq.front();
        pq.pop();
        for(ll s : g[u]){
            if(dis[u]+1<dis[s]){
                dis[s] = dis[u] + 1;
                pq.push(s);
            }
        }
    }
}
ll mrg(ll x,ll y){
    if(a[x].sc-a[x].fi>a[y].sc-a[y].fi) return x;
    return y;
}
pll mrg(pll p,pll q){
    pll ans;
    if(a[p.fi].fi<a[q.fi].fi) ans.fi = p.fi;
    else if(a[p.fi].fi==a[q.fi].fi){
        if(a[p.fi].sc>a[q.fi].sc) ans.fi = p.fi;
        else ans.fi = q.fi;
    }else ans.fi = q.fi;
    if(a[p.sc].sc>a[q.sc].sc) ans.sc = p.sc;
    else if(a[p.sc].sc==a[q.sc].sc){
        if(a[p.sc].fi<a[q.sc].fi) ans.sc = p.sc;
        else ans.sc = q.sc;
    }else ans.sc = q.sc;
    return ans;
}
pair<pll,ll> get(ll l,ll r){
    ll len = r-l+1;
    ll x = lg2[len];
    ll len2 = (1<<x);
    pll p = st[x][l];
    pll q = st[x][r-len2+1];
    pll ans = mrg(p,q);
    ll px = st2[x][l];
    ll py = st2[x][r-len2+1];
    ll ansx = mrg(px,py);
    return {ans,ansx};
}
int main(){
	ios_base::sync_with_stdio(false);cerr.tie(0);cout.tie(0);cin.tie(0);
	for(ll j = 0;j<lg;j++) if((1<<j)<maxn) lg2[(1<<j)] = j;
	for(ll j = 2;j<maxn;j++){
        if(lg2[j]) continue;
        lg2[j] = lg2[j-1];
	}
    cin >> n;
    for(ll i = 1;i<=n;i++){
        cin >> a[i].fi >> a[i].sc;
        st[0][i] = {i,i};
        st2[0][i] = i;
    }
    if(n>2500){
        cin >> q;
        cin >> q;
        ll i = 1;
        ll ans = 0;
        ll r = a[i].sc;
        while(i!=n){
            ans++;
            for(ll j = i;j<=r;j++) i = max(i,a[j].sc);
        }
        cout<<ans<<endl;
        return 0;
    }
    for(ll j = 1;j<lg;j++){
        for(ll i = 1;i<=n;i++){
            if(i+(1<<j)-1>n) continue;
            st[j][i] = mrg(st[j-1][i],st[j-1][i+(1<<(j-1))]);
            st2[j][i] = mrg(st2[j-1][i],st2[j-1][i+(1<<(j-1))]);
        }
    }
    for(ll len = 1;len<=n;len++){
        for(ll i = 1;i+len-1<=n;i++){
            ll l = i,r = i+len-1;
            pair<pll,ll> q = get(l,r);
            upd(kod({l,r}),kod(a[q.sc]),1);
            pll p = q.fi;
            upd(kod({l,r}),kod({a[p.fi].fi,max(r,a[p.fi].sc)}),1);
            upd(kod({l,r}),kod({min(l,a[p.sc].fi),a[p.sc].sc}),1);
        }
    }
    cin >> q;
    while(q--){
        ll x; cin >> x;
        getdis(kod({x,x}));
        ll ans = dis[kod({1,n})];
        if(ans==llinf) cout<<-1<<endl;
        else cout<<ans<<endl;
    }
	return 0;
}
/**
4
1 3
2 4
2 3
4 4
1
1

5
1 5
2 4
2 3
3 5
1 5
1
3

5
1 1
2 3
1 5
3 4
5 5
5
1
2
3
4
5

4
1 2
1 2
3 4
3 4
4
1
2
3
4
**/
# 결과 실행 시간 메모리 Grader output
1 Correct 397 ms 784724 KB Output is correct
2 Correct 349 ms 784836 KB Output is correct
3 Correct 348 ms 784748 KB Output is correct
4 Execution timed out 2081 ms 595404 KB Time limit exceeded
5 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 368 ms 784708 KB Output is correct
2 Correct 352 ms 784720 KB Output is correct
3 Correct 349 ms 784804 KB Output is correct
4 Correct 355 ms 784588 KB Output is correct
5 Correct 341 ms 784764 KB Output is correct
6 Correct 345 ms 784720 KB Output is correct
7 Correct 340 ms 784716 KB Output is correct
8 Correct 377 ms 784664 KB Output is correct
9 Correct 343 ms 784680 KB Output is correct
10 Correct 351 ms 784712 KB Output is correct
11 Correct 350 ms 786788 KB Output is correct
12 Correct 360 ms 787044 KB Output is correct
13 Correct 367 ms 786948 KB Output is correct
14 Correct 365 ms 786764 KB Output is correct
15 Correct 368 ms 786892 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 368 ms 784708 KB Output is correct
2 Correct 352 ms 784720 KB Output is correct
3 Correct 349 ms 784804 KB Output is correct
4 Correct 355 ms 784588 KB Output is correct
5 Correct 341 ms 784764 KB Output is correct
6 Correct 345 ms 784720 KB Output is correct
7 Correct 340 ms 784716 KB Output is correct
8 Correct 377 ms 784664 KB Output is correct
9 Correct 343 ms 784680 KB Output is correct
10 Correct 351 ms 784712 KB Output is correct
11 Correct 350 ms 786788 KB Output is correct
12 Correct 360 ms 787044 KB Output is correct
13 Correct 367 ms 786948 KB Output is correct
14 Correct 365 ms 786764 KB Output is correct
15 Correct 368 ms 786892 KB Output is correct
16 Correct 919 ms 913692 KB Output is correct
17 Incorrect 1018 ms 930620 KB Output isn't correct
18 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 368 ms 784708 KB Output is correct
2 Correct 352 ms 784720 KB Output is correct
3 Correct 349 ms 784804 KB Output is correct
4 Correct 355 ms 784588 KB Output is correct
5 Correct 341 ms 784764 KB Output is correct
6 Correct 345 ms 784720 KB Output is correct
7 Correct 340 ms 784716 KB Output is correct
8 Correct 377 ms 784664 KB Output is correct
9 Correct 343 ms 784680 KB Output is correct
10 Correct 351 ms 784712 KB Output is correct
11 Correct 350 ms 786788 KB Output is correct
12 Correct 360 ms 787044 KB Output is correct
13 Correct 367 ms 786948 KB Output is correct
14 Correct 365 ms 786764 KB Output is correct
15 Correct 368 ms 786892 KB Output is correct
16 Correct 919 ms 913692 KB Output is correct
17 Incorrect 1018 ms 930620 KB Output isn't correct
18 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 397 ms 784724 KB Output is correct
2 Correct 349 ms 784836 KB Output is correct
3 Correct 348 ms 784748 KB Output is correct
4 Execution timed out 2081 ms 595404 KB Time limit exceeded
5 Halted 0 ms 0 KB -