답안 #538139

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
538139 2022-03-16T06:18:02 Z blue Progression (NOI20_progression) C++17
68 / 100
874 ms 63092 KB
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

using ll = long long;
using vll = vector<ll>;


int N, Q;
vll diff;


struct Node
{
	int l, r;

	ll lp = 0; //lp (everything below already includes lp)
	int ns = 1; //node size

	bool ih = 0; //is homogenous (if homogenous, adjust everything below!)

	ll fv = 0; //first value
	int fs = 1; //first size

	ll lv = 0; //last value
	int ls = 1; //last size

	int ts = 1; //total size

	ll sm = 0; //post lp
};

Node singlenode(int i)
{
	return {i, i, 0, 1, 1, diff[i], 1, diff[i], 1, 1, diff[i]};
}

Node combine(Node& A, Node& B)
{
	Node res;

	res.l = A.l;
	res.r = B.r;

	res.lp = 0;
	res.ns = A.ns + B.ns;
	res.ih = 0;

	res.fv = A.fv;
	if(A.fs == A.ns && B.fv == A.fv)
		res.fs = A.fs + B.fs;
	else
		res.fs = A.fs;

	res.lv = B.lv;
	if(B.ls == B.ns && A.lv == B.lv)
		res.ls = A.ls + B.ls;
	else
		res.ls = B.ls;

	res.ts = max(A.ts, B.ts);
	if(A.lv == B.fv)
		res.ts = max(res.ts, A.ls + B.fs);

	res.sm = A.sm + B.sm;

	// cerr << "combine " << A.l << ' ' << A.r << ' ' << A.lv << ' ' << A.ls << " with " << B.l << ' ' << B.r << ' ' << B.fv << ' ' << B.fs << "\n";
	return res;
}

Node combine2(Node A, Node B)
{
	return combine(A, B);
}

void add(Node& A, ll V)
{
	A.lp += V;
	A.fv += V;
	A.lv += V;
	A.sm += V * A.ns;
}

void set(Node& A, ll V)
{
	A.lp = 0;
	A.ih = 1;

	A.fv = A.lv = V;
	A.fs = A.ls = A.ts = A.ns;
	A.sm = A.ns * V;
}



struct segtree
{
	Node v;
	segtree* left = NULL;
	segtree* right = NULL;

	segtree()
	{
		;
	}

	segtree(int L, int R)
	{
		if(L == R) v = singlenode(L);
		else
		{
			left = new segtree(L, (L+R)/2);
			right = new segtree((L+R)/2+1, R);
			v = combine(left->v, right->v);
		}

		// cerr << "Node = " << L << ' ' << R << '\n';
		// cerr << v.fv << ' ' << v.fs << "  " << v.lv << ' ' << v.ls << '\n';
		// cerr << v.ts << '\n';
	}

	void pushdown()
	{
		if(v.ih)
		{
			v.ih = 0;
			set(left->v, v.fv);
			set(right->v, v.fv);
		}
		else
		{
			add(left->v, v.lp);
			add(right->v, v.lp);
			v.lp = 0;
		}
	}

	ll rangesum(int L, int R)
	{
		if(R < v.l || v.r < L) return 0;
		else if(L <= v.l && v.r <= R)
		{
			return v.sm;
		}
		else
		{
			pushdown();
			return left->rangesum(L, R) + right->rangesum(L, R);
		}
	}

	Node getRange(int L, int R)
	{
		if(L <= v.l && v.r <= R) return v;
		else 
		{
			pushdown();
			if(L <= left->v.r && right->v.l <= R) return combine2(left->getRange(L, R), right->getRange(L, R));
			else if(L <= left->v.r) return left->getRange(L, R);
			else return right->getRange(L, R);
		}
	}

	void rangeadd(int L, int R, ll V)
	{
		if(L <= v.l && v.r <= R) add(v, V);
		else
		{
			pushdown();
			if(L <= left->v.r) left->rangeadd(L, R, V);
			if(right->v.l <= R) right->rangeadd(L, R, V);
			v = combine(left->v, right->v);
		}
	}

