Submission #521568

#TimeUsernameProblemLanguageResultExecution timeMemory
521568eecs사탕 분배 (IOI21_candies)C++17
100 / 100
379 ms38424 KiB
#include "candies.h"
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
const int maxn = 200010;
int C;
ll mn[maxn << 2], mx[maxn << 2], tag[maxn << 2];
vector<pair<int, int>> Q[maxn];

#define mid (l + r >> 1)
#define ls (k << 1)
#define rs (k << 1 | 1)
void apply(int k, ll v) { mn[k] += v, mx[k] += v, tag[k] += v; }
void pushdown(int k) { apply(ls, tag[k]), apply(rs, tag[k]), tag[k] = 0; }

void add(int k, int l, int r, int ql, int qr, ll v) {
	if (l >= ql && r <= qr) { apply(k, v); return; }
	pushdown(k);
	if (mid >= ql) add(ls, l, mid, ql, qr, v);
	if (mid < qr) add(rs, mid + 1, r, ql, qr, v);
	mn[k] = min(mn[ls], mn[rs]), mx[k] = max(mx[ls], mx[rs]);
}

int find(int k, int l, int r, ll &cmn, ll &cmx) {
	if (l < r && max(cmx, mx[k]) - min(cmn, mn[k]) >= C) {
		pushdown(k);
		int t = find(rs, mid + 1, r, cmn, cmx);
		return ~t ? t : find(ls, l, mid, cmn, cmx);
	} else {
		cmn = min(cmn, mn[k]), cmx = max(cmx, mx[k]);
	}
	return cmx - cmn >= C ? l : -1;
}

ll query(int k, int l, int r, int p) {
	if (l == r) return mx[k];
	pushdown(k);
	return mid >= p ? query(ls, l, mid, p) : query(rs, mid + 1, r, p);
}

vector<int> distribute_candies(vector<int> c, vector<int> l, vector<int> r, vector<int> v) {
	int n = c.size(), q = l.size();
	for (int i = 0; i < q; i++) {
		Q[l[i]].emplace_back(i + 1, v[i]);
		Q[r[i] + 1].emplace_back(i + 1, -v[i]);
	}
	vector<int> ans;
	ll cur = 0;
	for (int i = 0; i < n; i++) {
		for (auto p : Q[i]) add(1, 0, q, p.first, q, p.second), cur += p.second;
		C = c[i];
		if (mx[1] - mn[1] < C) { ans.push_back(cur - mn[1]); continue; }
		ll cmn = LLONG_MAX, cmx = LLONG_MIN;
		int pos = find(1, 0, q, cmn, cmx);
		ll v = query(1, 0, q, pos);
		if (v == cmn) ans.push_back(cur + C - cmx);
		else ans.push_back(cur - cmn);
	}
	return ans;
}

Compilation message (stderr)

candies.cpp: In function 'void add(int, int, int, int, int, ll)':
candies.cpp:11:16: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   11 | #define mid (l + r >> 1)
      |              ~~^~~
candies.cpp:20:6: note: in expansion of macro 'mid'
   20 |  if (mid >= ql) add(ls, l, mid, ql, qr, v);
      |      ^~~
candies.cpp:11:16: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   11 | #define mid (l + r >> 1)
      |              ~~^~~
candies.cpp:20:28: note: in expansion of macro 'mid'
   20 |  if (mid >= ql) add(ls, l, mid, ql, qr, v);
      |                            ^~~
candies.cpp:11:16: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   11 | #define mid (l + r >> 1)
      |              ~~^~~
candies.cpp:21:6: note: in expansion of macro 'mid'
   21 |  if (mid < qr) add(rs, mid + 1, r, ql, qr, v);
      |      ^~~
candies.cpp:11:16: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   11 | #define mid (l + r >> 1)
      |              ~~^~~
candies.cpp:21:24: note: in expansion of macro 'mid'
   21 |  if (mid < qr) add(rs, mid + 1, r, ql, qr, v);
      |                        ^~~
candies.cpp: In function 'int find(int, int, int, ll&, ll&)':
candies.cpp:11:16: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   11 | #define mid (l + r >> 1)
      |              ~~^~~
candies.cpp:28:20: note: in expansion of macro 'mid'
   28 |   int t = find(rs, mid + 1, r, cmn, cmx);
      |                    ^~~
candies.cpp:11:16: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   11 | #define mid (l + r >> 1)
      |              ~~^~~
candies.cpp:29:31: note: in expansion of macro 'mid'
   29 |   return ~t ? t : find(ls, l, mid, cmn, cmx);
      |                               ^~~
candies.cpp: In function 'll query(int, int, int, int)':
candies.cpp:11:16: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   11 | #define mid (l + r >> 1)
      |              ~~^~~
candies.cpp:39:9: note: in expansion of macro 'mid'
   39 |  return mid >= p ? query(ls, l, mid, p) : query(rs, mid + 1, r, p);
      |         ^~~
candies.cpp:11:16: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   11 | #define mid (l + r >> 1)
      |              ~~^~~
candies.cpp:39:33: note: in expansion of macro 'mid'
   39 |  return mid >= p ? query(ls, l, mid, p) : query(rs, mid + 1, r, p);
      |                                 ^~~
candies.cpp:11:16: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   11 | #define mid (l + r >> 1)
      |              ~~^~~
candies.cpp:39:53: note: in expansion of macro 'mid'
   39 |  return mid >= p ? query(ls, l, mid, p) : query(rs, mid + 1, r, p);
      |                                                     ^~~
#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...