제출 #1038144

#제출 시각아이디문제언어결과실행 시간메모리
1038144juicyRailway Trip 2 (JOI22_ho_t4)C++17
100 / 100
277 ms233556 KiB
#include <bits/stdc++.h> using namespace std; #ifdef LOCAL #include "debug.h" #else #define debug(...) 42 #endif const int N = 1e5 + 5, LG = 17; int n, k, m, q; int lg[N], a[2 * N], b[2 * N]; array<int, 2> spt[LG][LG][N], A[N]; vector<int> add[N], del[N]; array<int, 2> operator + (const array<int, 2> &a, const array<int, 2> &b) { return {min(a[0], b[0]), max(a[1], b[1])}; } array<int, 2> qry(int k, int l, int r) { int f = lg[r - l + 1]; return spt[k][f][l] + spt[k][f][r - (1 << f) + 1]; } void init(array<int, 2> spt[LG][N]) { for (int i = 1; i <= n; ++i) { spt[0][i] = A[i]; } for (int j = 1; j < LG; ++j) { for (int i = 1; i + (1 << j) - 1 <= n; ++i) { spt[j][i] = spt[j - 1][i] + spt[j - 1][i + (1 << j - 1)]; } } } bool cov(const array<int, 2> &seg, int p) { return seg[0] <= p && p <= seg[1]; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); cin >> n >> k >> m; for (int i = 2; i <= n; ++i) { lg[i] = lg[i / 2] + 1; } for (int i = 1; i <= m; ++i) { cin >> a[i] >> b[i]; if (a[i] < b[i]) { int r = min(a[i] + k - 1, b[i] - 1); add[r].push_back(b[i]); del[a[i]].push_back(b[i]); } } multiset<int> st; for (int i = n; i > 0; --i) { for (int x : add[i]) { st.insert(x); } A[i][1] = st.size() ? *st.rbegin() : i; for (int x : del[i]) { st.erase(st.find(x)); } } for (int i = 1; i <= n; ++i) { add[i].clear(); del[i].clear(); } for (int i = 1; i <= m; ++i) { if (a[i] > b[i]) { int l = max(a[i] - k + 1, b[i] + 1); add[l].push_back(b[i]); del[a[i]].push_back(b[i]); } } for (int i = 1; i <= n; ++i) { for (int x : add[i]) { st.insert(x); } A[i][0] = st.size() ? *st.begin() : i; for (int x : del[i]) { st.erase(st.find(x)); } } init(spt[0]); for (int j = 1; j < LG; ++j) { for (int i = 1; i <= n; ++i) { A[i] = qry(j - 1, A[i][0], A[i][1]); } init(spt[j]); } cin >> q; while (q--) { int s, t; cin >> s >> t; array<int, 2> a{s, s}; int res = 0; for (int j = LG - 1; ~j; --j) { auto x = qry(j, a[0], a[1]); if (!cov(x, t)) { a = x; res += 1 << j; } } a = qry(0, a[0], a[1]); cout << (cov(a, t) ? res + 1 : -1) << "\n"; } return 0; }

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

Main.cpp: In function 'void init(std::array<int, 2> (*)[100005])':
Main.cpp:33:58: warning: suggest parentheses around '-' inside '<<' [-Wparentheses]
   33 |       spt[j][i] = spt[j - 1][i] + spt[j - 1][i + (1 << j - 1)];
      |                                                        ~~^~~
#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...