제출 #861115

#제출 시각아이디문제언어결과실행 시간메모리
861115MilosMilutinovicMatryoshka (JOI16_matryoshka)C++14
100 / 100
482 ms37436 KiB
/** * author: wxhtzdy * created: 19.08.2023 16:20:10 **/ #include <bits/stdc++.h> using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(0); int n, q; cin >> n >> q; vector<int> a(n), b(n); for (int i = 0; i < n; i++) { cin >> a[i] >> b[i]; } vector<int> x(q), y(q); for (int i = 0; i < q; i++) { cin >> x[i] >> y[i]; } vector<int> xs; vector<int> ys; for (int i = 0; i < n; i++) { xs.push_back(a[i]); ys.push_back(b[i]); } for (int i = 0; i < q; i++) { xs.push_back(x[i]); ys.push_back(y[i]); } sort(xs.begin(), xs.end()); sort(ys.begin(), ys.end()); xs.erase(unique(xs.begin(), xs.end()), xs.end()); ys.erase(unique(ys.begin(), ys.end()), ys.end()); for (int i = 0; i < n; i++) { a[i] = (int) (lower_bound(xs.begin(), xs.end(), a[i]) - xs.begin()); b[i] = (int) (lower_bound(ys.begin(), ys.end(), b[i]) - ys.begin()); } for (int i = 0; i < q; i++) { x[i] = (int) (lower_bound(xs.begin(), xs.end(), x[i]) - xs.begin()); y[i] = (int) (lower_bound(ys.begin(), ys.end(), y[i]) - ys.begin()); } vector<int> order(n); iota(order.begin(), order.end(), 0); sort(order.begin(), order.end(), [&](int i, int j) { if (a[i] == a[j]) { return b[i] < b[j]; } else { return a[i] > a[j]; } }); { vector<int> new_a(n); for (int i = 0; i < n; i++) { new_a[i] = a[order[i]]; } a = new_a; } { vector<int> new_b(n); for (int i = 0; i < n; i++) { new_b[i] = b[order[i]]; } b = new_b; } int sz = (int) ys.size(); vector<int> st(8 * sz); function<void(int, int, int, int, int, int)> Modify = [&](int x, int l, int r, int ll, int rr, int v) { if (l > r || l > rr || r < ll || ll > rr) { return; } if (ll <= l && r <= rr) { st[x] = max(st[x], v); return; } int mid = l + r >> 1; Modify(x * 2, l, mid, ll, rr, v); Modify(x * 2 + 1, mid + 1, r, ll, rr, v); }; function<int(int, int, int, int)> Query = [&](int x, int l, int r, int i) { if (l == r) { return st[x]; } int mid = l + r >> 1; if (i <= mid) { return max(Query(x * 2, l, mid, i), st[x]); } else { return max(Query(x * 2 + 1, mid + 1, r, i), st[x]); } }; vector<vector<int>> qs(n); for (int i = 0; i < q; i++) { int low = 0, high = n - 1, pos = 0; while (low <= high) { int mid = low + high >> 1; if (a[mid] >= x[i]) { pos = mid; low = mid + 1; } else { high = mid - 1; } } if (a[pos] >= x[i]) { qs[pos].push_back(i); } } vector<int> ans(q); for (int i = 0; i < n; i++) { Modify(1, 0, sz - 1, b[i], sz - 1, Query(1, 0, sz - 1, b[i]) + 1); for (int j : qs[i]) { ans[j] = Query(1, 0, sz - 1, y[j]); } } for (int i = 0; i < q; i++) { cout << ans[i] << '\n'; } return 0; }

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

matryoshka.cpp: In lambda function:
matryoshka.cpp:77:17: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   77 |     int mid = l + r >> 1;
      |               ~~^~~
matryoshka.cpp: In lambda function:
matryoshka.cpp:85:17: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   85 |     int mid = l + r >> 1;
      |               ~~^~~
matryoshka.cpp: In function 'int main()':
matryoshka.cpp:96:21: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   96 |       int mid = low + high >> 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...