제출 #587145

#제출 시각아이디문제언어결과실행 시간메모리
587145AkramElOmrani사탕 분배 (IOI21_candies)C++17
8 / 100
106 ms12884 KiB
#include "candies.h"
#include <bits/stdc++.h>

#define ll long long
using namespace std;

void apply(int& v, int a, int mx) {
	ll res = v; res += a;
	res = max(res, 0LL);
	res = min(res, (ll)mx);
	v = res;
}

vector<ll> tree, lazy;

void process(int node, int l, int r, vector<int>& c) {
	if(lazy[node] != 0) {
		if(l != r) 
			for(int x : {node * 2, node * 2 + 1})
				lazy[x] += lazy[node];
	}
	lazy[node] = 0;
}

void upd(int node, int l, int r,
		int low, int high, int v, vector<int>& c) {
	process(node, l, r, c);
	if(low <= l && r <= high) {
		lazy[node] += v;
		process(node, l, r, c);
		return;
	}
	int mid = (l + r) / 2;
	upd(node * 2, l, mid, low, high, v, c);
	upd(node * 2 + 1, mid + 1, r, low, high, v, c);
	tree[node] = tree[node * 2] + tree[node * 2 + 1];	
}

vector<int> ans;

void reverse_build(int node, int l, int r) {
	if(l == r) {
		ans[l] = tree[node];
		return;
	}
	int mid = (l + r) / 2;
	reverse_build(node * 2, l, mid);
	reverse_build(node * 2 + 1, mid + 1, r);
}

vector<int> distribute_candies(vector<int> c,
		vector<int> l,
		vector<int> r,
		vector<int> v) {

	int n = c.size();
	int q = l.size();

	vector<ll> ans(n + 1);

	for(int i = 0; i < q; ++i) {
		ans[l[i]] += v[i];
		ans[r[i] + 1] -= v[i];
	}
	for(int i = 1; i <= n; ++i) {
		ans[i] += ans[i - 1];
	}
	vector<int> s(n);
	for(int i = 0; i < n; ++i) {
		s[i] = min((ll)c[i], max((ll)s[i], ans[i]));
	}

	return s;
}
#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...