답안 #538176

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
538176 2022-03-16T07:32:03 Z blue Progression (NOI20_progression) C++17
74 / 100
3000 ms 65028 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);

				for(int f = L; f <= R-1; f++)
					ST.rangeadd(f, f, C - ST.rangesum(f, f));
			}
 
			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 Execution timed out 3048 ms 61756 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 28 ms 528 KB Output is correct
2 Correct 1 ms 324 KB Output is correct
3 Correct 2 ms 332 KB Output is correct
4 Correct 1 ms 212 KB Output is correct
5 Correct 1 ms 212 KB Output is correct
6 Correct 1 ms 332 KB Output is correct
7 Correct 1 ms 332 KB Output is correct
8 Correct 27 ms 524 KB Output is correct
9 Correct 27 ms 468 KB Output is correct
10 Correct 30 ms 536 KB Output is correct
11 Correct 12 ms 540 KB Output is correct
12 Correct 33 ms 468 KB Output is correct
13 Correct 10 ms 468 KB Output is correct
14 Correct 11 ms 460 KB Output is correct
15 Correct 26 ms 584 KB Output is correct
16 Correct 29 ms 460 KB Output is correct
17 Correct 26 ms 468 KB Output is correct
18 Correct 30 ms 468 KB Output is correct
19 Correct 2 ms 320 KB Output is correct
20 Correct 2 ms 212 KB Output is correct
21 Correct 1 ms 212 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 332 ms 62460 KB Output is correct
2 Correct 83 ms 1964 KB Output is correct
3 Correct 84 ms 1976 KB Output is correct
4 Correct 71 ms 1964 KB Output is correct
5 Correct 80 ms 2124 KB Output is correct
6 Correct 85 ms 2052 KB Output is correct
7 Correct 81 ms 2108 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 409 ms 64120 KB Output is correct
12 Correct 306 ms 64776 KB Output is correct
13 Correct 379 ms 64304 KB Output is correct
14 Correct 408 ms 64276 KB Output is correct
15 Correct 303 ms 64556 KB Output is correct
16 Correct 410 ms 64816 KB Output is correct
17 Correct 386 ms 64824 KB Output is correct
18 Correct 398 ms 65028 KB Output is correct
19 Correct 315 ms 64168 KB Output is correct
20 Correct 317 ms 64196 KB Output is correct
21 Correct 306 ms 64204 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 636 ms 61916 KB Output is correct
2 Correct 123 ms 1356 KB Output is correct
3 Correct 131 ms 1524 KB Output is correct
4 Correct 125 ms 1356 KB Output is correct
5 Correct 131 ms 1428 KB Output is correct
6 Correct 129 ms 1364 KB Output is correct
7 Correct 128 ms 1476 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 632 ms 62596 KB Output is correct
12 Correct 624 ms 62580 KB Output is correct
13 Correct 630 ms 62556 KB Output is correct
14 Correct 695 ms 62508 KB Output is correct
15 Correct 609 ms 62372 KB Output is correct
16 Correct 656 ms 62680 KB Output is correct
17 Correct 638 ms 62652 KB Output is correct
18 Correct 644 ms 62728 KB Output is correct
19 Correct 607 ms 62596 KB Output is correct
20 Correct 596 ms 62676 KB Output is correct
21 Correct 605 ms 62976 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 332 ms 62460 KB Output is correct
2 Correct 83 ms 1964 KB Output is correct
3 Correct 84 ms 1976 KB Output is correct
4 Correct 71 ms 1964 KB Output is correct
5 Correct 80 ms 2124 KB Output is correct
6 Correct 85 ms 2052 KB Output is correct
7 Correct 81 ms 2108 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 409 ms 64120 KB Output is correct
12 Correct 306 ms 64776 KB Output is correct
13 Correct 379 ms 64304 KB Output is correct
14 Correct 408 ms 64276 KB Output is correct
15 Correct 303 ms 64556 KB Output is correct
16 Correct 410 ms 64816 KB Output is correct
17 Correct 386 ms 64824 KB Output is correct
18 Correct 398 ms 65028 KB Output is correct
19 Correct 315 ms 64168 KB Output is correct
20 Correct 317 ms 64196 KB Output is correct
21 Correct 306 ms 64204 KB Output is correct
22 Correct 761 ms 63996 KB Output is correct
23 Correct 135 ms 2764 KB Output is correct
24 Correct 134 ms 2716 KB Output is correct
25 Correct 124 ms 2760 KB Output is correct
26 Correct 130 ms 2792 KB Output is correct
27 Correct 131 ms 2780 KB Output is correct
28 Correct 133 ms 2772 KB Output is correct
29 Correct 1 ms 212 KB Output is correct
30 Correct 1 ms 340 KB Output is correct
31 Correct 1 ms 332 KB Output is correct
32 Correct 823 ms 63956 KB Output is correct
33 Correct 740 ms 63944 KB Output is correct
34 Correct 791 ms 63980 KB Output is correct
35 Correct 827 ms 63892 KB Output is correct
36 Correct 636 ms 64052 KB Output is correct
37 Correct 620 ms 64012 KB Output is correct
38 Correct 643 ms 64088 KB Output is correct
39 Correct 758 ms 63700 KB Output is correct
40 Correct 793 ms 63820 KB Output is correct
41 Correct 830 ms 63696 KB Output is correct
42 Correct 831 ms 63572 KB Output is correct
43 Correct 729 ms 63512 KB Output is correct
44 Correct 798 ms 63408 KB Output is correct
45 Correct 749 ms 63332 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 3048 ms 61756 KB Time limit exceeded
2 Halted 0 ms 0 KB -