제출 #234801

#제출 시각아이디문제언어결과실행 시간메모리
234801AlexLuchianovTwo Antennas (JOI19_antennas)C++14
22 / 100
607 ms30264 KiB
#include <iostream> #include <vector> #include <algorithm> using namespace std; using ll = long long; #define MIN(a, b) (((a) < (b)) ? (a) : (b)) #define MAX(a, b) (((a) < (b)) ? (b) : (a)) int const nmax = 200000; int const inf = 1000000005; struct El{ int h; int a; int b; } v[1 + nmax]; int _queries[1 + nmax][2]; int sol[1 + nmax]; vector<int> events[1 + nmax]; vector<pair<int,int>> queries[1 + nmax]; class SegmentTree{ private: struct Node{ int result; int smax; Node operator + (Node const &a) const { return {max(result, a.result), max(smax, a.smax)}; } }; public: vector<Node> aint; vector<int> lazy; SegmentTree(int n){ aint.resize(1 + 4 * n); lazy.resize(1 + 4 * n); } void build(int node, int from, int to){ if(from < to){ int mid = (from + to) / 2; build(node * 2, from, mid); build(node * 2 + 1, mid + 1, to); } aint[node] = {-inf, -inf}; } void cleannode(int node, int from, int to){ if(from < to){ int mid = (from + to) / 2; lazy[node * 2] = max(lazy[node * 2], lazy[node]); lazy[node * 2 + 1] = max(lazy[node * 2 + 1], lazy[node]); } aint[node].result = max(aint[node].result, aint[node].smax + lazy[node]); lazy[node] = 0; } void computenode(int node, int from, int to){ if(from < to){ int mid = (from + to) / 2; aint[node] = aint[node * 2] + aint[node * 2 + 1]; } } void update(int node, int from, int to, int x, int y, int val){ if(x == from && to == y){ lazy[node] = max(lazy[node], val); cleannode(node, from, to); } else { int mid = (from + to) / 2; cleannode(node * 2, from, mid); cleannode(node * 2 + 1, mid + 1, to); if(x <= mid) update(node * 2, from, mid, x, MIN(y, mid), val); if(mid + 1 <= y) update(node * 2 + 1, mid + 1, to, MAX(mid + 1, x), y, val); computenode(node, from, to); } } void setvalue(int node, int from, int to, int x, int val){ if(from < to){ int mid = (from + to) / 2; cleannode(node * 2, from, mid); cleannode(node * 2 + 1, mid + 1, to); if(x <= mid) setvalue(node * 2, from, mid, x, val); else setvalue(node * 2 + 1, mid + 1, to, x, val); computenode(node, from, to); } else { cleannode(node, from, to); aint[node].smax = val; } } int query(int node, int from, int to, int x, int y){ cleannode(node, from, to); if(from == x && to == y) return aint[node].result; else { int mid = (from + to) / 2; if(x <= mid && y <= mid) return query(node * 2, from, mid, x, y); else if(mid + 1 <= x && mid + 1 <= y) return query(node * 2 + 1, mid + 1, to, x, y); else return max(query(node * 2, from, mid, x, mid), query(node * 2 + 1, mid + 1, to, mid + 1, y)); } } }; void solve(int n, int q){ for(int i = 1;i <= n; i++) { events[i].clear(); queries[i].clear(); } for(int i = 1; i <= n; i++) { if(i + v[i].a <= n) events[i + v[i].a].push_back(i); if(i + v[i].b + 1 <= n) events[i + v[i].b + 1].push_back(-i); } for(int i = 1; i <= q; i++) queries[_queries[i][1]].push_back({_queries[i][0], i}); SegmentTree aint(1 + n); for(int i = 1; i <= n; i++) aint.setvalue(1, 1, n, i, -inf); for(int i = 1; i <= n; i++){ for(int h = 0; h < events[i].size(); h++){ int id = events[i][h]; if(0 < id) aint.setvalue(1, 1, n, id, -v[id].h); else aint.setvalue(1, 1, n, -id, -inf); } int x = max(1, i - v[i].b); int y = i - v[i].a; if(x <= y) aint.update(1, 1, n, x, y, v[i].h); for(int h = 0; h < queries[i].size(); h++){ int pos = queries[i][h].second; sol[pos] = max(sol[pos], aint.query(1, 1, n, queries[i][h].first, i)); } } } int oth(int n, int pos){ return n - pos + 1; } int main() { ios::sync_with_stdio(0); cin.tie(0); int n; cin >> n; for(int i = 1;i <= n; i++) cin >> v[i].h >> v[i].a >> v[i].b; int q; cin >> q; for(int i = 1;i <= q; i++) cin >> _queries[i][0] >> _queries[i][1]; for(int i = 1;i <= q; i++) sol[i] = -1; solve(n, q); for(int i = 1;i <= n; i++) if(i < oth(n, i)) swap(v[i], v[oth(n, i)]); for(int i = 1;i <= q; i++) { _queries[i][0] = oth(n, _queries[i][0]); _queries[i][1] = oth(n, _queries[i][1]); swap(_queries[i][0], _queries[i][1]); } solve(n, q); for(int i = 1;i <= q; i++) cout << sol[i] << '\n'; return 0; } /* 111 2342163 25 76 738276997 50 52 1669890 26 40 14902411 56 81 899007094 32 85 422634516 2 71 936109680 79 100 638713463 109 110 119468142 28 104 713258492 104 107 267306336 1 39 973810399 87 90 835929417 43 86 335127775 12 104 840490095 39 66 459253103 11 104 706538155 4 101 194912428 82 96 949222000 73 96 910118043 85 95 226986709 46 100 827920993 75 83 768390729 46 87 314695927 26 30 230872586 49 82 995156805 60 93 497044719 3 103 827805975 75 83 499889872 95 110 590726845 66 73 607078123 59 99 370425117 26 76 490217622 18 32 431150446 77 89 9267221 13 81 693001694 64 95 866349101 26 93 844742196 6 63 655634427 33 88 829473857 67 92 311419714 15 56 900123935 42 87 665050273 42 59 792230034 12 34 847490718 11 21 177697704 66 81 198679758 24 54 668213379 14 45 45659509 82 91 327099919 21 82 118001173 81 85 738608951 80 101 214209461 38 97 324473845 107 109 879267283 109 109 190386778 43 77 881527758 25 44 18672166 13 21 733749641 73 92 653264399 103 110 870234612 104 106 101340654 33 40 710067113 71 104 616465791 8 14 610725519 6 58 376168562 89 109 93289534 79 107 973278654 55 85 183001646 37 50 70495079 47 89 383449644 76 77 239592436 26 49 561740304 21 27 326305893 94 101 376448990 28 85 558483855 107 110 58797040 8 97 479096372 76 90 435216279 42 87 583841698 92 106 277031377 63 110 56594141 34 38 381128173 40 95 275114013 110 110 716940824 48 85 805968236 44 55 997032121 87 92 958531100 90 104 459788004 39 85 618435405 34 97 833464071 87 99 527989265 92 92 708140049 65 87 707609457 2 78 937680650 71 105 969561745 81 102 960172678 49 65 56883909 7 40 602118268 53 69 980631740 95 101 795277058 19 26 572270576 13 89 440358047 25 79 467566899 16 24 634175510 30 38 673050101 21 60 768461341 54 107 331110483 58 87 218341925 68 77 419836470 30 77 925521790 29 36 1 4 98 */

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

antennas.cpp: In member function 'void SegmentTree::cleannode(int, int, int)':
antennas.cpp:54:11: warning: unused variable 'mid' [-Wunused-variable]
       int mid = (from + to) / 2;
           ^~~
antennas.cpp: In member function 'void SegmentTree::computenode(int, int, int)':
antennas.cpp:64:11: warning: unused variable 'mid' [-Wunused-variable]
       int mid = (from + to) / 2;
           ^~~
antennas.cpp: In function 'void solve(int, int)':
antennas.cpp:138:22: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int h = 0; h < events[i].size(); h++){
                    ~~^~~~~~~~~~~~~~~~~~
antennas.cpp:152:22: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int h = 0; h < queries[i].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...