제출 #551189

#제출 시각아이디문제언어결과실행 시간메모리
551189wenqiTwo Antennas (JOI19_antennas)C++17
100 / 100
616 ms43084 KiB
// trans rights #include <bits/extc++.h> using namespace std; using ll = long long; using ull = unsigned long long; #ifdef DEBUG #define D(...) fprintf(stderr, __VA_ARGS__) #else #define D(...) #endif int N, Q; int H[200069], A[200069], B[200069], answer[200069]; constexpr int NUKE = 1012345678; struct Node { int l, r; Node *lc, *rc; int um_mn, um_mx; int t_mn, t_mx, per; Node(int l, int r) : l(l), r(r), lc(0), rc(0), um_mn(NUKE), um_mx(-NUKE), t_mn(NUKE), t_mx(-NUKE), per(-NUKE) { if (l != r) { int m = l + (r - l) / 2; lc = new Node(l, m); rc = new Node(m + 1, r); } } void clean() { per = max(per, max(t_mx - um_mn, um_mx - t_mn)); if (lc) { lc->t_mn = min(lc->t_mn, t_mn); rc->t_mn = min(rc->t_mn, t_mn); lc->t_mx = max(lc->t_mx, t_mx); rc->t_mx = max(rc->t_mx, t_mx); } t_mn = NUKE; t_mx = -NUKE; } void unmask(int p, int x) { clean(); if (l == r) { um_mn = um_mx = x; clean(); return; } if (p <= lc->r) lc->unmask(p, x); else rc->unmask(p, x); um_mn = min(lc->um_mn, rc->um_mn); um_mx = max(lc->um_mx, rc->um_mx); } void mask(int p) { clean(); if (l == r) { um_mn = NUKE; um_mx = -NUKE; return; } if (p <= lc->r) lc->mask(p); else rc->mask(p); um_mn = min(lc->um_mn, rc->um_mn); um_mx = max(lc->um_mx, rc->um_mx); } void update(int ql, int qr, int x) { clean(); if (qr < l or ql > r) return; if (ql <= l and qr >= r) { t_mn = t_mx = x; clean(); return; } lc->update(ql, qr, x); rc->update(ql, qr, x); per = max(per, max(lc->per, rc->per)); } int query(int ql, int qr) { clean(); if (qr < l or ql > r) return -NUKE; if (ql <= l and qr >= r) return per; return max(lc->query(ql, qr), rc->query(ql, qr)); } }; int main(int argc, const char *argv[]) { scanf("%d", &N); vector<pair<int, int>> events; vector<tuple<int, int, int>> queries; for (int i = 1; i <= N; i++) { int h, a, b; scanf("%d%d%d", &h, &a, &b); H[i] = h, A[i] = a, B[i] = b; events.push_back({i + A[i], i}); events.push_back({i + B[i] + 1, i}); } scanf("%d", &Q); for (int k = 0; k < Q; k++) { int l, r; scanf("%d%d", &l, &r); queries.push_back({r, l, k}); } sort(events.begin(), events.end()); sort(queries.begin(), queries.end()); int next_event = 0; int next_rock = 0; Node *root = new Node(1, N); for (auto &q : queries) { auto [r, l, qid] = q; while (next_rock <= r) { while (next_event < events.size() and events[next_event].first <= next_rock) { auto [p, i] = events[next_event]; D("e: %d %d\n", i, p); if (i + B[i] + 1 == p) { root->mask(i); }else{ root->unmask(i, H[i]); } next_event++; } int a = next_rock - B[next_rock]; int b = next_rock - A[next_rock]; D("u: %d %d %d\n", next_rock, a, b); root->update(a, b, H[next_rock]); next_rock++; } D("------\n"); answer[qid] = root->query(l, r); if (answer[qid] < 0) answer[qid] = -1; } for (int qid = 0; qid < Q; qid++) printf("%d\n", answer[qid]); return 0; }

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

antennas.cpp: In function 'int main(int, const char**)':
antennas.cpp:138:31: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  138 |             while (next_event < events.size() and events[next_event].first <= next_rock)
      |                    ~~~~~~~~~~~^~~~~~~~~~~~~~~
antennas.cpp:108:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  108 |     scanf("%d", &N);
      |     ~~~~~^~~~~~~~~~
antennas.cpp:114:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  114 |         scanf("%d%d%d", &h, &a, &b);
      |         ~~~~~^~~~~~~~~~~~~~~~~~~~~~
antennas.cpp:120:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  120 |     scanf("%d", &Q);
      |     ~~~~~^~~~~~~~~~
antennas.cpp:124:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  124 |         scanf("%d%d", &l, &r);
      |         ~~~~~^~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...