제출 #44492

#제출 시각아이디문제언어결과실행 시간메모리
44492choikiwonArranging Tickets (JOI17_arranging_tickets)C++17
0 / 100
2 ms412 KiB
#include<bits/stdc++.h> using namespace std; typedef long long ll; int N, M; struct Info { int a, b, c, id; bool operator <(const Info &i) const { return id < i.id; } }; set<Info> st; ll arr[200010]; struct X { ll val; int l, r; bool operator <(const X &i) const { return val > i.val; } }; struct node { ll mx1, mx2, mx3; int l1, r1, l2, r2; }; node mrg(node &a, node &b) { node ret; vector<X> tmp, res; tmp.push_back({ a.mx1, a.l1, a.r1 }); tmp.push_back({ a.mx2, a.l2, a.r2 }); tmp.push_back({ a.mx3, -1, -1 }); tmp.push_back({ b.mx1, b.l1, b.r1 }); tmp.push_back({ b.mx2, b.l2, b.r2 }); tmp.push_back({ b.mx3, -1, -1 }); sort(tmp.begin(), tmp.end()); int s = 0; for(int i = 0; i < tmp.size(); i++) { if(i == (int)tmp.size() - 1 || tmp[i].val != tmp[i + 1].val) { int l = tmp[s].l; int r = tmp[s].r; for(int j = s; j <= i; j++) { l = min(l, tmp[j].l); r = max(r, tmp[j].r); } res.push_back({ tmp[s].val, l, r }); s = i + 1; } } ret.mx1 = res[0].val; ret.l1 = res[0].l; ret.r1 = res[0].r; ret.mx2 = res[1].val; ret.l2 = res[1].l; ret.r2 = res[1].r; ret.mx3 = res[2].val; return ret; } struct BIT { vector<node> tree; vector<ll> lazy; void init() { tree = vector<node>(4 * N); lazy = vector<ll>(4 * N, 0); build(0, N - 1, 1); } void build(int l, int r, int n) { if(l == r) { tree[n] = {arr[l], (ll)-1e18, (ll)-1e18 - 2, l, l, l, l}; return; } int m = (l + r)>>1; build(l, m, 2*n); build(m + 1, r, 2*n + 1); tree[n] = mrg(tree[2*n], tree[2*n + 1]); } void prop(int l, int r, int n) { if(l != r) { tree[2*n].mx1 += lazy[n]; tree[2*n].mx2 += lazy[n]; tree[2*n].mx3 += lazy[n]; lazy[2*n] += lazy[n]; tree[2*n + 1].mx1 += lazy[n]; tree[2*n + 1].mx2 += lazy[n]; tree[2*n + 1].mx3 += lazy[n]; lazy[2*n + 1] += lazy[n]; lazy[n] = 0; } } void upd(int a, int b, ll d, int l, int r, int n) { if(b < l || r < a) return; if(a <= l && r <= b) { tree[n].mx1 += d; tree[n].mx2 += d; tree[n].mx3 += d; lazy[n] += d; return; } prop(l, r, n); int m = (l + r)>>1; upd(a, b, d, l, m, 2*n); upd(a, b, d, m + 1, r, 2*n + 1); tree[n] = mrg(tree[2*n], tree[2*n + 1]); } } bit; int main() { scanf("%d %d", &N, &M); for(int i = 0; i < M; i++) { int a, b, c; scanf("%d %d %d", &a, &b, &c); a--; b--; if(a > b) swap(a, b); arr[a] += c; arr[b] -= c; st.insert({ a, b, c, i }); } ll ans = arr[0]; for(int i = 1; i < N; i++) { arr[i] += arr[i - 1]; ans = max(ans, arr[i]); } bit.init(); while(1) { node t = bit.tree[1]; int l = (t.mx1 - t.mx2 <= 1)? min(t.l1, t.l2) : t.l1; int r = (t.mx1 - t.mx2 <= 1)? max(t.r1, t.r2) : t.r1; set<Info>::iterator it; while(st.size()) { it = st.begin(); if(!(it->a <= l && r < it->b)) { st.erase(it); } else break; } if(!st.size()) break; Info tmp = *it; st.erase(st.find(tmp)); if(t.mx1 - t.mx2 > 1) { if(t.mx1 - t.mx2 - 1 <= 2 * tmp.c) { bit.upd(tmp.a, tmp.b - 1, -((t.mx1 - t.mx2) / 2) * 2, 0, N - 1, 1); tmp.c -= (t.mx1 - t.mx2) / 2; ans -= (t.mx1 - t.mx2) / 2; st.insert(tmp); } else { bit.upd(tmp.a, tmp.b - 1, -tmp.c * 2, 0, N - 1, 1); ans -= tmp.c; } } else { if(t.mx1 - t.mx3 - 1 <= 2 * tmp.c) { bit.upd(tmp.a, tmp.b - 1, -((t.mx1 - t.mx3) / 2) * 2, 0, N - 1, 1); tmp.c -= (t.mx1 - t.mx3) / 2; ans -= (t.mx1 - t.mx3) / 2; st.insert(tmp); } else { bit.upd(tmp.a, tmp.b - 1, -tmp.c * 2, 0, N - 1, 1); ans -= tmp.c; } } } printf("%lld", ans); }

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

arranging_tickets.cpp: In function 'int main()':
arranging_tickets.cpp:115:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d %d", &N, &M);
     ~~~~~^~~~~~~~~~~~~~~~~
arranging_tickets.cpp:118:27: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         int a, b, c; scanf("%d %d %d", &a, &b, &c);
                      ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
#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...