Submission #757730

#TimeUsernameProblemLanguageResultExecution timeMemory
757730happypotatoPassport (JOI23_passport)C++17
46 / 100
125 ms57272 KiB
#include <bits/stdc++.h> using namespace std; #define int long long #define pii pair<int, int> #define ff first #define ss second #define pb push_back // global const int mxN = 2e5 + 1; pii range[mxN]; int ans[mxN]; int n; void init() { // init for (int i = 1; i < mxN; i++) ans[i] = -1; } void st5() { } void st4() { } int st3dp[2501][2501]; int st3(int &tar) { if (range[tar].ff == 1 && range[tar].ss == n) { return 1; } for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { st3dp[i][j] = 1e9; } } queue<pii> q; q.push({tar, tar}); st3dp[tar][tar] = 1; int nl, nr; while (!q.empty()) { pii cur = q.front(); q.pop(); for (int i = range[cur.ff].ff; i < cur.ff; i++) { if (range[cur.ff].ff <= range[i].ff && range[i].ss <= range[cur.ss].ss) continue; nl = (range[cur.ff].ff <= range[i].ff ? cur.ff : i); nr = (range[i].ss <= range[cur.ss].ss ? cur.ss : i); if (st3dp[nl][nr] > st3dp[cur.ff][cur.ss] + 1) { st3dp[nl][nr] = st3dp[cur.ff][cur.ss] + 1; if (range[nl].ff == 1 && range[nr].ss == n) { return st3dp[nl][nr]; } q.push({nl, nr}); } } for (int i = cur.ss + 1; i <= range[cur.ss].ss; i++) { if (range[cur.ff].ff <= range[i].ff && range[i].ss <= range[cur.ss].ss) continue; nl = (range[cur.ff].ff <= range[i].ff ? cur.ff : i); nr = (range[i].ss <= range[cur.ss].ss ? cur.ss : i); if (st3dp[nl][nr] > st3dp[cur.ff][cur.ss] + 1) { st3dp[nl][nr] = st3dp[cur.ff][cur.ss] + 1; if (range[nl].ff == 1 && range[nr].ss == n) { return st3dp[nl][nr]; } q.push({nl, nr}); } } } return -1; } int st2dp[301][301]; void st2recur(int l, int r, int val) { st2dp[l][r] = val; int nl, nr; for (int i = l; i <= r; i++) { nl = min(l, range[i].ff); nr = max(r, range[i].ss); if (st2dp[nl][nr] > val + 1) { st2recur(nl, nr, val + 1); } } } int st2(int &tar) { for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { st2dp[i][j] = 1e9; } } st2recur(range[tar].ff, range[tar].ss, 1); return (st2dp[1][n] == 1e9 ? -1 : st2dp[1][n]); } int st1() { int ans = 1; int cur = range[1].ss; int ptr = 1; while (cur < n) { int maxi = cur; while (ptr <= cur) { maxi = max(maxi, range[ptr].ss); ptr++; } if (maxi == cur) return -1; ans++; cur = maxi; } return ans; } void solve() { // solve cin >> n; for (int i = 1; i <= n; i++) { cin >> range[i].ff >> range[i].ss; } int q; cin >> q; if (q == 1) { int cur; cin >> cur; if (cur == 1) { cout << st1() << endl; } else if (n <= 300) { cout << st2(cur) << endl; } else if (n <= 2500) { cout << st3(cur) << endl; } else { st5(); cout << ans[cur] << endl; } return; } if (n <= 2500) { st4(); } else { st5(); } while (q--) { int x; cin >> x; cout << ans[x] << endl; } } int32_t main() { ios::sync_with_stdio(0); cin.tie(0); init(); solve(); }
#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...