Submission #1257313

#TimeUsernameProblemLanguageResultExecution timeMemory
1257313son2008Passport (JOI23_passport)C++20
46 / 100
417 ms92892 KiB
#include <bits/stdc++.h> using namespace std; #define ii pair<int, int> #define fi first #define se second // #define int long long #define ll long long #define ld double #define mp make_pair #define lg2 30 #define iii pair<int, ii> #define iiii pair<ii, ii> #define base 29 #define eps 1e-8 #define MASK(i) (1LL << (i)) #define BIT(S, i) (((S) >> (i)) & 1) int dx[] = {0LL, 0LL, 1, -1, 1, 1, -1, -1}; int dy[] = {1, -1, 0LL, 0LL, 1, -1, 1, -1}; const int maxn = 4e5 + 5, inf = 1e9; const int mod = 1e9 + 7; int pos[maxn], n, q, dist1[maxn << 2], distn[maxn << 2], dis[maxn << 2]; vector<ii> a[maxn << 2]; void build(int id, int l, int r) { if (l == r) { pos[l] = id; return; } int mid = (l + r) / 2; build(id << 1, l, mid); build(id << 1 | 1, mid + 1, r); a[id << 1].push_back({id, 0}); a[id << 1 | 1].push_back({id, 0}); } void update(int id, int l, int r, int u, int v, int vt) { if (u > r || v < l) return; if (u <= l && v >= r) { a[id].push_back({vt, 1}); return; } int mid = (l + r) >> 1; update(id << 1, l, mid, u, v, vt); update(id << 1 | 1, mid + 1, r, u, v, vt); } void dijk(int dist[], int st) { priority_queue<ii, vector<ii>, greater<ii>> pq; dist[pos[st]] = 0; pq.push({0, pos[st]}); while (!pq.empty()) { ii t = pq.top(); pq.pop(); if (dist[t.se] != t.fi) continue; for (auto v : a[t.se]) { if (dist[v.fi] > dist[t.se] + v.se) { dist[v.fi] = dist[t.se] + v.se; pq.push({dist[v.fi], v.fi}); } } } } signed main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); #define task "task" 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++) { int l, r; cin >> l >> r; update(1, 1, n, l, r, pos[i]); } for (int i = 1; i <= 4 * n; i++) { dist1[i] = distn[i] = dis[i] = inf; } dijk(dist1, 1); dijk(distn, n); priority_queue<ii, vector<ii>, greater<ii>> pq; for (int i = 1; i <= n; i++) { // cout << distn[pos[i]] << " "; dis[pos[i]] = dist1[pos[i]] + distn[pos[i]] - (i != 1 && i != n); pq.push({dis[pos[i]], pos[i]}); } while (!pq.empty()) { ii t = pq.top(); pq.pop(); if (dis[t.se] != t.fi) continue; for (auto v : a[t.se]) { if (dis[v.fi] > dis[t.se] + v.se) { dis[v.fi] = dis[t.se] + v.se; pq.push({dis[v.fi], v.fi}); } } } int q; cin >> q; while (q--) { int x; cin >> x; if (dis[pos[x]] == inf) { cout << -1 << '\n'; } else cout << dis[pos[x]] << '\n'; } cerr << endl << "TIME : " << clock() * 0.001 << "s" << endl; }

Compilation message (stderr)

passport.cpp: In function 'int main()':
passport.cpp:78:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   78 |         freopen(task ".inp", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
passport.cpp:79:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   79 |         freopen(task ".out", "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~
#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...