답안 #821890

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
821890 2023-08-11T20:00:42 Z I_Love_EliskaM_ 사탕 분배 (IOI21_candies) C++17
100 / 100
3011 ms 48932 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;

struct sgt {
	vector<int> lazy;
	vector<int> mn,mx;
	int sz=1;
	sgt(int n) {
		while (sz<n) sz<<=1;
		lazy.assign(4*sz,0);
		mn=mx=lazy;
	}
	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>> add(n), del(n);
	forn(i,q) add[l[i]].pb(i), del[r[i]].pb(i);

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

		int l=0, r=q-1;
		while (l<r) {
			int mid=(l+r+1)>>1;
			auto x = st.query(mid,q);
			if (x.s - x.f < c[i]) r=mid-1;
			else l=mid;
		}
		auto z = st.query(r,q);
		int t=r;
		l=r+1, r=q-1;
		while (l<r) {
			int mid=(l+r)>>1;
			auto x=st.query(t+1,mid+1);
			if (x.s!=z.s && x.f!=z.f) l=mid+1;
			else r=mid;
		}
		auto x = st.query(r,r+1);
		auto y = st.query(q-1,q);
		z = st.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]) st.add(x,q,-v[x]);
	}
	return ans;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 212 KB Output is correct
2 Correct 0 ms 212 KB Output is correct
3 Correct 2 ms 468 KB Output is correct
4 Correct 2 ms 576 KB Output is correct
5 Correct 8 ms 724 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2136 ms 48572 KB Output is correct
2 Correct 2444 ms 48596 KB Output is correct
3 Correct 2578 ms 48592 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 340 KB Output is correct
2 Correct 327 ms 32592 KB Output is correct
3 Correct 885 ms 12464 KB Output is correct
4 Correct 2841 ms 48748 KB Output is correct
5 Correct 3011 ms 48668 KB Output is correct
6 Correct 1829 ms 48664 KB Output is correct
7 Correct 1810 ms 48540 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 212 KB Output is correct
2 Correct 1 ms 340 KB Output is correct
3 Correct 226 ms 32720 KB Output is correct
4 Correct 591 ms 12224 KB Output is correct
5 Correct 1981 ms 43560 KB Output is correct
6 Correct 1835 ms 43568 KB Output is correct
7 Correct 1323 ms 43596 KB Output is correct
8 Correct 2055 ms 43576 KB Output is correct
9 Correct 2770 ms 43612 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 212 KB Output is correct
2 Correct 0 ms 212 KB Output is correct
3 Correct 2 ms 468 KB Output is correct
4 Correct 2 ms 576 KB Output is correct
5 Correct 8 ms 724 KB Output is correct
6 Correct 2136 ms 48572 KB Output is correct
7 Correct 2444 ms 48596 KB Output is correct
8 Correct 2578 ms 48592 KB Output is correct
9 Correct 1 ms 340 KB Output is correct
10 Correct 327 ms 32592 KB Output is correct
11 Correct 885 ms 12464 KB Output is correct
12 Correct 2841 ms 48748 KB Output is correct
13 Correct 3011 ms 48668 KB Output is correct
14 Correct 1829 ms 48664 KB Output is correct
15 Correct 1810 ms 48540 KB Output is correct
16 Correct 0 ms 212 KB Output is correct
17 Correct 1 ms 340 KB Output is correct
18 Correct 226 ms 32720 KB Output is correct
19 Correct 591 ms 12224 KB Output is correct
20 Correct 1981 ms 43560 KB Output is correct
21 Correct 1835 ms 43568 KB Output is correct
22 Correct 1323 ms 43596 KB Output is correct
23 Correct 2055 ms 43576 KB Output is correct
24 Correct 2770 ms 43612 KB Output is correct
25 Correct 0 ms 212 KB Output is correct
26 Correct 754 ms 12420 KB Output is correct
27 Correct 304 ms 32612 KB Output is correct
28 Correct 2501 ms 48592 KB Output is correct
29 Correct 2332 ms 48616 KB Output is correct
30 Correct 2422 ms 48608 KB Output is correct
31 Correct 1975 ms 48872 KB Output is correct
32 Correct 1831 ms 48932 KB Output is correct