제출 #648450

#제출 시각아이디문제언어결과실행 시간메모리
648450406함박 스테이크 (JOI20_hamburg)C++17
21 / 100
3023 ms32024 KiB
#include <bits/stdc++.h> using namespace std; #pragma GCC optimize("O3,unroll-loops") #pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt") const int N = 2e5 + 50; const int M = 2 * N + 5; int l[N], r[N], u[N], d[N], n, k; bitset<N> used, full; vector<pair<int, int>> points; vector<int> X, Y, cl[M], op[M]; int cnt; void rec(); inline bool inter(int i, int x, int y) { return l[i] <= x && x <= r[i] && d[i] <= y && y <= u[i]; } inline void add_point(int x, int y) { vector<int> change; for (int i = used._Find_first(); i < n; i = used._Find_next(i)) { if (inter(i, x, y)) { cnt--; used[i] = false; change.push_back(i); } } if (change.empty()) return; points.emplace_back(x, y); rec(); for (auto cc: change) used[cc] = true, cnt++; points.pop_back(); } void rec() { if (!cnt && points.size() <= k) { for (int i = 0; i < (int) points.size(); i++) cout << X[points[i].first] << ' ' << Y[points[i].second] << '\n'; for (int i = points.size(); i < k; i++) cout << 1 << ' ' << 1 << '\n'; exit(0); } if (points.size() >= k) return; int minR = 2 * n; int minU = 2 * n; int maxD = 0; int maxL = 0; for (int i = used._Find_first(); i < n; i = used._Find_next(i)) { minR = min(minR, r[i]); maxL = max(maxL, l[i]); minU = min(minU, u[i]); maxD = max(maxD, d[i]); } if (maxL <= minR || maxD <= minU) { add_point(minR, minU); } else { add_point(minR, minU); add_point(minR, maxD); add_point(maxL, minU); add_point(maxL, maxD); if (points.size()) return; int mxD = 0; int mnU = 2 * n; for (int i = 0; i < n; i++) if (l[i] <= minR) { mxD = max(mxD, d[i]); mnU = min(mnU, u[i]); } add_point(minR, mxD); add_point(minR, mnU); mxD = 0; mnU = 2 * n; for (int i = 0; i < n; i++) if (r[i] >= maxL) { mxD = max(mxD, d[i]); mnU = min(mnU, u[i]); } add_point(maxL, mxD); add_point(maxL, mnU); int mxL = 0; int mnR = 2 * n; for (int i = 0; i < n; i++) if (u[i] >= maxD) { mxL = max(mxL, l[i]); mnR = min(mnR, r[i]); } add_point(mxL, maxD); add_point(mnR, maxD); mxL = 0; mnR = 2 * n; for (int i = 0; i < n; i++) if (d[i] <= minU) { mxL = max(mxL, l[i]); mnR = min(mnR, r[i]); } add_point(mxL, minU); add_point(mnR, minU); for (int i = 0; i < n; i++) if (l[i] <= minR) op[d[i]].push_back(i), cl[u[i]].push_back(i); for (int h = 0; h < Y.size(); h++) { for (auto u: op[h]) { used[u] = false; cnt--; } if (cl[h].size()) { points.emplace_back(minR, h); rec(); points.pop_back(); } for (auto v: cl[h]) { used[v] = true; cnt++; } } } } signed main() { ios::sync_with_stdio(0); cin.tie(0); cin >> n >> k; X.reserve(2 * n), Y.reserve(2 * n); for (int i = 0; i < n; i++) { cin >> l[i] >> d[i] >> r[i] >> u[i]; X.push_back(l[i]); X.push_back(r[i]); Y.push_back(d[i]); Y.push_back(u[i]); } sort(X.begin(), X.end()); X.resize(unique(X.begin(), X.end()) - X.begin()); sort(Y.begin(), Y.end()); Y.resize(unique(Y.begin(), Y.end()) - Y.begin()); for (int i = 0; i < n; i++) { l[i] = lower_bound(X.begin(), X.end(), l[i]) - X.begin(); r[i] = lower_bound(X.begin(), X.end(), r[i]) - X.begin(); u[i] = lower_bound(Y.begin(), Y.end(), u[i]) - Y.begin(); d[i] = lower_bound(Y.begin(), Y.end(), d[i]) - Y.begin(); } for (int i = 0; i < n; i++) used[i] = true; cnt = n; rec(); cout << "NO I DID NOT FIND ANYTHING\n"; return 0; }

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

hamburg.cpp: In function 'void rec()':
hamburg.cpp:42:35: warning: comparison of integer expressions of different signedness: 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   42 |         if (!cnt && points.size() <= k) {
      |                     ~~~~~~~~~~~~~~^~~~
hamburg.cpp:49:27: warning: comparison of integer expressions of different signedness: 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   49 |         if (points.size() >= k)
      |             ~~~~~~~~~~~~~~^~~~
hamburg.cpp:117:35: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  117 |                 for (int h = 0; h < Y.size(); h++) {
      |                                 ~~^~~~~~~~~~
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...