Submission #636980

#TimeUsernameProblemLanguageResultExecution timeMemory
636980abekerMeasures (CEOI22_measures)C++17
100 / 100
276 ms23320 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef pair <int, int> pii; const int MAXN = 4e5 + 5; const ll INF = 1e15; struct Node { ll mini, maks, diff, lazy; Node(ll mini, ll maks, ll diff, ll lazy) : mini(mini), maks(maks), diff(diff), lazy(lazy) {} Node() : mini(INF), maks(-INF), diff(-INF), lazy(0) {} }; class Tournament { int offset; vector <Node> tour; public: Tournament(int n) { for (offset = 1; offset < n; offset *= 2); tour.resize(2 * offset); } Node merge(Node lhs, Node rhs) { return Node(min(lhs.mini, rhs.mini), max(lhs.maks, rhs.maks), max(max(lhs.diff, rhs.diff), rhs.maks - lhs.mini), 0); } void prop(int x) { tour[x].mini += tour[x].lazy; tour[x].maks += tour[x].lazy; if (x < offset) { tour[2 * x].lazy += tour[x].lazy; tour[2 * x + 1].lazy += tour[x].lazy; } tour[x].lazy = 0; } void refresh(int x) { tour[x] = merge(tour[2 * x], tour[2 * x + 1]); } void update(int x, int lo, int hi, int from, int to, int val) { prop(x); if (lo >= to || hi <= from) return; if (lo >= from && hi <= to) { tour[x].lazy += val; prop(x); return; } int mid = (lo + hi) / 2; update(2 * x, lo, mid, from, to, val); update(2 * x + 1, mid, hi, from, to, val); refresh(x); } void update(int x, int val) { update(1, 0, offset, x, offset, val); } void modify(int x, int lo, int hi, int pos, int val) { prop(x); if (lo > pos || hi <= pos) return; if (hi - lo == 1) { tour[x].mini += val - INF; tour[x].maks += val + INF; return; } int mid = (lo + hi) / 2; modify(2 * x, lo, mid, pos, val); modify(2 * x + 1, mid, hi, pos, val); refresh(x); } void modify(int x, int val) { modify(1, 0, offset, x, val); } ll get() { prop(1); return max(tour[1].diff, 0ll); } }; int N, M, D; int pos[MAXN]; pii p[MAXN]; void load() { scanf("%d%d%d", &N, &M, &D); for (int i = 0; i < N + M; i++) { scanf("%d", &p[i].first); p[i].second = i; } } void solve() { sort(p, p + N + M); for (int i = 0; i < N + M; i++) pos[p[i].second] = i; Tournament solver(N + M); for (int i = 0; i < N + M; i++) { solver.modify(pos[i], -p[pos[i]].first); solver.update(pos[i], D); ll ans = solver.get(); if (i >= N) printf("%lld%s", ans / 2, ans % 2 ? ".5 " : " "); } puts(""); } int main() { load(); solve(); return 0; }

Compilation message (stderr)

Main.cpp: In function 'void load()':
Main.cpp:85:8: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   85 |   scanf("%d%d%d", &N, &M, &D);
      |   ~~~~~^~~~~~~~~~~~~~~~~~~~~~
Main.cpp:87:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   87 |     scanf("%d", &p[i].first);
      |     ~~~~~^~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...