Submission #1361874

#TimeUsernameProblemLanguageResultExecution timeMemory
1361874ByeWorld사탕 분배 (IOI21_candies)C++20
0 / 100
5093 ms28700 KiB
#include "candies.h"
#include <bits/stdc++.h>
#pragma GCC optimize("O3", "Ofast")
#define ll long long
#define se second
#define fi first
#define pb push_back
#define lf (id<<1)
#define rg ((id<<1)|1)
#define md ((l+r)>>1)
using namespace std;
typedef pair<ll,ll> pii;
typedef pair<pii,pii> ipii;
const int MAXN = 1e6+10;
const int MAXA = 5e4+10;
const int SQRT = 300;
const ll INF = 1e9;
const int MOD = 998244353;
const int LOG = 20;
void chmn(auto &a, auto b){ a = min(a, b); }
void chmx(auto &a, auto b){ a = max(a, b); }

ll n, q, a[MAXN], ans[MAXN], upd[MAXN];
vector<pii> vec[MAXN];
set<ll> s;

bool cek(int idx, int cap){
	auto it = s.upper_bound(idx); it--;

	int mn = INF, mx = -INF, v = 0;
	for(int i=idx+1; i<=q; i++){
		v += upd[i];
		chmn(mn, v); chmx(mx, v);
	}

	if(upd[*it] < 0){ // start di 0
		if(mn < 0 || mx > cap) return 0;
	} else { // start di cap
		if(mn < -cap || mx > 0) return 0;
	}
	return 1;
}
ll get(int idx, int cap){
	auto it = s.upper_bound(idx); it--;
	ll tot = 0;
	for(int i=idx+1; i<=q; i++) tot += upd[i];

	if(upd[*it] < 0){ // start di 0
	} else { // start di cap
		tot += cap;
	}
	return tot;
}

struct node {
	ll mx, mn, sum;
};
struct seg {
	node st[4*MAXN];
} A;

std::vector<int> distribute_candies(std::vector<int> c, std::vector<int> l,
                                    std::vector<int> r, std::vector<int> v) {
    n = c.size(); q = l.size();
    for(int i=1; i<=n; i++){
    	a[i] = c[i-1];
    }
    for(int i=1; i<=q; i++){
    	vec[l[i-1]+1].pb({i, v[i-1]});
    	vec[r[i-1]+2].pb({i, -v[i-1]});
    }
    s.insert(0); upd[0] = -1; // -
    for(int i=1; i<=n; i++){
    	for(auto [id, v] : vec[i]){
    		upd[id] += v;
    		if(upd[id] != 0) s.insert(id);
    		else s.erase(id);
    	} 
    	// for(auto in : s) cout << in << ' ';
    	// 	cout << " s\n";
    	// for(int j=0; j<=q; j++) cout << upd[j] << " \n"[j==q];
    	// 	cout << " upd\n\n";

    	int l=0, r=q, mid=0, cnt=-1;
    	while(l<=r){
    		mid = md;
    		// aman
    		if(cek(mid, a[i])) cnt = mid, r = mid-1;
    		else l = mid+1;
    	} 
    	// cout << i <<  ' '<< cnt << " \n\n";
    	ans[i] = get(cnt, a[i]);
    }
    std::vector<int> s(n);
    for(int i=1; i<=n; i++) s[i-1] = (int)ans[i];
    return s;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...