제출 #1323553

#제출 시각아이디문제언어결과실행 시간메모리
1323553limitiymEvent Hopping (BOI22_events)C++20
100 / 100
511 ms59840 KiB
#include <iostream> #include <vector> #include <algorithm> #include <cmath> #include <map> #include <set> #include <numeric> #include <deque> #include <random> #include <unordered_map> #include <unordered_set> #include <queue> #include <stack> #include <string> #include <iomanip> #include <fstream> #include <bitset> #include <ctime> #include <cstdio> #include <chrono> #include <functional> #include <x86intrin.h> #include <cassert> #include <list> #include <iterator> #include <ext/pb_ds/assoc_container.hpp> using namespace __gnu_pbds; using namespace std; #define int long long #ifdef LOCAL bool local = true; #else bool local = false; #endif /*<-------DEFINES START------->*/ #define all(x) x.begin(), x.end() #define rall(x) x.rbegin(), x.rend() #define for1(n) for (int i = 1; i < n; ++i) #define for0(n) for (int i = 0; i < n; ++i) #define rep(i, j, n) for (int i = (j); i < (n); ++i) #define rrep(i, j, n) for (int i = (j); i >= (n); --i) #define debug(fmt, ...) \ fprintf(stderr, "[%d] " fmt "\n", LINE, ##__VA_ARGS__) #define lb lower_bound #define ub upper_bound #define rsun(a) a.resize(unique(a.begin(), a.end())-a.begin()) #define re return #define con continue #define pb push_back #define pob pop_back; #define sz(x) (int)size(x) #define fi first #define se second using ll = long long; using ull = unsigned long long; using ld = long double; using vi = vector<int>; using vll = vector<long long>; using pii = pair<int, int>; using pll = pair<long long, long long>; using vvi = vector<vector<int>>; using vvvi = vector<vector<vector<int>>>; using vvll = vector<vector<long long>>; using vpii = vector<pair<long long, long long>>; using vvpii = vector<vpii>; using tiii = tuple<int, int, int>; /*<-------DEFINES END------->*/ /*<-------TEMPLATES START------->*/ template<typename T> istream& operator>>(istream& in, vector<T>& a) { for (T& i : a) in >> i; return in; } template<typename T1, typename T2> istream& operator>>(istream& in, pair<T1, T2>& a) { in >> a.fi >> a.se; return in; } template<typename T1, typename T2> ostream& operator<<(ostream& out, pair<T1, T2>& a) { out << a.fi << " " << a.se; return out; } template<typename T1, typename T2> istream& operator>>(istream& in, vector<pair<T1, T2>>& a) { for (pair<T1, T2>& i : a) in >> i.fi >> i.se; return in; } template<typename T> ostream& operator<<(ostream& out, const vector<T>& a) { for (auto i : a) { out << i << " "; } return out; } template<typename T1, typename T2> ostream& operator<<(ostream& out, vector<pair<T1, T2>>& a) { for (pair<T1, T2> i : a) out << i.fi << " " << i.se << endl; return out; } template<typename T1> ostream& operator<<(ostream& out, vector<vector<T1>>& a) { for (vector<T1> i : a) { for (T1 j : i) out << j << " "; out << endl; } return out; } template<typename T1, typename T2> inline T1 min(T1 a, T2 b) { b = (T1)b; return a > b ? b : a; } template<typename T1, typename T2> inline T1 max(T1 a, T2 b) { b = (T1)b; return a > b ? a : b; } template<typename T1, typename T2> inline void amin(T1& a, T2 b) { a = min(a, b); } template<typename T1, typename T2> inline void amax(T1& a, T2 b) { a = max(a, b); } /*<-------TEMPLATES END------->*/ double getTime() { return clock() / (double)CLOCKS_PER_SEC; } int randint(int start, int end) { return rand() % (end - start + 1) + start; } ll gcd(ll a, ll b) { if (a == 0) { return b; } return gcd(b % a, a); } ll gcd(ll a, ll b, ll& x, ll& y) { if (a == 0) { x = 0; y = 1; return b; } ll x1, y1, g = gcd(b % a, a, x1, y1); // (b % a) * x1 + a * y1 = g // a * x + b * y = g x = y1 - (b / a * x1); y = x1; return g; } ll bin_pow(ll a, ll b, ll MOD) { if (b == 0) { return 1 % MOD; } if (b % 2 == 0) { ll p = bin_pow(a, b / 2, MOD) % MOD; return p * p % MOD; } return a * bin_pow(a, b - 1, MOD) % MOD; } string run_num; void solve(int t); signed main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); if (local) { freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout); } // cin >> run_num; int tt = 1; // cin >> tt; rep(i, 1, tt + 1) { if (local) { cout << "Case #" << i << ":\n"; } solve(i); } if (local) { cout << "\n"; cout << fixed << "Time = " << getTime() << " ms\n"; } return 0; } /*<-------ACTUAL CODE STARTS HERE------->*/ #pragma GCC optimize("unroll-loops,Ofast") const int INF = 2e18, MOD = 1e9 + 7; const int N = 1e4 + 1000; struct ST { vpii t; void init(int n) { t.assign(4 * (n + 100), {INF, INF}); } void build(int v, int tl, int tr, vi& a) { if (tl + 1 == tr) { t[v] = {a[tl], tl}; re; } int tm = (tl + tr) / 2; build(2 * v + 1, tl, tm, a); build(2 * v + 2, tm, tr, a); t[v] = min(t[2 * v + 1], t[2 * v + 2]); } pii get(int v, int tl, int tr, int l, int r) { if (r <= tl || tr <= l) re {INF, INF}; if (l <= tl && tr <= r) re t[v]; int tm = (tl + tr) / 2; pii left = get(2 * v + 1, tl, tm, l, r), right = get(2 * v + 2, tm, tr, l, r); re min(left, right); } }; vpii vec; vvi gr; vvi bin_ups; void dfs(int u, int p) { bin_ups[0][u] = p; rep(i, 1, 20) { bin_ups[i][u] = bin_ups[i - 1][bin_ups[i - 1][u]]; } for (int v : gr[u]) { if (v != p) { dfs(v, u); } } } pii la(int u, int left, int right) { int cnt = 0; rrep(i, 19, 0) { auto [l1, r1] = vec[bin_ups[i][u]]; if (l1 > right) { cnt += 1ll << i; u = bin_ups[i][u]; } } re {u, cnt}; } void solve(int test) { int n, q; cin >> n >> q; vec.resize(n); cin >> vec; map<pii, int> mp; map<int, int> mp2; vi cords; for (auto [l, r] : vec) cords.pb(l), cords.pb(r); sort(all(cords)); rsun(cords); for (auto& [l, r] : vec) { int x = lb(all(cords), l) - cords.begin(); int y = lb(all(cords), r) - cords.begin(); mp2[x] = l; mp2[y] = r; l = lb(all(cords), l) - cords.begin(); r = lb(all(cords), r) - cords.begin(); } rep(i, 0, n) { mp[vec[i]] = i; } vi right(2 * n + 10, INF); for (auto [l, r] : vec) { amin(right[r], l); } ST t; t.init(2 * n + 10); t.build(0, 0, 2 * n + 10, right); gr.resize(n); vi roots; rep(i, 0, n) { auto [l, r] = vec[i]; auto [l1, r1] = t.get(0, 0, 2 * n + 10, l, r + 1); if (l1 != l) { // cout << i << " " << mp[{l1, r1}] << "!!!!\n"; gr[i].pb(mp[{l1, r1}]); gr[mp[{l1, r1}]].pb(i); } else { roots.pb(i); } } bin_ups.assign(20, vi(n + 1)); for (int u : roots) { dfs(u, u); } rep(i, 0, q) { int u, v; cin >> u >> v; u--, v--; if (u == v) { cout << 0 << "\n"; con; } auto [l, r] = vec[u]; auto [l3, r3] = vec[v]; if (r > r3) { cout << "impossible\n"; con; } auto [vrtx, cnt] = la(v, l, r); auto [l1, r1] = vec[vrtx]; if (l1 <= r && r <= r1) { cout << cnt + 1 << "\n"; con; } auto [l2, r2] = vec[bin_ups[0][vrtx]]; // cout << mp2[l1] << " " << mp2[r1] << " " << mp2[l2] << " " << mp2[r2] << "!!!!!\n"; if (r >= l2) { cout << cnt + 2 << "\n"; } else { cout << "impossible\n"; } } }

컴파일 시 표준 에러 (stderr) 메시지

events.cpp: In function 'int main()':
events.cpp:192:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  192 |         freopen("input.txt", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
events.cpp:193:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  193 |         freopen("output.txt", "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...
#Verdict Execution timeMemoryGrader output
Fetching results...