제출 #1184806

#제출 시각아이디문제언어결과실행 시간메모리
1184806duyngadoctonTwo Antennas (JOI19_antennas)C++20
100 / 100
561 ms72684 KiB
#include<bits/stdc++.h> using namespace std; #define fi first #define se second #define ii pair<int,int> #define iii pair<ii,int> #define pb push_back #define eb emplace_back #define ll long long #define task "twoanttens" const int MAX = (int) 2e5; const ll inf = 1LL * 1e15; int n, q; struct attens { int h, a, b; } atten[MAX + 5]; struct segtreemax { struct node { ll hlazy, lz, a, b; } st[MAX * 4 + 5]; void init() { for(int i = 1; i <= 4 * n; ++i) st[i] = {-inf, -inf, -inf, -inf}; } void fix(int id, int l, int r) { st[id].hlazy = max(st[id].hlazy, st[id].lz); if(st[id].hlazy != -inf && st[id].a != -inf) st[id].b = max(st[id].b, st[id].a + st[id].hlazy); if(l != r) { st[id * 2].lz = max(st[id * 2].lz, st[id].hlazy); st[id * 2 + 1].lz = max(st[id * 2 + 1].lz, st[id].hlazy); } st[id].lz = st[id].hlazy = -inf; } void upd(int id, int l, int r, int p, ll x) { fix(id, l, r); if(l > p || r < p) return ; if(l == r) { st[id].a = x; st[id].hlazy = -inf; st[id].lz = -inf; fix(id, l, r); return; } int mid = l + r >> 1; upd(id * 2, l, mid, p, x); upd(id * 2 + 1, mid + 1, r, p, x); st[id].a = max(st[id * 2].a, st[id * 2 + 1].a); st[id].b = max(st[id * 2].b, st[id * 2 + 1].b); } void update(int id, int l, int r, int u, int v, ll x) { fix(id, l, r); if(l > v || r < u) return ; if(u <= l && r <= v) { st[id].lz = x; fix(id, l, r); return ; } int mid = l + r >> 1; update(id * 2, l, mid, u, v, x); update(id * 2 + 1, mid + 1, r, u, v, x); st[id].a = max(st[id * 2].a, st[id * 2 + 1].a); st[id].b = max(st[id * 2].b, st[id * 2 + 1].b); } ll get(int id, int l, int r, int u, int v) { fix(id, l, r); if(l > v || r < u) return -inf; if(u <= l && r <= v) return st[id].b; int mid = l + r >> 1; return max(get(id * 2, l, mid, u, v), get(id * 2 + 1, mid + 1, r, u, v)); } } st1; struct segtreemin { struct node { ll hlazy, lz, a, b; } st2[MAX * 4 + 5]; void init() { for(int i = 1; i <= 4 * n; ++i) st2[i] = {inf, inf, inf, inf}; } void fix(int id, int l, int r) { st2[id].hlazy = min(st2[id].hlazy, st2[id].lz); if(st2[id].hlazy != inf && st2[id].a != inf) st2[id].b = min(st2[id].b, st2[id].a + st2[id].hlazy); if(l != r) { st2[id * 2].lz = min(st2[id * 2].lz, st2[id].hlazy); st2[id * 2 + 1].lz = min(st2[id].hlazy, st2[id * 2 + 1].lz); } st2[id].lz = st2[id].hlazy = inf; } void upd(int id, int l, int r, int p, ll x) { fix(id, l, r); if(l > p || r < p) return ; if(l == r) { st2[id].a = x; st2[id].hlazy = inf; st2[id].lz = inf; fix(id, l, r); return; } int mid = l + r >> 1; upd(id * 2, l , mid, p, x); upd(id * 2 + 1, mid + 1, r, p, x); st2[id].a = min(st2[id * 2].a, st2[id * 2 + 1].a); st2[id].b = min(st2[id * 2].b, st2[id * 2 + 1].b); } void update(int id, int l, int r, int u, int v, ll x) { fix(id, l, r); if(l > v || r < u) return ; if(u <= l && r <= v) { st2[id].lz = x; fix(id, l, r); return ; } int mid = l + r >> 1; update(id * 2, l, mid, u, v, x); update(id * 2 + 1, mid + 1, r, u, v, x); st2[id].a = min(st2[id * 2].a, st2[id * 2 + 1].a); st2[id].b = min(st2[id * 2].b, st2[id * 2 + 1].b); } ll get(int id, int l, int r, int u, int v) { fix(id, l, r); if(l > v || r < u) return inf; if(u <= l && r <= v) return st2[id].b; int mid = l + r >> 1; return min(get(id * 2, l, mid, u, v), get(id * 2 + 1, mid + 1, r, u, v)); } } st2; vector<int> add[MAX + 5]; vector<int> del[MAX + 5]; ll kq[MAX + 5]; struct queries { int l, r, id; queries (int l = 0, int r = 0, int id = 0) : l(l), r(r), id(id) {} bool operator < (queries o) { return r < o.r; } } query[MAX + 5]; int main() { if(fopen(task".inp","r")) { freopen(task".inp","r",stdin); freopen(task".out","w",stdout); } ios::sync_with_stdio(0); cin.tie(NULL);cout.tie(NULL); cin >> n; for(int i = 1; i <= n; ++i) { int h, a, b; cin >> h >> a >> b; atten[i] = {h, a, b}; } cin >> q; for(int i = 1; i <= q; ++i) { int l, r; cin >> l >> r; query[i] = {l, r, i}; } sort(query + 1, query + q + 1); st1.init(); st2.init(); int j = 1; for(int i = 1; i <= n; ++i) { for(int x : add[i]) { st1.upd(1, 1, n, x, atten[x].h); st2.upd(1, 1, n, x, atten[x].h); } int r = max(0, i - atten[i].a), l = max(0, i - atten[i].b); st1.update(1, 1, n, l, r, -atten[i].h); st2.update(1, 1, n, l, r, -atten[i].h); while(j <= q && query[j].r == i) { int l = query[j].l, r = i; int id = query[j].id; ll val1 = st1.get(1, 1, n, l, r); ll val2 = st2.get(1, 1, n, l, r); kq[id] = max(val1, -val2); ++j; } int u = min(n + 1, i + atten[i].a); add[u].pb(i); u = min(n + 1, i + atten[i].b); del[u].pb(i); for(int x : del[i]) { st1.upd(1, 1, n, x, -inf); st2.upd(1, 1, n, x, inf); } } for(int i = 1; i <= q; ++i) if(kq[i] == -inf) cout << "-1\n"; else cout << kq[i] << "\n"; }

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

antennas.cpp: In function 'int main()':
antennas.cpp:158:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  158 |         freopen(task".inp","r",stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
antennas.cpp:159:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  159 |         freopen(task".out","w",stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...