답안 #767809

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
767809 2023-06-27T07:50:44 Z qwerasdfzxcl Two Dishes (JOI19_dishes) C++17
74 / 100
5772 ms 221564 KB
#include <bits/stdc++.h>

using namespace std;
typedef long long ll;

struct Block{
	int s, e;
	ll a0;

	Block(){}
	Block(int _s, int _e, ll _a0): s(_s), e(_e), a0(_a0) {}
};

vector<Block> buf;

struct Seg{
	ll treeV[2202000], V[1101000];
	int treeB[2202000];

	ll lazyBadd[2202000], lazyBidx[2202000];

	void init(int i, int l, int r, ll a[]){
		lazyBadd[i] = 0, lazyBidx[i] = -1;
		if (l==r){
			V[l] = a[l];
			treeV[i] = a[l];
			treeB[i] = 1;
			return;
		}

		int m = (l+r)>>1;
		init(i<<1, l, m, a); init(i<<1|1, m+1, r, a);
		treeV[i] = treeV[i<<1] + treeV[i<<1|1];
	}

	void propagate(int i, int l, int r){
		if (l==r){
			if (lazyBidx[i]!=-1) treeB[i] = lazyBidx[i];
			if (buf[treeB[i]].s==l) buf[treeB[i]].a0 += lazyBadd[i];
		}

		else{
			if (lazyBidx[i]!=-1){
				lazyBidx[i<<1] = lazyBidx[i];
				lazyBadd[i<<1] = 0;
				lazyBidx[i<<1|1] = lazyBidx[i];
				lazyBadd[i<<1|1] = 0;
			}

			lazyBadd[i<<1] += lazyBadd[i];
			lazyBadd[i<<1|1] += lazyBadd[i];
		}

		lazyBidx[i] = -1;
		lazyBadd[i] = 0;
	}

	void update(int i, int l, int r, int p, int v){
		// propagate(i, l, r);
		if (r<p || p<l) return;
		if (l==r){
			treeV[i] = v;
			V[l] = v;
			return;
		}

		int m = (l+r)>>1;
		update(i<<1, l, m, p, v); update(i<<1|1, m+1, r, p, v);
		treeV[i] = treeV[i<<1] + treeV[i<<1|1];
	}

	void updateB(int i, int l, int r, int s, int e, int x){
		propagate(i, l, r);
		if (r<s || e<l) return;
		if (s<=l && r<=e){
			lazyBidx[i] = x;
			propagate(i, l, r);
			return;
		}

		int m = (l+r)>>1;
		updateB(i<<1, l, m, s, e, x); updateB(i<<1|1, m+1, r, s, e, x);
		// treeV[i] = treeV[i<<1] + treeV[i<<1|1];
	}

	void add(int i, int l, int r, int s, int e, int x){
		propagate(i, l, r);
		if (r<s || e<l) return;
		if (s<=l && r<=e){
			lazyBadd[i] += x;
			propagate(i, l, r);
			return;
		}

		int m = (l+r)>>1;
		add(i<<1, l, m, s, e, x); add(i<<1|1, m+1, r, s, e, x);
		// treeV[i] = treeV[i<<1] + treeV[i<<1|1];
	}

	ll queryV(int i, int l, int r, int s, int e){
		// propagate(i, l, r);
		if (r<s || e<l) return 0;
		if (s<=l && r<=e) return treeV[i];

		int m = (l+r)>>1;
		return queryV(i<<1, l, m, s, e) + queryV(i<<1|1, m+1, r, s, e);
	}

	int queryB(int i, int l, int r, int p){
		propagate(i, l, r);
		if (r<p || p<l) return 0;
		if (l==r) return treeB[i];

		int m = (l+r)>>1;
		return queryB(i<<1, l, m, p) | queryB(i<<1|1, m+1, r, p);
	}
}tree;

int n, m;
ll A[1001000], B[1001000], S[1001000], T[1001000], P[1001000], Q[1001000];
ll sumA[1001000], sumB[1001000], W[1001000], mxA[1001000], mxB[1001000];
vector<int> Vp[1001000];

