답안 #821899

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
821899 2023-08-11T20:09:29 Z TimDee 사탕 분배 (IOI21_candies) C++17
100 / 100
2785 ms 36944 KB
#include "candies.h"
#include <bits/stdc++.h>
using namespace std;
#define forn(i,n) for(int i=0;i<n;++i)
#define pb push_back
#define all(x) x.begin(), x.end()
using ll = long long;
#define pi pair<ll,ll>
#define f first
#define s second

#define int long long
const int inf=1e18;

const int sz = 1<<18;
int lazy[4*sz];
int mn[2*sz];
int mx[2*sz];

pi merge(pi a, pi b) {
	return {min(a.f,b.f), max(a.s,b.s)};
}
void push(int v) {
	mn[v]+=lazy[v];
	mx[v]+=lazy[v];
	lazy[2*v+1]+=lazy[v];
	lazy[2*v+2]+=lazy[v];
	lazy[v]=0;
}
void add(int v, int l, int r, int lx, int rx, int x) {
	if (lazy[v]) push(v);
	if (rx<=l || r<=lx) return;
	if (lx<=l && r<=rx) {
		lazy[v]+=x;
		push(v);
		return;
	}
	int m=(l+r)>>1;
	add(2*v+1,l,m,lx,rx,x);
	add(2*v+2,m,r,lx,rx,x);
	mn[v]=min(mn[2*v+1],mn[2*v+2]);
	mx[v]=max(mx[2*v+1],mx[2*v+2]);
}
void add(int l, int r, int x) {
	add(0,0,sz,l,r,x);
}
pi query(int v, int l, int r, int lx, int rx) {
	if (lazy[v]) push(v);
	if (rx<=l || r<=lx) return {inf,-inf};
	if (lx<=l && r<=rx) return {mn[v],mx[v]};
	int m=(l+r)>>1;
	auto lq=query(2*v+1,l,m,lx,rx);
	auto rq=query(2*v+2,m,r,lx,rx);
	mn[v]=min(mn[2*v+1],mn[2*v+2]);
	mx[v]=max(mx[2*v+1],mx[2*v+2]);
	return {min(lq.f,rq.f),max(lq.s,rq.s)};
}
pi query(int l, int r) {
	return query(0,0,sz,l,r);
}

#undef int

void addqueries(int n, vector<int>&l, vector<int>&r, vector<int>&v) {
	reverse(all(l));
	reverse(all(r));
	reverse(all(v));
	forn(i,2) l.pb(0);
	forn(i,2) r.pb(n-1);
	v.pb(-1e9); v.pb(1e9);
	reverse(all(l));
	reverse(all(r));
	reverse(all(v));
}

vector<int> distribute_candies(vector<int> c, vector<int> l, vector<int> r, vector<int> v) {
	int n=c.size(), q=l.size()+2;
	addqueries(n,l,r,v);

	vector<vector<int>> toadd(n), del(n);
	forn(i,q) toadd[l[i]].pb(i), del[r[i]].pb(i);

	vector<int> ans(n);
	forn(i,n) {
		for(auto&x:toadd[i]) add(x,q,v[x]);

		int l=0, r=q-1;
		while (l<r) {
			int mid=(l+r+1)>>1;
			auto x = query(mid,q);
			if (x.s - x.f < c[i]) r=mid-1;
			else l=mid;
		}
		auto z = query(r,q);
		int t=r;
		l=r+1, r=q-1;
		while (l<r) {
			int mid=(l+r)>>1;
			auto x=query(t+1,mid+1);
			if (x.s!=z.s && x.f!=z.f) l=mid+1;
			else r=mid;
		}
		auto x = query(r,r+1);
		auto y = query(q-1,q);
		z = query(t,t+1);
		if (x.f <= z.f) ans[i]=y.f-x.f;
		else ans[i]=c[i]+y.f-x.f;		

		for(auto&x:del[i]) add(x,q,-v[x]);
	}
	return ans;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 340 KB Output is correct
2 Correct 1 ms 432 KB Output is correct
3 Correct 2 ms 596 KB Output is correct
4 Correct 3 ms 596 KB Output is correct
5 Correct 11 ms 872 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1911 ms 36944 KB Output is correct
2 Correct 2195 ms 36796 KB Output is correct
3 Correct 2341 ms 36900 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 468 KB Output is correct
2 Correct 339 ms 20828 KB Output is correct
3 Correct 1278 ms 12884 KB Output is correct
4 Correct 2586 ms 36816 KB Output is correct
5 Correct 2785 ms 36812 KB Output is correct
6 Correct 1660 ms 36816 KB Output is correct
7 Correct 1607 ms 36820 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 340 KB Output is correct
2 Correct 2 ms 468 KB Output is correct
3 Correct 222 ms 20960 KB Output is correct
4 Correct 780 ms 12672 KB Output is correct
5 Correct 1792 ms 31900 KB Output is correct
6 Correct 1588 ms 31800 KB Output is correct
7 Correct 1182 ms 31800 KB Output is correct
8 Correct 1874 ms 31800 KB Output is correct
9 Correct 2554 ms 31804 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 340 KB Output is correct
2 Correct 1 ms 432 KB Output is correct
3 Correct 2 ms 596 KB Output is correct
4 Correct 3 ms 596 KB Output is correct
5 Correct 11 ms 872 KB Output is correct
6 Correct 1911 ms 36944 KB Output is correct
7 Correct 2195 ms 36796 KB Output is correct
8 Correct 2341 ms 36900 KB Output is correct
9 Correct 3 ms 468 KB Output is correct
10 Correct 339 ms 20828 KB Output is correct
11 Correct 1278 ms 12884 KB Output is correct
12 Correct 2586 ms 36816 KB Output is correct
13 Correct 2785 ms 36812 KB Output is correct
14 Correct 1660 ms 36816 KB Output is correct
15 Correct 1607 ms 36820 KB Output is correct
16 Correct 1 ms 340 KB Output is correct
17 Correct 2 ms 468 KB Output is correct
18 Correct 222 ms 20960 KB Output is correct
19 Correct 780 ms 12672 KB Output is correct
20 Correct 1792 ms 31900 KB Output is correct
21 Correct 1588 ms 31800 KB Output is correct
22 Correct 1182 ms 31800 KB Output is correct
23 Correct 1874 ms 31800 KB Output is correct
24 Correct 2554 ms 31804 KB Output is correct
25 Correct 1 ms 340 KB Output is correct
26 Correct 969 ms 12764 KB Output is correct
27 Correct 303 ms 20844 KB Output is correct
28 Correct 2337 ms 36816 KB Output is correct
29 Correct 2070 ms 36824 KB Output is correct
30 Correct 2025 ms 36860 KB Output is correct
31 Correct 1708 ms 36816 KB Output is correct
32 Correct 1619 ms 36832 KB Output is correct