Submission #593541

#TimeUsernameProblemLanguageResultExecution timeMemory
593541LastRoninDistributing Candies (IOI21_candies)C++17
8 / 100
1078 ms32204 KiB
#include "candies.h"
#include <bits/stdc++.h>
#define ll long long
#define pill pair<ll, ll>
#define mp make_pair
#define f first
#define s second
#define pb push_back

using namespace std;

const ll N = 3e5;

ll n, m;

struct seg {
	ll mx[4 * N] = {0};
	ll mn[4 * N] = {0};
	ll p[4 * N] = {0};
	void push(ll v, ll tl, ll tr) {
		mx[v] += p[v];
		mn[v] += p[v];
		if(tl != tr) {
			p[v * 2] += p[v];
			p[v * 2 + 1] += p[v];
		}
		p[v] = 0;
	}
	void build(ll v = 1, ll tl = 0, ll tr = m) {
		mx[v] = mn[v] = 0;
		p[v] = 0;
		if(tl == tr) { 
			return;
		}
		ll m = (tl + tr) >> 1ll;
		build(v * 2, tl, m);
		build(v * 2 + 1, m + 1, tr);
	}
	void upd(ll l, ll r, ll z, ll v = 1, ll tl = 0, ll tr = m) {
		push(v, tl, tr);
		if(l > tr || tl > r)return;
		if(l <= tl && tr <= r) {
			p[v] += z;
			push(v, tl, tr);
			return;
		}
		ll m = (tl + tr) >> 1ll;
		upd(l, r, z, v * 2, tl, m);
		upd(l, r, z, v * 2 + 1, m + 1, tr);
		mx[v] = max(mx[v * 2], mx[v * 2 + 1]);
		mn[v] = min(mn[v * 2], mn[v * 2 + 1]);
	}
	pill get(ll l, ll r, ll v = 1, ll tl = 0, ll tr = m) {
		push(v, tl, tr);
		if(l > tr || tl > r)return mp(1e17, -1e17);
		if(l <= tl && tr <= r)return mp(mn[v], mx[v]);
		ll m = (tl + tr) >> 1ll;
		pill a = get(l, r, v * 2, tl, m);
		pill b = get(l, r, v * 2 + 1, m + 1, tr);
		return mp(min(a.f, b.f), max(a.s, b.s));
	}
} rt;

vector<int> distribute_candies(vector<int> c, vector<int> l, vector<int> r, vector<int> v) {
    n = c.size();
    m = l.size();
  	rt.build();  
    vector<int> s(n);
	vector<int> scan[n + 2];
	for(int i = 0; i < l.size(); i++) {
		scan[l[i]].pb(i);
		scan[r[i] + 1].pb(i);
	}

	for(int i = 0; i < n; i++) {
		for(auto u : scan[i]) {
			if(r[u] + 1 == i) {
				rt.upd(u + 1, m, -v[u]);					
			} else {
				rt.upd(u + 1, m, v[u]);
			}
		}
		ll L = 0, R = m, ans = -1;
		while(L <= R) {
			ll M = (L + R) >> 1ll;
			pill z = rt.get(M, m);
			if(z.s - z.f >= c[i]) {
				ans = M;
				L = M + 1;				
			} else {
				R = M - 1;
			}
		}
		ll zn = rt.get(m, m).f;
		if(ans == -1) {
			s[i] = zn;
			continue;	
		} else {
			pill z = rt.get(ans + 1, m);
			pill z2 = rt.get(ans, m);
			if(z2.s == z.s) {
				s[i] = c[i] - (z.s - zn);		
			} else {
				s[i] = (zn - z.f);
			}
		}
	}
    return s;
}

Compilation message (stderr)

candies.cpp: In function 'std::vector<int> distribute_candies(std::vector<int>, std::vector<int>, std::vector<int>, std::vector<int>)':
candies.cpp:70:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   70 |  for(int i = 0; i < l.size(); i++) {
      |                 ~~^~~~~~~~~~
#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...