제출 #1356556

#제출 시각아이디문제언어결과실행 시간메모리
1356556Jawad_Akbar_JJ사탕 분배 (IOI21_candies)C++17
0 / 100
56 ms14120 KiB
#include <iostream>
#include <vector>

using namespace std;
const int N = 1<<18;
long long Pre[N], Mn[N], Mx[N], Mx1[N], Mn1[N];

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=1;i<=q;i++)
		Pre[i] = Pre[i-1] + v[i-1];

	Mn1[q+1] = Pre[q];
	for (int i=q;i>=0;i--){
		Mx1[i] = max(Pre[i], Mx1[i+1]);
		Mn1[i] = min(Pre[i], Mn1[i+1]);
		Mx[i] = max(Mx1[i] - Pre[i], Mx[i+1]);
	}

	vector<int> ans;
	for (int i=0;i<n;i++){
		int l = -1, r = q;
		while (l + 1 < r){
			int m = (l + r) / 2;
			if (Mx[m] >= c[i])
				l = m;
			else
				r = m;
		}
		if (l == -1)
			ans.push_back(Pre[q] - Mn1[0]);
		else{
			int l1 = l + 1, r1 = q+1;
			while (l1 + 1 < r1){
				int m = (l1 + r1) / 2;
				if (Mx1[m] < Mx1[l])
					r1 = m;
				else
					l1 = m;
			}
			// cout<<i<<' '<<l<<' '<<l1<<' '<<r1<<' '<<endl;
			if (Pre[l1] - Mn1[l1 + 1] >= c[i])
				ans.push_back(Pre[q] - Mn1[l1 + 1]);//, cout<<i<<endl;
			else
				ans.push_back(c[i] + Pre[q] - Pre[l1]);
		}
	}
	return ans;
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…