	void rangeset(int L, int R, ll V)
	{
		// cerr << "range set " << L << ' ' << R << ' ' << V << " at " << 
		if(L <= v.l && v.r <= R) set(v, V);
		else
		{
			pushdown();
			if(L <= left->v.r) left->rangeset(L, R, V);
			if(right->v.l <= R) right->rangeset(L, R, V);
			v = combine(left->v, right->v);
		}

		// cerr << "new range " << v.l << ' ' << v.r << " = " << v.fv << ' ' << v.lv << '\n';
 	}
};




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

	cin >> N >> Q;

	vll D(1+N);
	for(int i = 1; i <= N; i++) cin >> D[i];

	// ll adj = D[1];
	// for(int i = 1; i <= N; i++) D[i] -= adj;

	if(N == 1)
	{
		for(int j = 1; j <= Q; j++)
		{
			int Z;
			cin >> Z;

			int u;
			if(Z <= 2) cin >> u >> u >> u >> u;
			else
			{
				cin >> u >> u;
				cout << 1 << '\n';
			}
		}
		return 0;
	}

	diff = vll(1+N);
	for(int i = 1; i <= N-1; i++) diff[i] = D[i+1] - D[i];

	segtree ST(1, N-1);

	// for(int i = 1; i <= N-1; i++) cerr << diff[i] << ' ';
	// 	cerr << '\n';

	// cerr << "done \n";

	ll A0 = D[1];

	for(int j = 1; j <= Q; j++)
	{
		// cerr << "\n\n\n\n\n\n";
		ll o;
		cin >> o;

		if(o == 1)
		{
			ll L, R, S, C;
			cin >> L >> R >> S >> C;

			if(L > 1)
				ST.rangeadd(L-1, L-1, S);

			if(R < N)
				ST.rangeadd(R, R, -(S + (R-L)*C));

			if(L < R)
				ST.rangeadd(L, R-1, C);

			if(L == 1) A0 += S;
		}
		else if(o == 2)
		{
			ll L, R, S, C;
			cin >> L >> R >> S >> C;
			// S -= adj;

			ll SL = ST.rangesum(1, L-1);
			// ll SR = ST.rangesum(1, R);
			// ll SPL = ST.rangesum(1, L-2);

			ll elementR = ST.rangesum(1, R-1) + A0;

			if(L > 1)
			{
				// cerr << "A rangeset " << L-1 << ' ' << L-1 << ' ' << S - ST.rangesum(1, L-2) << '\n';
				// ST.rangeset(L-1, L-1, S - (A0 + ST.rangesum(1, L-2)));
				// cerr << "rangesum = " << ST.rangesum(1, L-2) << '\n';
				// cerr << "set " << L-1 << " : " << S - ST.rangesum(1, L-2) << '\n';

				ST.rangeadd(L-1, L-1, S - (A0 + SL));
			}

			if(R < N)
			{
				// cerr << "right rangesum = " << ST.rangesum(1, R-1) << '\n';
				// cerr << "right diff = " << ST.rangesum(1, R-1) - (S + (R-L)*C) << '\n';
				// cerr << "rangesum = " << ST.rangesum(1, R-1) << '\n';
				// cerr << "right element = " << S+(R-L)*C << '\n';
				// ST.rangeadd(R, R, ST.rangesum(1, R-1) - (S + (R-L)*C));

				// cerr << "B rangeset " << R << ' ' << R << " : " << ST.rangesum(1, R) - (S + (R-L)*C) << '\n';
				// cerr << ST.rangesum(1, R) << ' ' << S+(R-L)*C << '\n';
				// ST.rangeset(R, R, A0 + ST.rangesum(1, R) - (S + (R-L)*C));

				// ST.rangeset(R, R, (SR - SPL));
				ST.rangeadd(R, R, -(S + (R-L)*C - elementR));
			}

			if(L < R)
			{
				// cerr << "ST range set " << L << ' ' << R-1 << ' ' << C << '\n';
				ST.rangeset(L, R-1, C);
			}

			if(L == 1) A0 = S;
		}
		else if(o == 3)
		{
			int L, R;
			cin >> L >> R;

			if(L == R) cout << 1 << '\n';
			else
			{
				cout << ST.getRange(L, R-1).ts + 1 << '\n';
			}
		}
	}
}
# 결과 실행 시간 메모리 Grader output
1 Correct 161 ms 62128 KB Output is correct
2 Correct 79 ms 832 KB Output is correct
3 Correct 105 ms 812 KB Output is correct
4 Correct 84 ms 844 KB Output is correct
5 Correct 75 ms 920 KB Output is correct
6 Correct 93 ms 940 KB Output is correct
7 Correct 80 ms 832 KB Output is correct
8 Correct 1 ms 212 KB Output is correct
9 Correct 1 ms 212 KB Output is correct
10 Correct 1 ms 340 KB Output is correct
11 Correct 161 ms 62368 KB Output is correct
12 Correct 170 ms 62264 KB Output is correct
13 Correct 185 ms 62564 KB Output is correct
14 Correct 183 ms 62584 KB Output is correct
15 Correct 170 ms 62520 KB Output is correct
16 Correct 228 ms 62276 KB Output is correct
17 Correct 166 ms 62256 KB Output is correct
18 Correct 190 ms 62388 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 4 ms 468 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 341 ms 62508 KB Output is correct
2 Correct 121 ms 1028 KB Output is correct
3 Correct 89 ms 948 KB Output is correct
4 Correct 80 ms 960 KB Output is correct
5 Correct 109 ms 1184 KB Output is correct
6 Correct 86 ms 1080 KB Output is correct
7 Correct 97 ms 1080 KB Output is correct
8 Correct 1 ms 212 KB Output is correct
9 Correct 1 ms 212 KB Output is correct
10 Correct 1 ms 212 KB Output is correct
11 Correct 436 ms 62328 KB Output is correct
12 Correct 364 ms 62536 KB Output is correct
13 Correct 426 ms 62352 KB Output is correct
14 Correct 421 ms 62236 KB Output is correct
15 Correct 450 ms 62496 KB Output is correct
16 Correct 491 ms 62864 KB Output is correct
17 Correct 450 ms 62828 KB Output is correct
18 Correct 485 ms 63092 KB Output is correct
19 Correct 372 ms 62220 KB Output is correct
20 Correct 340 ms 62204 KB Output is correct
21 Correct 349 ms 62220 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 660 ms 61744 KB Output is correct
2 Correct 134 ms 536 KB Output is correct
3 Correct 162 ms 576 KB Output is correct
4 Correct 134 ms 460 KB Output is correct
5 Correct 137 ms 532 KB Output is correct
6 Correct 141 ms 532 KB Output is correct
7 Correct 154 ms 524 KB Output is correct
8 Correct 1 ms 212 KB Output is correct
9 Correct 1 ms 212 KB Output is correct
10 Correct 1 ms 212 KB Output is correct
11 Correct 708 ms 61700 KB Output is correct
12 Correct 667 ms 61664 KB Output is correct
13 Correct 659 ms 61728 KB Output is correct
14 Correct 674 ms 61724 KB Output is correct
15 Correct 615 ms 61636 KB Output is correct
16 Correct 687 ms 61808 KB Output is correct
17 Correct 715 ms 62088 KB Output is correct
18 Correct 675 ms 61716 KB Output is correct
19 Correct 627 ms 61624 KB Output is correct
20 Correct 636 ms 61752 KB Output is correct
21 Correct 688 ms 61916 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 341 ms 62508 KB Output is correct
2 Correct 121 ms 1028 KB Output is correct
3 Correct 89 ms 948 KB Output is correct
4 Correct 80 ms 960 KB Output is correct
5 Correct 109 ms 1184 KB Output is correct
6 Correct 86 ms 1080 KB Output is correct
7 Correct 97 ms 1080 KB Output is correct
8 Correct 1 ms 212 KB Output is correct
9 Correct 1 ms 212 KB Output is correct
10 Correct 1 ms 212 KB Output is correct
11 Correct 436 ms 62328 KB Output is correct
12 Correct 364 ms 62536 KB Output is correct
13 Correct 426 ms 62352 KB Output is correct
14 Correct 421 ms 62236 KB Output is correct
15 Correct 450 ms 62496 KB Output is correct
16 Correct 491 ms 62864 KB Output is correct
17 Correct 450 ms 62828 KB Output is correct
18 Correct 485 ms 63092 KB Output is correct
19 Correct 372 ms 62220 KB Output is correct
20 Correct 340 ms 62204 KB Output is correct
21 Correct 349 ms 62220 KB Output is correct
22 Correct 837 ms 61952 KB Output is correct
23 Correct 154 ms 796 KB Output is correct
24 Correct 130 ms 756 KB Output is correct
25 Correct 150 ms 740 KB Output is correct
26 Correct 133 ms 800 KB Output is correct
27 Correct 131 ms 748 KB Output is correct
28 Correct 181 ms 860 KB Output is correct
29 Correct 1 ms 212 KB Output is correct
30 Correct 1 ms 324 KB Output is correct
31 Correct 1 ms 212 KB Output is correct
32 Correct 839 ms 61984 KB Output is correct
33 Correct 808 ms 62028 KB Output is correct
34 Correct 838 ms 62068 KB Output is correct
35 Correct 843 ms 62060 KB Output is correct
36 Correct 669 ms 62240 KB Output is correct
37 Correct 666 ms 62168 KB Output is correct
38 Correct 644 ms 62356 KB Output is correct
39 Correct 788 ms 62208 KB Output is correct
40 Correct 874 ms 62024 KB Output is correct
41 Correct 857 ms 62068 KB Output is correct
42 Correct 842 ms 61940 KB Output is correct
43 Correct 817 ms 61900 KB Output is correct
44 Correct 806 ms 61828 KB Output is correct
45 Correct 818 ms 61912 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 161 ms 62128 KB Output is correct
2 Correct 79 ms 832 KB Output is correct
3 Correct 105 ms 812 KB Output is correct
4 Correct 84 ms 844 KB Output is correct
5 Correct 75 ms 920 KB Output is correct
6 Correct 93 ms 940 KB Output is correct
7 Correct 80 ms 832 KB Output is correct
8 Correct 1 ms 212 KB Output is correct
9 Correct 1 ms 212 KB Output is correct
10 Correct 1 ms 340 KB Output is correct
11 Correct 161 ms 62368 KB Output is correct
12 Correct 170 ms 62264 KB Output is correct
13 Correct 185 ms 62564 KB Output is correct
14 Correct 183 ms 62584 KB Output is correct
15 Correct 170 ms 62520 KB Output is correct
16 Correct 228 ms 62276 KB Output is correct
17 Correct 166 ms 62256 KB Output is correct
18 Correct 190 ms 62388 KB Output is correct
19 Incorrect 4 ms 468 KB Output isn't correct
20 Halted 0 ms 0 KB -