답안 #579963

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
579963 2022-06-20T11:32:53 Z joelau 사탕 분배 (IOI21_candies) C++17
0 / 100
188 ms 112308 KB
#include "candies.h"
#include <bits/stdc++.h>
using namespace std;

tuple<long long,long long,long long> queries[400005];

struct node {
	long long s,e,m,lazy; pair<long long,long long> least,most; node *l, *r;
	node (long long S, long long E) {
		s = S, e = E, m = (s+e)/2, least = make_pair(0,s), most = make_pair(0,s), lazy = 0;
		if (s != e) l = new node(s,m), r = new node(m+1,e);
	}
	void propo() {
		if (lazy == 0) return;
		least.first += lazy, most.first += lazy;
		if (s != e) l->lazy += lazy, r->lazy += lazy;
		lazy = 0;
	}
	void update (long long x, long long y, long long nv) {
		propo();
		if (s == x && e == y) lazy += nv;
		else {
			if (y <= m) l -> update(x,y,nv);
			else if (x > m) r -> update(x,y,nv);
			else l -> update(x,m,nv), r -> update(m+1,y,nv);
			l -> propo(), r -> propo();
			least = min(l->least,r->least), most = max(l->most,r->most);
		}
	}
	pair< pair<long long,long long>, pair<long long,long long> > query (long long x, long long y) {
		propo();
		if (s == x && e == y) return make_pair(least,most);
		else if (y <= m) return l -> query(x,y);
		else if (x > m) return r -> query(x,y);
		else {
			pair< pair<long long,long long>, pair<long long,long long> > q1 = l->query(x,m), q2 = r->query(m+1,y);
			return make_pair(min(q1.first,q2.first),max(q1.second,q2.second));
		}
	}
} *root;

vector<int> distribute_candies(vector<int> c, vector<int> l, vector<int> r, vector<int> v) {
	long long N = c.size(), Q = l.size();
	for (long long i = 0; i < Q; ++i) queries[i*2] = make_tuple(l[i],i+1,v[i]), queries[i*2+1] = make_tuple(r[i]+1,i+1,-v[i]);
	sort(queries,queries+Q*2);
	root = new node(0,Q);
	vector<int> ans;
	for (long long i = 0, j = 0; i < N; ++i) {
		while (j < Q*2 && get<0>(queries[j]) == i) {
			root -> update(get<1>(queries[j]),Q,get<2>(queries[j]));
			j++;
		}
		long long low = -1, high = Q;
		while (high-low > 1) {
			long long mid = (low+high)/2;
			pair< pair<long long,long long>, pair<long long,long long> > q = root -> query(mid,Q);
			if (q.second.first-q.first.first >= c[i]) low = mid;
			else high = mid;
		}
		pair< pair<long long,long long>, pair<long long,long long> > q1 = root -> query(low,Q), q2 = root -> query(Q,Q);
		if (q1.second.first-q1.first.first < c[i]) ans.push_back(q2.first.first);
		else if (q1.first.second > q1.second.second) {
			if (q1.first.first < q1.second.first) ans.push_back(q2.first.first-q1.first.first);
			else ans.push_back(c[i]-q1.first.first+q2.first.first);
		}
		else {
			if (q1.first.first < q1.second.first) ans.push_back(c[i]-q1.second.first+q2.first.first);
			else ans.push_back(q2.first.first-q1.second.first);
		}
	}
	return ans;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 212 KB Output is correct
2 Runtime error 1 ms 432 KB Execution killed with signal 11
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 188 ms 112308 KB Execution killed with signal 11
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 1 ms 340 KB Execution killed with signal 11
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 1 ms 340 KB Execution killed with signal 11
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 212 KB Output is correct
2 Runtime error 1 ms 432 KB Execution killed with signal 11
3 Halted 0 ms 0 KB -