void init(){
	for (int i=1;i<=n;i++) sumA[i] = sumA[i-1] + A[i];
	for (int i=1;i<=m;i++) sumB[i] = sumB[i-1] + B[i];

	for (int i=1;i<=n;i++){
		mxB[i] = upper_bound(sumB, sumB+m+1, S[i] - sumA[i]) - sumB - 1;
		
		if (mxB[i]==-1) W[i] = 0;
		else{
			W[i] = P[i];
			Vp[mxB[i]].push_back(i);
		}
	}
	for (int i=1;i<=m;i++){
		mxA[i] = upper_bound(sumA, sumA+n+1, T[i] - sumB[i]) - sumA - 1;
	}

	// printf("mxB: ");
	// for (int i=1;i<=n;i++) printf("%lld ", mxB[i]);
	// printf("\nmxA: ");
	// for (int i=1;i<=m;i++) printf("%lld ", mxA[i]);
	// printf("\nW: ");
	// for (int i=1;i<=n;i++) printf("%lld ", W[i]);
	// printf("\n");

	buf.emplace_back();
	buf.emplace_back(0, n, 0);
	tree.init(1, 0, n, W);
}


int getidx(int x){
	int ret = tree.queryB(1, 0, n, x);
	tree.queryB(1, 0, n, buf[ret].s);
	return ret;
}

ll calc(int x, int idx = -1){
	if (idx==-1) idx = getidx(x);
	return buf[idx].a0 + tree.queryV(1, 0, n, buf[idx].s+1, x);
}

void split(int x){
	int idx = getidx(x);
	
	if (buf[idx].s==x) return;

	buf.emplace_back(buf[idx].s, x-1, buf[idx].a0);
	buf[idx].a0 += tree.queryV(1, 0, n, buf[idx].s+1, x);
	buf[idx].s = x;

	tree.updateB(1, 0, n, buf.back().s, x-1, (int)buf.size()-1);
}

void merge(int cur, int nxt){
	buf[cur].e = buf[nxt].e;
	tree.updateB(1, 0, n, buf[nxt].s, buf[nxt].e, cur);
}

void refresh(int x){
	int cur = getidx(x);
	while(true){
		if (buf[cur].e==n) return;
		
		int nxt = getidx(buf[cur].e+1);
		// printf("cur: (%d, %d, %lld) / nxt: (%d, %d, %lld) / w = %lld\n", buf[cur].s, buf[cur].e, buf[cur].a0, buf[nxt].s, buf[nxt].e, buf[nxt].a0, tree.queryV(1, 0, n, buf[cur].e+1, buf[cur].e+1));
		if (calc(buf[cur].e, cur) + tree.V[buf[cur].e+1] >= buf[nxt].a0) merge(cur, nxt);
		else return;
	}
}

void updateXp(int x, int w){ // between x-1 and x
	// printf("updateXp: %d\n", x);
	split(x);
	tree.update(1, 0, n, x, w);
}

void updateYp(int x, int q){
	// printf("updateYp: %d %d\n", x, q);
	tree.add(1, 0, n, 0, x, q);
	refresh(x);
}


