답안 #959739

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
959739 2024-04-09T02:41:34 Z VinhLuu Passport (JOI23_passport) C++17
0 / 100
535 ms 176360 KB
#pragma GCC optimize("Ofast")
#pragma GCC optimize("O2,O3,unroll-loops")
#pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")

#include <bits/stdc++.h>
//#define int long long
//#define ll long long
#define fi first
#define se second
#define pb push_back
#define all(lmao) lmao.begin(), lmao.end()

using namespace std;

typedef pair<int,int> pii;
//typedef tuple<int,int,int> tp;
const int N = 1e6 + 5;
//const int mod = 1e9 + 7;
const int oo = 1e8;

int n, L[N], R[N], h[N << 2], id[N], f[N << 2];
vector<pii> p[N << 2];

void build(int i,int l,int r){
    if(l == r){
        id[l] = i;
        h[i] = 1;

        return;
    }
    int mid = (l + r) / 2;
    build(i << 1, l, mid);
    build(i << 1|1, mid + 1, r);
    p[i << 1].pb({i, 0});
    p[i << 1|1].pb({i, 0});
}

void update(int i,int l,int r,int u,int v,int x){
    if(l > r || l > v || r < u) return;
    if(u <= l && r <= v){
        p[i].pb({id[x], 1});
        return;
    }
    int mid = (l + r) / 2;
    update(i << 1, l, mid, u, v, x);
    update(i << 1|1, mid + 1, r, u, v, x);
}

int d[N << 2][5];

void cal(int st,int j){
    d[id[st]][j] = 0;
    priority_queue<pii, vector<pii>, greater<pii>> q; q.push({0, id[st]});
    while(!q.empty()){
        auto &[g, u] = q.top();
        q.pop();
        if(g > d[u][j]) continue;
        for(auto [v, w] : p[u]) if(d[u][j] + w < d[v][j]){
            d[v][j] = d[u][j] + w;
            q.push({d[v][j], v});
        }
    }
}

signed main(){
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);

    #define task "v"
    if(fopen(task ".inp","r")){
        freopen(task ".inp","r",stdin);
        freopen(task ".out","w",stdout);
    }

    cin >> n;
    build(1, 1, n);
    for(int i = 1; i <= n; i ++){
        cin >> L[i] >> R[i];
        update(1, 1, n, L[i], R[i], i);
    }
    for(int i = 1; i <= 4 * n; i ++) d[i][0] = d[i][1] = oo;
    cal(1, 0);
    cal(n, 1);
    priority_queue<pii, vector<pii>, greater<pii>> pq;
    for(int i = 1; i <= 4 * n; i ++){
        if(id[1] == i || id[n] == i) f[i] = d[i][1] + d[i][0];
        else f[i] = d[i][1] + d[i][0] - h[i];
        pq.push({f[i], i});
    }
    while(!pq.empty()){
        auto &[w, u] = pq.top();
        pq.pop();
        if(w > f[u]) continue;
        for(auto [v, g] : p[u]) if(w + g < f[v]) pq.push({f[v] = w + g, v});
    }
    int q;
    cin >> q;
    while(q--){
        int x; cin >> x;
        cout << (f[id[x]] >= oo ? -1 : f[id[x]]) << "\n";
    }
}

Compilation message

passport.cpp: In function 'int main()':
passport.cpp:71:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   71 |         freopen(task ".inp","r",stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
passport.cpp:72:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   72 |         freopen(task ".out","w",stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 63 ms 102908 KB Output is correct
2 Correct 31 ms 102852 KB Output is correct
3 Correct 32 ms 103004 KB Output is correct
4 Incorrect 535 ms 176360 KB Output isn't correct
5 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 29 ms 103004 KB Output is correct
2 Correct 29 ms 103036 KB Output is correct
3 Correct 29 ms 103004 KB Output is correct
4 Correct 30 ms 103004 KB Output is correct
5 Correct 29 ms 102984 KB Output is correct
6 Correct 30 ms 103004 KB Output is correct
7 Incorrect 30 ms 103004 KB Output isn't correct
8 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 29 ms 103004 KB Output is correct
2 Correct 29 ms 103036 KB Output is correct
3 Correct 29 ms 103004 KB Output is correct
4 Correct 30 ms 103004 KB Output is correct
5 Correct 29 ms 102984 KB Output is correct
6 Correct 30 ms 103004 KB Output is correct
7 Incorrect 30 ms 103004 KB Output isn't correct
8 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 29 ms 103004 KB Output is correct
2 Correct 29 ms 103036 KB Output is correct
3 Correct 29 ms 103004 KB Output is correct
4 Correct 30 ms 103004 KB Output is correct
5 Correct 29 ms 102984 KB Output is correct
6 Correct 30 ms 103004 KB Output is correct
7 Incorrect 30 ms 103004 KB Output isn't correct
8 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 63 ms 102908 KB Output is correct
2 Correct 31 ms 102852 KB Output is correct
3 Correct 32 ms 103004 KB Output is correct
4 Incorrect 535 ms 176360 KB Output isn't correct
5 Halted 0 ms 0 KB -