답안 #767806

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
767806 2023-06-27T07:47:44 Z qwerasdfzxcl Two Dishes (JOI19_dishes) C++17
74 / 100
5915 ms 214028 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];
	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){
			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;
			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.queryV(1, 0, n, buf[cur].e+1, 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 496 ms 63984 KB Output is correct
2 Correct 459 ms 63668 KB Output is correct
3 Correct 176 ms 56848 KB Output is correct
4 Correct 387 ms 61584 KB Output is correct
5 Correct 12 ms 23892 KB Output is correct
6 Correct 488 ms 62748 KB Output is correct
7 Correct 67 ms 32200 KB Output is correct
8 Correct 89 ms 48504 KB Output is correct
9 Correct 186 ms 56936 KB Output is correct
10 Correct 593 ms 65976 KB Output is correct
11 Correct 155 ms 56440 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 12 ms 23928 KB Output is correct
2 Correct 12 ms 23952 KB Output is correct
3 Correct 13 ms 23836 KB Output is correct
4 Correct 12 ms 23848 KB Output is correct
5 Correct 11 ms 23892 KB Output is correct
6 Correct 12 ms 23832 KB Output is correct
7 Correct 12 ms 23940 KB Output is correct
8 Correct 12 ms 23840 KB Output is correct
9 Correct 12 ms 23940 KB Output is correct
10 Correct 11 ms 23840 KB Output is correct
11 Correct 12 ms 23836 KB Output is correct
12 Correct 12 ms 23896 KB Output is correct
13 Correct 13 ms 23836 KB Output is correct
14 Correct 11 ms 23892 KB Output is correct
15 Correct 13 ms 23892 KB Output is correct
16 Correct 11 ms 23848 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 12 ms 23928 KB Output is correct
2 Correct 12 ms 23952 KB Output is correct
3 Correct 13 ms 23836 KB Output is correct
4 Correct 12 ms 23848 KB Output is correct
5 Correct 11 ms 23892 KB Output is correct
6 Correct 12 ms 23832 KB Output is correct
7 Correct 12 ms 23940 KB Output is correct
8 Correct 12 ms 23840 KB Output is correct
9 Correct 12 ms 23940 KB Output is correct
10 Correct 11 ms 23840 KB Output is correct
11 Correct 12 ms 23836 KB Output is correct
12 Correct 12 ms 23896 KB Output is correct
13 Correct 13 ms 23836 KB Output is correct
14 Correct 11 ms 23892 KB Output is correct
15 Correct 13 ms 23892 KB Output is correct
16 Correct 11 ms 23848 KB Output is correct
17 Correct 12 ms 24344 KB Output is correct
18 Correct 13 ms 24228 KB Output is correct
19 Correct 17 ms 24360 KB Output is correct
20 Correct 15 ms 24304 KB Output is correct
21 Correct 16 ms 24388 KB Output is correct
22 Correct 17 ms 24368 KB Output is correct
23 Correct 16 ms 24316 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 12 ms 23928 KB Output is correct
2 Correct 12 ms 23952 KB Output is correct
3 Correct 13 ms 23836 KB Output is correct
4 Correct 12 ms 23848 KB Output is correct
5 Correct 11 ms 23892 KB Output is correct
6 Correct 12 ms 23832 KB Output is correct
7 Correct 12 ms 23940 KB Output is correct
8 Correct 12 ms 23840 KB Output is correct
9 Correct 12 ms 23940 KB Output is correct
10 Correct 11 ms 23840 KB Output is correct
11 Correct 12 ms 23836 KB Output is correct
12 Correct 12 ms 23896 KB Output is correct
13 Correct 13 ms 23836 KB Output is correct
14 Correct 11 ms 23892 KB Output is correct
15 Correct 13 ms 23892 KB Output is correct
16 Correct 11 ms 23848 KB Output is correct
17 Correct 12 ms 24344 KB Output is correct
18 Correct 13 ms 24228 KB Output is correct
19 Correct 17 ms 24360 KB Output is correct
20 Correct 15 ms 24304 KB Output is correct
21 Correct 16 ms 24388 KB Output is correct
22 Correct 17 ms 24368 KB Output is correct
23 Correct 16 ms 24316 KB Output is correct
24 Correct 264 ms 60968 KB Output is correct
25 Correct 190 ms 56500 KB Output is correct
26 Correct 282 ms 66504 KB Output is correct
27 Correct 217 ms 56720 KB Output is correct
28 Correct 350 ms 59004 KB Output is correct
29 Correct 166 ms 56924 KB Output is correct
30 Correct 873 ms 64156 KB Output is correct
31 Correct 64 ms 32172 KB Output is correct
32 Correct 133 ms 50680 KB Output is correct
33 Correct 504 ms 60184 KB Output is correct
34 Correct 571 ms 62156 KB Output is correct
35 Correct 866 ms 63520 KB Output is correct
36 Correct 845 ms 63420 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 12 ms 23928 KB Output is correct
2 Correct 12 ms 23952 KB Output is correct
3 Correct 13 ms 23836 KB Output is correct
4 Correct 12 ms 23848 KB Output is correct
5 Correct 11 ms 23892 KB Output is correct
6 Correct 12 ms 23832 KB Output is correct
7 Correct 12 ms 23940 KB Output is correct
8 Correct 12 ms 23840 KB Output is correct
9 Correct 12 ms 23940 KB Output is correct
10 Correct 11 ms 23840 KB Output is correct
11 Correct 12 ms 23836 KB Output is correct
12 Correct 12 ms 23896 KB Output is correct
13 Correct 13 ms 23836 KB Output is correct
14 Correct 11 ms 23892 KB Output is correct
15 Correct 13 ms 23892 KB Output is correct
16 Correct 11 ms 23848 KB Output is correct
17 Correct 12 ms 24344 KB Output is correct
18 Correct 13 ms 24228 KB Output is correct
19 Correct 17 ms 24360 KB Output is correct
20 Correct 15 ms 24304 KB Output is correct
21 Correct 16 ms 24388 KB Output is correct
22 Correct 17 ms 24368 KB Output is correct
23 Correct 16 ms 24316 KB Output is correct
24 Correct 264 ms 60968 KB Output is correct
25 Correct 190 ms 56500 KB Output is correct
26 Correct 282 ms 66504 KB Output is correct
27 Correct 217 ms 56720 KB Output is correct
28 Correct 350 ms 59004 KB Output is correct
29 Correct 166 ms 56924 KB Output is correct
30 Correct 873 ms 64156 KB Output is correct
31 Correct 64 ms 32172 KB Output is correct
32 Correct 133 ms 50680 KB Output is correct
33 Correct 504 ms 60184 KB Output is correct
34 Correct 571 ms 62156 KB Output is correct
35 Correct 866 ms 63520 KB Output is correct
36 Correct 845 ms 63420 KB Output is correct
37 Correct 316 ms 66232 KB Output is correct
38 Correct 221 ms 56180 KB Output is correct
39 Correct 639 ms 66144 KB Output is correct
40 Correct 615 ms 65964 KB Output is correct
41 Correct 12 ms 23892 KB Output is correct
42 Correct 908 ms 63636 KB Output is correct
43 Correct 512 ms 59760 KB Output is correct
44 Correct 585 ms 61632 KB Output is correct
45 Correct 875 ms 63252 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 12 ms 23928 KB Output is correct
2 Correct 12 ms 23952 KB Output is correct
3 Correct 13 ms 23836 KB Output is correct
4 Correct 12 ms 23848 KB Output is correct
5 Correct 11 ms 23892 KB Output is correct
6 Correct 12 ms 23832 KB Output is correct
7 Correct 12 ms 23940 KB Output is correct
8 Correct 12 ms 23840 KB Output is correct
9 Correct 12 ms 23940 KB Output is correct
10 Correct 11 ms 23840 KB Output is correct
11 Correct 12 ms 23836 KB Output is correct
12 Correct 12 ms 23896 KB Output is correct
13 Correct 13 ms 23836 KB Output is correct
14 Correct 11 ms 23892 KB Output is correct
15 Correct 13 ms 23892 KB Output is correct
16 Correct 11 ms 23848 KB Output is correct
17 Correct 12 ms 24344 KB Output is correct
18 Correct 13 ms 24228 KB Output is correct
19 Correct 17 ms 24360 KB Output is correct
20 Correct 15 ms 24304 KB Output is correct
21 Correct 16 ms 24388 KB Output is correct
22 Correct 17 ms 24368 KB Output is correct
23 Correct 16 ms 24316 KB Output is correct
24 Correct 264 ms 60968 KB Output is correct
25 Correct 190 ms 56500 KB Output is correct
26 Correct 282 ms 66504 KB Output is correct
27 Correct 217 ms 56720 KB Output is correct
28 Correct 350 ms 59004 KB Output is correct
29 Correct 166 ms 56924 KB Output is correct
30 Correct 873 ms 64156 KB Output is correct
31 Correct 64 ms 32172 KB Output is correct
32 Correct 133 ms 50680 KB Output is correct
33 Correct 504 ms 60184 KB Output is correct
34 Correct 571 ms 62156 KB Output is correct
35 Correct 866 ms 63520 KB Output is correct
36 Correct 845 ms 63420 KB Output is correct
37 Correct 316 ms 66232 KB Output is correct
38 Correct 221 ms 56180 KB Output is correct
39 Correct 639 ms 66144 KB Output is correct
40 Correct 615 ms 65964 KB Output is correct
41 Correct 12 ms 23892 KB Output is correct
42 Correct 908 ms 63636 KB Output is correct
43 Correct 512 ms 59760 KB Output is correct
44 Correct 585 ms 61632 KB Output is correct
45 Correct 875 ms 63252 KB Output is correct
46 Correct 1657 ms 214028 KB Output is correct
47 Correct 1106 ms 167808 KB Output is correct
48 Correct 3406 ms 213540 KB Output is correct
49 Correct 3223 ms 213536 KB Output is correct
50 Correct 5915 ms 201920 KB Output is correct
51 Correct 3114 ms 182696 KB Output is correct
52 Correct 3301 ms 189176 KB Output is correct
53 Correct 5664 ms 201484 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 496 ms 63984 KB Output is correct
2 Correct 459 ms 63668 KB Output is correct
3 Correct 176 ms 56848 KB Output is correct
4 Correct 387 ms 61584 KB Output is correct
5 Correct 12 ms 23892 KB Output is correct
6 Correct 488 ms 62748 KB Output is correct
7 Correct 67 ms 32200 KB Output is correct
8 Correct 89 ms 48504 KB Output is correct
9 Correct 186 ms 56936 KB Output is correct
10 Correct 593 ms 65976 KB Output is correct
11 Correct 155 ms 56440 KB Output is correct
12 Correct 12 ms 23928 KB Output is correct
13 Correct 12 ms 23952 KB Output is correct
14 Correct 13 ms 23836 KB Output is correct
15 Correct 12 ms 23848 KB Output is correct
16 Correct 11 ms 23892 KB Output is correct
17 Correct 12 ms 23832 KB Output is correct
18 Correct 12 ms 23940 KB Output is correct
19 Correct 12 ms 23840 KB Output is correct
20 Correct 12 ms 23940 KB Output is correct
21 Correct 11 ms 23840 KB Output is correct
22 Correct 12 ms 23836 KB Output is correct
23 Correct 12 ms 23896 KB Output is correct
24 Correct 13 ms 23836 KB Output is correct
25 Correct 11 ms 23892 KB Output is correct
26 Correct 13 ms 23892 KB Output is correct
27 Correct 11 ms 23848 KB Output is correct
28 Correct 12 ms 24344 KB Output is correct
29 Correct 13 ms 24228 KB Output is correct
30 Correct 17 ms 24360 KB Output is correct
31 Correct 15 ms 24304 KB Output is correct
32 Correct 16 ms 24388 KB Output is correct
33 Correct 17 ms 24368 KB Output is correct
34 Correct 16 ms 24316 KB Output is correct
35 Correct 264 ms 60968 KB Output is correct
36 Correct 190 ms 56500 KB Output is correct
37 Correct 282 ms 66504 KB Output is correct
38 Correct 217 ms 56720 KB Output is correct
39 Correct 350 ms 59004 KB Output is correct
40 Correct 166 ms 56924 KB Output is correct
41 Correct 873 ms 64156 KB Output is correct
42 Correct 64 ms 32172 KB Output is correct
43 Correct 133 ms 50680 KB Output is correct
44 Correct 504 ms 60184 KB Output is correct
45 Correct 571 ms 62156 KB Output is correct
46 Correct 866 ms 63520 KB Output is correct
47 Correct 845 ms 63420 KB Output is correct
48 Correct 316 ms 66232 KB Output is correct
49 Correct 221 ms 56180 KB Output is correct
50 Correct 639 ms 66144 KB Output is correct
51 Correct 615 ms 65964 KB Output is correct
52 Correct 12 ms 23892 KB Output is correct
53 Correct 908 ms 63636 KB Output is correct
54 Correct 512 ms 59760 KB Output is correct
55 Correct 585 ms 61632 KB Output is correct
56 Correct 875 ms 63252 KB Output is correct
57 Incorrect 303 ms 66104 KB Output isn't correct
58 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 496 ms 63984 KB Output is correct
2 Correct 459 ms 63668 KB Output is correct
3 Correct 176 ms 56848 KB Output is correct
4 Correct 387 ms 61584 KB Output is correct
5 Correct 12 ms 23892 KB Output is correct
6 Correct 488 ms 62748 KB Output is correct
7 Correct 67 ms 32200 KB Output is correct
8 Correct 89 ms 48504 KB Output is correct
9 Correct 186 ms 56936 KB Output is correct
10 Correct 593 ms 65976 KB Output is correct
11 Correct 155 ms 56440 KB Output is correct
12 Correct 12 ms 23928 KB Output is correct
13 Correct 12 ms 23952 KB Output is correct
14 Correct 13 ms 23836 KB Output is correct
15 Correct 12 ms 23848 KB Output is correct
16 Correct 11 ms 23892 KB Output is correct
17 Correct 12 ms 23832 KB Output is correct
18 Correct 12 ms 23940 KB Output is correct
19 Correct 12 ms 23840 KB Output is correct
20 Correct 12 ms 23940 KB Output is correct
21 Correct 11 ms 23840 KB Output is correct
22 Correct 12 ms 23836 KB Output is correct
23 Correct 12 ms 23896 KB Output is correct
24 Correct 13 ms 23836 KB Output is correct
25 Correct 11 ms 23892 KB Output is correct
26 Correct 13 ms 23892 KB Output is correct
27 Correct 11 ms 23848 KB Output is correct
28 Correct 12 ms 24344 KB Output is correct
29 Correct 13 ms 24228 KB Output is correct
30 Correct 17 ms 24360 KB Output is correct
31 Correct 15 ms 24304 KB Output is correct
32 Correct 16 ms 24388 KB Output is correct
33 Correct 17 ms 24368 KB Output is correct
34 Correct 16 ms 24316 KB Output is correct
35 Correct 264 ms 60968 KB Output is correct
36 Correct 190 ms 56500 KB Output is correct
37 Correct 282 ms 66504 KB Output is correct
38 Correct 217 ms 56720 KB Output is correct
39 Correct 350 ms 59004 KB Output is correct
40 Correct 166 ms 56924 KB Output is correct
41 Correct 873 ms 64156 KB Output is correct
42 Correct 64 ms 32172 KB Output is correct
43 Correct 133 ms 50680 KB Output is correct
44 Correct 504 ms 60184 KB Output is correct
45 Correct 571 ms 62156 KB Output is correct
46 Correct 866 ms 63520 KB Output is correct
47 Correct 845 ms 63420 KB Output is correct
48 Correct 316 ms 66232 KB Output is correct
49 Correct 221 ms 56180 KB Output is correct
50 Correct 639 ms 66144 KB Output is correct
51 Correct 615 ms 65964 KB Output is correct
52 Correct 12 ms 23892 KB Output is correct
53 Correct 908 ms 63636 KB Output is correct
54 Correct 512 ms 59760 KB Output is correct
55 Correct 585 ms 61632 KB Output is correct
56 Correct 875 ms 63252 KB Output is correct
57 Correct 1657 ms 214028 KB Output is correct
58 Correct 1106 ms 167808 KB Output is correct
59 Correct 3406 ms 213540 KB Output is correct
60 Correct 3223 ms 213536 KB Output is correct
61 Correct 5915 ms 201920 KB Output is correct
62 Correct 3114 ms 182696 KB Output is correct
63 Correct 3301 ms 189176 KB Output is correct
64 Correct 5664 ms 201484 KB Output is correct
65 Incorrect 303 ms 66104 KB Output isn't correct
66 Halted 0 ms 0 KB -