답안 #959728

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
959728 2024-04-09T01:18:16 Z VinhLuu Passport (JOI23_passport) C++17
0 / 100
2000 ms 163956 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 u,int j){
    for(int i = 1; i <= 4 * n; i ++) d[i][j] = oo;
    d[id[u]][j] = 0;
    queue<int> q; q.push(id[u]);
    while(!q.empty()){
        int u = q.front();
        q.pop();
        for(auto [v, w] : p[u]) if(d[u][j] + w < d[v][j]){
            d[v][j] = d[u][j] + w;
            q.push(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);
    }
    cal(1, 0);
    cal(n, 1);
    queue<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()){
//        int w = pq.front().fi;
//        int u = pq.front().se;
//        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 33 ms 94300 KB Output is correct
2 Correct 33 ms 94300 KB Output is correct
3 Correct 32 ms 94484 KB Output is correct
4 Correct 724 ms 163956 KB Output is correct
5 Execution timed out 2036 ms 134752 KB Time limit exceeded
6 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 33 ms 94620 KB Output is correct
2 Incorrect 34 ms 94556 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 33 ms 94620 KB Output is correct
2 Incorrect 34 ms 94556 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 33 ms 94620 KB Output is correct
2 Incorrect 34 ms 94556 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 33 ms 94300 KB Output is correct
2 Correct 33 ms 94300 KB Output is correct
3 Correct 32 ms 94484 KB Output is correct
4 Correct 724 ms 163956 KB Output is correct
5 Execution timed out 2036 ms 134752 KB Time limit exceeded
6 Halted 0 ms 0 KB -