int main(){
	ios_base::sync_with_stdio(0);
	cin.tie(0);

	cin >> n >> m;
	for (int i=1;i<=n;i++) cin >> A[i] >> S[i] >> P[i];
	for (int i=1;i<=m;i++) cin >> B[i] >> T[i] >> Q[i];

	init();

	for (int y=1;y<=m;y++){
		for (auto &x:Vp[y-1]) updateXp(x, 0);
		
		if (Q[y] > 0 && mxA[y] >= 0) updateYp(mxA[y], Q[y]);
		// else if (Q[y] < 0) updateYm(Q[y]);

		// for (auto &x:Vm[y]) updateXm(x);
		// for (int x=0;x<=n;x++) printf("%lld ", calc(x));
		// printf("\n");
	}

	printf("%lld\n", calc(n));
}
# 결과 실행 시간 메모리 Grader output
1 Correct 510 ms 65176 KB Output is correct
2 Correct 454 ms 65108 KB Output is correct
3 Correct 180 ms 58400 KB Output is correct
4 Correct 379 ms 63108 KB Output is correct
5 Correct 14 ms 23956 KB Output is correct
6 Correct 470 ms 64308 KB Output is correct
7 Correct 70 ms 32416 KB Output is correct
8 Correct 77 ms 50476 KB Output is correct
9 Correct 180 ms 58568 KB Output is correct
10 Correct 575 ms 67836 KB Output is correct
11 Correct 162 ms 58220 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 10 ms 23964 KB Output is correct
2 Correct 10 ms 23860 KB Output is correct
3 Correct 15 ms 23964 KB Output is correct
4 Correct 13 ms 23892 KB Output is correct
5 Correct 12 ms 23892 KB Output is correct
6 Correct 12 ms 23940 KB Output is correct
7 Correct 12 ms 24020 KB Output is correct
8 Correct 11 ms 23892 KB Output is correct
9 Correct 12 ms 23972 KB Output is correct
10 Correct 12 ms 23892 KB Output is correct
11 Correct 14 ms 23928 KB Output is correct
12 Correct 13 ms 23892 KB Output is correct
13 Correct 13 ms 23892 KB Output is correct
14 Correct 12 ms 23948 KB Output is correct
15 Correct 13 ms 23892 KB Output is correct
16 Correct 12 ms 23828 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 10 ms 23964 KB Output is correct
2 Correct 10 ms 23860 KB Output is correct
3 Correct 15 ms 23964 KB Output is correct
4 Correct 13 ms 23892 KB Output is correct
5 Correct 12 ms 23892 KB Output is correct
6 Correct 12 ms 23940 KB Output is correct
7 Correct 12 ms 24020 KB Output is correct
8 Correct 11 ms 23892 KB Output is correct
9 Correct 12 ms 23972 KB Output is correct
10 Correct 12 ms 23892 KB Output is correct
11 Correct 14 ms 23928 KB Output is correct
12 Correct 13 ms 23892 KB Output is correct
13 Correct 13 ms 23892 KB Output is correct
14 Correct 12 ms 23948 KB Output is correct
15 Correct 13 ms 23892 KB Output is correct
16 Correct 12 ms 23828 KB Output is correct
17 Correct 13 ms 24404 KB Output is correct
18 Correct 13 ms 24360 KB Output is correct
19 Correct 18 ms 24444 KB Output is correct
20 Correct 15 ms 24356 KB Output is correct
21 Correct 15 ms 24404 KB Output is correct
22 Correct 19 ms 24284 KB Output is correct
23 Correct 17 ms 24332 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 10 ms 23964 KB Output is correct
2 Correct 10 ms 23860 KB Output is correct
3 Correct 15 ms 23964 KB Output is correct
4 Correct 13 ms 23892 KB Output is correct
5 Correct 12 ms 23892 KB Output is correct
6 Correct 12 ms 23940 KB Output is correct
7 Correct 12 ms 24020 KB Output is correct
8 Correct 11 ms 23892 KB Output is correct
9 Correct 12 ms 23972 KB Output is correct
10 Correct 12 ms 23892 KB Output is correct
11 Correct 14 ms 23928 KB Output is correct
12 Correct 13 ms 23892 KB Output is correct
13 Correct 13 ms 23892 KB Output is correct
14 Correct 12 ms 23948 KB Output is correct
15 Correct 13 ms 23892 KB Output is correct
16 Correct 12 ms 23828 KB Output is correct
17 Correct 13 ms 24404 KB Output is correct
18 Correct 13 ms 24360 KB Output is correct
19 Correct 18 ms 24444 KB Output is correct
20 Correct 15 ms 24356 KB Output is correct
21 Correct 15 ms 24404 KB Output is correct
22 Correct 19 ms 24284 KB Output is correct
23 Correct 17 ms 24332 KB Output is correct
24 Correct 285 ms 62628 KB Output is correct
25 Correct 194 ms 58100 KB Output is correct
26 Correct 279 ms 68036 KB Output is correct
27 Correct 202 ms 58068 KB Output is correct
28 Correct 348 ms 60652 KB Output is correct
29 Correct 182 ms 58500 KB Output is correct
30 Correct 916 ms 65692 KB Output is correct
31 Correct 67 ms 32488 KB Output is correct
32 Correct 132 ms 52496 KB Output is correct
33 Correct 513 ms 61920 KB Output is correct
34 Correct 573 ms 64076 KB Output is correct
35 Correct 857 ms 65492 KB Output is correct
36 Correct 835 ms 65340 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 10 ms 23964 KB Output is correct
2 Correct 10 ms 23860 KB Output is correct
3 Correct 15 ms 23964 KB Output is correct
4 Correct 13 ms 23892 KB Output is correct
5 Correct 12 ms 23892 KB Output is correct
6 Correct 12 ms 23940 KB Output is correct
7 Correct 12 ms 24020 KB Output is correct
8 Correct 11 ms 23892 KB Output is correct
9 Correct 12 ms 23972 KB Output is correct
10 Correct 12 ms 23892 KB Output is correct
11 Correct 14 ms 23928 KB Output is correct
12 Correct 13 ms 23892 KB Output is correct
13 Correct 13 ms 23892 KB Output is correct
14 Correct 12 ms 23948 KB Output is correct
15 Correct 13 ms 23892 KB Output is correct
16 Correct 12 ms 23828 KB Output is correct
17 Correct 13 ms 24404 KB Output is correct
18 Correct 13 ms 24360 KB Output is correct
19 Correct 18 ms 24444 KB Output is correct
20 Correct 15 ms 24356 KB Output is correct
21 Correct 15 ms 24404 KB Output is correct
22 Correct 19 ms 24284 KB Output is correct
23 Correct 17 ms 24332 KB Output is correct
24 Correct 285 ms 62628 KB Output is correct
25 Correct 194 ms 58100 KB Output is correct
26 Correct 279 ms 68036 KB Output is correct
27 Correct 202 ms 58068 KB Output is correct
28 Correct 348 ms 60652 KB Output is correct
29 Correct 182 ms 58500 KB Output is correct
30 Correct 916 ms 65692 KB Output is correct
31 Correct 67 ms 32488 KB Output is correct
32 Correct 132 ms 52496 KB Output is correct
33 Correct 513 ms 61920 KB Output is correct
34 Correct 573 ms 64076 KB Output is correct
35 Correct 857 ms 65492 KB Output is correct
36 Correct 835 ms 65340 KB Output is correct
37 Correct 321 ms 68024 KB Output is correct
38 Correct 219 ms 58076 KB Output is correct
39 Correct 605 ms 68108 KB Output is correct
40 Correct 566 ms 68068 KB Output is correct
41 Correct 12 ms 23892 KB Output is correct
42 Correct 869 ms 65612 KB Output is correct
43 Correct 504 ms 61756 KB Output is correct
44 Correct 592 ms 63880 KB Output is correct
45 Correct 832 ms 65296 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 10 ms 23964 KB Output is correct
2 Correct 10 ms 23860 KB Output is correct
3 Correct 15 ms 23964 KB Output is correct
4 Correct 13 ms 23892 KB Output is correct
5 Correct 12 ms 23892 KB Output is correct
6 Correct 12 ms 23940 KB Output is correct
7 Correct 12 ms 24020 KB Output is correct
8 Correct 11 ms 23892 KB Output is correct
9 Correct 12 ms 23972 KB Output is correct
10 Correct 12 ms 23892 KB Output is correct
11 Correct 14 ms 23928 KB Output is correct
12 Correct 13 ms 23892 KB Output is correct
13 Correct 13 ms 23892 KB Output is correct
14 Correct 12 ms 23948 KB Output is correct
15 Correct 13 ms 23892 KB Output is correct
16 Correct 12 ms 23828 KB Output is correct
17 Correct 13 ms 24404 KB Output is correct
18 Correct 13 ms 24360 KB Output is correct
19 Correct 18 ms 24444 KB Output is correct
20 Correct 15 ms 24356 KB Output is correct
21 Correct 15 ms 24404 KB Output is correct
22 Correct 19 ms 24284 KB Output is correct
23 Correct 17 ms 24332 KB Output is correct
24 Correct 285 ms 62628 KB Output is correct
25 Correct 194 ms 58100 KB Output is correct
26 Correct 279 ms 68036 KB Output is correct
27 Correct 202 ms 58068 KB Output is correct
28 Correct 348 ms 60652 KB Output is correct
29 Correct 182 ms 58500 KB Output is correct
30 Correct 916 ms 65692 KB Output is correct
31 Correct 67 ms 32488 KB Output is correct
32 Correct 132 ms 52496 KB Output is correct
33 Correct 513 ms 61920 KB Output is correct
34 Correct 573 ms 64076 KB Output is correct
35 Correct 857 ms 65492 KB Output is correct
36 Correct 835 ms 65340 KB Output is correct
37 Correct 321 ms 68024 KB Output is correct
38 Correct 219 ms 58076 KB Output is correct
39 Correct 605 ms 68108 KB Output is correct
40 Correct 566 ms 68068 KB Output is correct
41 Correct 12 ms 23892 KB Output is correct
42 Correct 869 ms 65612 KB Output is correct
43 Correct 504 ms 61756 KB Output is correct
44 Correct 592 ms 63880 KB Output is correct
45 Correct 832 ms 65296 KB Output is correct
46 Correct 1636 ms 221564 KB Output is correct
47 Correct 1135 ms 175692 KB Output is correct
48 Correct 3227 ms 221408 KB Output is correct
49 Correct 3032 ms 221308 KB Output is correct
50 Correct 5772 ms 209744 KB Output is correct
51 Correct 2974 ms 189880 KB Output is correct
52 Correct 3328 ms 196844 KB Output is correct
53 Correct 5589 ms 209760 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 510 ms 65176 KB Output is correct
2 Correct 454 ms 65108 KB Output is correct
3 Correct 180 ms 58400 KB Output is correct
4 Correct 379 ms 63108 KB Output is correct
5 Correct 14 ms 23956 KB Output is correct
6 Correct 470 ms 64308 KB Output is correct
7 Correct 70 ms 32416 KB Output is correct
8 Correct 77 ms 50476 KB Output is correct
9 Correct 180 ms 58568 KB Output is correct
10 Correct 575 ms 67836 KB Output is correct
11 Correct 162 ms 58220 KB Output is correct
12 Correct 10 ms 23964 KB Output is correct
13 Correct 10 ms 23860 KB Output is correct
14 Correct 15 ms 23964 KB Output is correct
15 Correct 13 ms 23892 KB Output is correct
16 Correct 12 ms 23892 KB Output is correct
17 Correct 12 ms 23940 KB Output is correct
18 Correct 12 ms 24020 KB Output is correct
19 Correct 11 ms 23892 KB Output is correct
20 Correct 12 ms 23972 KB Output is correct
21 Correct 12 ms 23892 KB Output is correct
22 Correct 14 ms 23928 KB Output is correct
23 Correct 13 ms 23892 KB Output is correct
24 Correct 13 ms 23892 KB Output is correct
25 Correct 12 ms 23948 KB Output is correct
26 Correct 13 ms 23892 KB Output is correct
27 Correct 12 ms 23828 KB Output is correct
28 Correct 13 ms 24404 KB Output is correct
29 Correct 13 ms 24360 KB Output is correct
30 Correct 18 ms 24444 KB Output is correct
31 Correct 15 ms 24356 KB Output is correct
32 Correct 15 ms 24404 KB Output is correct
33 Correct 19 ms 24284 KB Output is correct
34 Correct 17 ms 24332 KB Output is correct
35 Correct 285 ms 62628 KB Output is correct
36 Correct 194 ms 58100 KB Output is correct
37 Correct 279 ms 68036 KB Output is correct
38 Correct 202 ms 58068 KB Output is correct
39 Correct 348 ms 60652 KB Output is correct
40 Correct 182 ms 58500 KB Output is correct
41 Correct 916 ms 65692 KB Output is correct
42 Correct 67 ms 32488 KB Output is correct
43 Correct 132 ms 52496 KB Output is correct
44 Correct 513 ms 61920 KB Output is correct
45 Correct 573 ms 64076 KB Output is correct
46 Correct 857 ms 65492 KB Output is correct
47 Correct 835 ms 65340 KB Output is correct
48 Correct 321 ms 68024 KB Output is correct
49 Correct 219 ms 58076 KB Output is correct
50 Correct 605 ms 68108 KB Output is correct
51 Correct 566 ms 68068 KB Output is correct
52 Correct 12 ms 23892 KB Output is correct
53 Correct 869 ms 65612 KB Output is correct
54 Correct 504 ms 61756 KB Output is correct
55 Correct 592 ms 63880 KB Output is correct
56 Correct 832 ms 65296 KB Output is correct
57 Incorrect 280 ms 67620 KB Output isn't correct
58 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 510 ms 65176 KB Output is correct
2 Correct 454 ms 65108 KB Output is correct
3 Correct 180 ms 58400 KB Output is correct
4 Correct 379 ms 63108 KB Output is correct
5 Correct 14 ms 23956 KB Output is correct
6 Correct 470 ms 64308 KB Output is correct
7 Correct 70 ms 32416 KB Output is correct
8 Correct 77 ms 50476 KB Output is correct
9 Correct 180 ms 58568 KB Output is correct
10 Correct 575 ms 67836 KB Output is correct
11 Correct 162 ms 58220 KB Output is correct
12 Correct 10 ms 23964 KB Output is correct
13 Correct 10 ms 23860 KB Output is correct
14 Correct 15 ms 23964 KB Output is correct
15 Correct 13 ms 23892 KB Output is correct
16 Correct 12 ms 23892 KB Output is correct
17 Correct 12 ms 23940 KB Output is correct
18 Correct 12 ms 24020 KB Output is correct
19 Correct 11 ms 23892 KB Output is correct
20 Correct 12 ms 23972 KB Output is correct
21 Correct 12 ms 23892 KB Output is correct
22 Correct 14 ms 23928 KB Output is correct
23 Correct 13 ms 23892 KB Output is correct
24 Correct 13 ms 23892 KB Output is correct
25 Correct 12 ms 23948 KB Output is correct
26 Correct 13 ms 23892 KB Output is correct
27 Correct 12 ms 23828 KB Output is correct
28 Correct 13 ms 24404 KB Output is correct
29 Correct 13 ms 24360 KB Output is correct
30 Correct 18 ms 24444 KB Output is correct
31 Correct 15 ms 24356 KB Output is correct
32 Correct 15 ms 24404 KB Output is correct
33 Correct 19 ms 24284 KB Output is correct
34 Correct 17 ms 24332 KB Output is correct
35 Correct 285 ms 62628 KB Output is correct
36 Correct 194 ms 58100 KB Output is correct
37 Correct 279 ms 68036 KB Output is correct
38 Correct 202 ms 58068 KB Output is correct
39 Correct 348 ms 60652 KB Output is correct
40 Correct 182 ms 58500 KB Output is correct
41 Correct 916 ms 65692 KB Output is correct
42 Correct 67 ms 32488 KB Output is correct
43 Correct 132 ms 52496 KB Output is correct
44 Correct 513 ms 61920 KB Output is correct
45 Correct 573 ms 64076 KB Output is correct
46 Correct 857 ms 65492 KB Output is correct
47 Correct 835 ms 65340 KB Output is correct
48 Correct 321 ms 68024 KB Output is correct
49 Correct 219 ms 58076 KB Output is correct
50 Correct 605 ms 68108 KB Output is correct
51 Correct 566 ms 68068 KB Output is correct
52 Correct 12 ms 23892 KB Output is correct
53 Correct 869 ms 65612 KB Output is correct
54 Correct 504 ms 61756 KB Output is correct
55 Correct 592 ms 63880 KB Output is correct
56 Correct 832 ms 65296 KB Output is correct
57 Correct 1636 ms 221564 KB Output is correct
58 Correct 1135 ms 175692 KB Output is correct
59 Correct 3227 ms 221408 KB Output is correct
60 Correct 3032 ms 221308 KB Output is correct
61 Correct 5772 ms 209744 KB Output is correct
62 Correct 2974 ms 189880 KB Output is correct
63 Correct 3328 ms 196844 KB Output is correct
64 Correct 5589 ms 209760 KB Output is correct
65 Incorrect 280 ms 67620 KB Output isn't correct
66 Halted 0 ms 0 KB -