답안 #405346

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
405346 2021-05-16T09:22:54 Z oolimry Progression (NOI20_progression) C++17
68 / 100
1243 ms 87872 KB
#include <bits/stdc++.h>
using namespace std;
#define all(x) (x).begin(), (x).end()
#define sz(x) ((int) x.size())
#define show(x) cerr << #x << " is " << x << endl;
#define show2(x, y) cerr << #x << " is " << x << ", " << #y << " is " << y << endl;
#define show3(x, y, z) cerr << #x << " is " << x << ", " << #y << " is " << y << ", " << #z << " is " << z << endl;
typedef long long lint;
typedef pair<lint, lint> ii;

struct thing{
	lint leftval, rightval, leftcnt, rightcnt, best, full, sum;
};

inline thing single(int u){
	return {u,u,1,1,1,1,u};
}

inline thing merge(thing L, thing R){
	thing res;
	if(L.full and R.full and L.rightval == R.leftval){
		return {L.leftval, R.rightval, L.leftcnt+R.leftcnt, L.rightcnt+R.rightcnt, L.best+R.best, 1, L.sum+R.sum};
	}
	
	res.leftval = L.leftval, res.rightval = R.rightval;
	res.leftcnt = L.leftcnt, res.rightcnt = R.rightcnt;
	res.best = max(L.best, R.best);
	res.full = 0;
	res.sum = L.sum + R.sum;
	
	if(L.rightval == R.leftval){
		res.best = max(res.best, L.rightcnt + R.leftcnt);
		if(L.full) res.leftcnt += R.leftcnt;
		else if(R.full) res.rightcnt += L.rightcnt;
		res.best = max(res.best, res.leftcnt);
		res.best = max(res.best, res.rightcnt);
	}
	
	return res;
}

lint inf = 1234567890123456;
lint arr[300005];
struct node{
	lint s, e, m;
	thing val;
	lint add = 0;
	lint rewrite = inf;
	node *l, *r;
	
	node(int S, int E){
		s = S, e = E, m = (s+e)/2;
		if(s == e) val = single(arr[s]);
		else{
			l = new node(s,m);
			r = new node(m+1,e);
			val = merge(l->val, r->val);
			add = 0; rewrite = inf;
		}	
	}
	
	void applyadd(lint A){
		val.leftval += A;
		val.rightval += A;
		val.sum += (e-s+1)*A;
		add += A;
	}
	
	void applyrewrite(lint W){
		if(W < inf / 100){
			val.leftval = W;
			val.rightval = W;
			val.leftcnt = (e-s+1);
			val.rightcnt = (e-s+1);
			val.best = (e-s+1);
			val.full = 1;
			val.sum = (e-s+1)*W;
			rewrite = W;
		}
	}
	
	void push(){
		if(add != 0 and s != e){
			l->applyadd(add);
			r->applyadd(add);
			add = 0;
		}
		if(rewrite != inf and s != e){
			l->applyrewrite(rewrite);
			r->applyrewrite(rewrite);
			rewrite = inf;
		}
	}
	
	thing query(int S, int E){
		push();
		if(s == S and E == e) return val;
		else if(E <= m) return l->query(S,E);
		else if(S >= m+1) return r->query(S,E);
		else return merge(l->query(S,m), r->query(m+1,E));
	} 
	
	void updateadd(int S, int E, lint A){
		push();
		if(s == S and E == e){
			applyadd(A);
			push();
		}
		else{
			if(E <= m) l->updateadd(S,E,A);
			else if(S >= m+1) r->updateadd(S,E,A);
			else l->updateadd(S,m,A), r->updateadd(m+1,E,A);
			val = merge(l->val, r->val);
		}
	}
	
	void updaterewrite(int S, int E, lint W){
		push();
		if(s == S and E == e){
			applyrewrite(W);
			push();
		}
		else{
			if(E <= m) l->updaterewrite(S,E,W);
			else if(S >= m+1) r->updaterewrite(S,E,W);
			else l->updaterewrite(S,m,W), r->updaterewrite(m+1,E,W);
			val = merge(l->val, r->val);
		}
	}
} *root;


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

	int n, Q; cin >> n >> Q;
	lint x; cin >> x;
	lint firstval = x;
	
	for(int i = 2;i <= n;i++){
		lint y; cin >> y;
		arr[i-1] = y-x;
		x = y;
	}
	
	if(n != 1) root = new node(1,n-1);
	
	while(Q--){
		lint t, l, r; cin >> t >> l >> r;
		if(t == 3){
			if(l == r) cout << "1\n";
			else cout << root->query(l,r-1).best+1 << '\n';
		}
		else{
			lint a, b; cin >> a >> b;
			if(n == 1) continue;
			if(t == 1){
				if(l != r) root->updateadd(l,r-1,b);
				if(l != 1) root->updateadd(l-1,l-1,a);
				if(r != n) root->updateadd(r,r,-((r-l)*b+a));
				
				if(l == 1) firstval += a;
			}
			else{
				if(r != n){
					lint nxtval = firstval;
					nxtval += root->query(1,r).sum;
					//show2(firstval,nxtval);
					root->updaterewrite(r,r,nxtval-((r-l)*b+a));
				}
				if(l != 1){
					lint preval = firstval;
					if(l != 2) preval += root->query(1,l-2).sum;
					//show2(preval, firstval);
					root->updaterewrite(l-1,l-1,a-preval);
				}
				if(l != r) root->updaterewrite(l,r-1,b);
				
				if(l == 1) firstval = a;
			}
		}
		
		//for(int i = 1;i <= n-1;i++) cout << root->query(i,i).leftval << " "; cout << '\n';
	}
}


# 결과 실행 시간 메모리 Grader output
1 Correct 212 ms 78388 KB Output is correct
2 Correct 108 ms 488 KB Output is correct
3 Correct 112 ms 580 KB Output is correct
4 Correct 108 ms 568 KB Output is correct
5 Correct 112 ms 580 KB Output is correct
6 Correct 110 ms 616 KB Output is correct
7 Correct 115 ms 564 KB Output is correct
8 Correct 1 ms 204 KB Output is correct
9 Correct 1 ms 204 KB Output is correct
10 Correct 1 ms 204 KB Output is correct
11 Correct 212 ms 78388 KB Output is correct
12 Correct 217 ms 78444 KB Output is correct
13 Correct 214 ms 78600 KB Output is correct
14 Correct 220 ms 78660 KB Output is correct
15 Correct 214 ms 78588 KB Output is correct
16 Correct 218 ms 78264 KB Output is correct
17 Correct 218 ms 78276 KB Output is correct
18 Correct 215 ms 78364 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 3 ms 460 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 408 ms 78824 KB Output is correct
2 Correct 102 ms 892 KB Output is correct
3 Correct 95 ms 852 KB Output is correct
4 Correct 86 ms 836 KB Output is correct
5 Correct 118 ms 964 KB Output is correct
6 Correct 96 ms 964 KB Output is correct
7 Correct 97 ms 964 KB Output is correct
8 Correct 1 ms 204 KB Output is correct
9 Correct 1 ms 204 KB Output is correct
10 Correct 1 ms 204 KB Output is correct
11 Correct 447 ms 78492 KB Output is correct
12 Correct 368 ms 78788 KB Output is correct
13 Correct 431 ms 78548 KB Output is correct
14 Correct 453 ms 78532 KB Output is correct
15 Correct 376 ms 78728 KB Output is correct
16 Correct 466 ms 79244 KB Output is correct
17 Correct 443 ms 79132 KB Output is correct
18 Correct 444 ms 79276 KB Output is correct
19 Correct 380 ms 78528 KB Output is correct
20 Correct 384 ms 78504 KB Output is correct
21 Correct 376 ms 78512 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 752 ms 77980 KB Output is correct
2 Correct 144 ms 3524 KB Output is correct
3 Correct 150 ms 3640 KB Output is correct
4 Correct 146 ms 3656 KB Output is correct
5 Correct 151 ms 3696 KB Output is correct
6 Correct 153 ms 3644 KB Output is correct
7 Correct 154 ms 3716 KB Output is correct
8 Correct 1 ms 332 KB Output is correct
9 Correct 1 ms 332 KB Output is correct
10 Correct 1 ms 332 KB Output is correct
11 Correct 763 ms 84356 KB Output is correct
12 Correct 779 ms 87840 KB Output is correct
13 Correct 773 ms 84288 KB Output is correct
14 Correct 763 ms 84484 KB Output is correct
15 Correct 735 ms 87712 KB Output is correct
16 Correct 782 ms 87736 KB Output is correct
17 Correct 831 ms 87808 KB Output is correct
18 Correct 768 ms 87740 KB Output is correct
19 Correct 772 ms 87872 KB Output is correct
20 Correct 737 ms 87592 KB Output is correct
21 Correct 766 ms 87648 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 408 ms 78824 KB Output is correct
2 Correct 102 ms 892 KB Output is correct
3 Correct 95 ms 852 KB Output is correct
4 Correct 86 ms 836 KB Output is correct
5 Correct 118 ms 964 KB Output is correct
6 Correct 96 ms 964 KB Output is correct
7 Correct 97 ms 964 KB Output is correct
8 Correct 1 ms 204 KB Output is correct
9 Correct 1 ms 204 KB Output is correct
10 Correct 1 ms 204 KB Output is correct
11 Correct 447 ms 78492 KB Output is correct
12 Correct 368 ms 78788 KB Output is correct
13 Correct 431 ms 78548 KB Output is correct
14 Correct 453 ms 78532 KB Output is correct
15 Correct 376 ms 78728 KB Output is correct
16 Correct 466 ms 79244 KB Output is correct
17 Correct 443 ms 79132 KB Output is correct
18 Correct 444 ms 79276 KB Output is correct
19 Correct 380 ms 78528 KB Output is correct
20 Correct 384 ms 78504 KB Output is correct
21 Correct 376 ms 78512 KB Output is correct
22 Correct 1147 ms 78160 KB Output is correct
23 Correct 153 ms 656 KB Output is correct
24 Correct 144 ms 660 KB Output is correct
25 Correct 145 ms 492 KB Output is correct
26 Correct 149 ms 592 KB Output is correct
27 Correct 148 ms 628 KB Output is correct
28 Correct 152 ms 656 KB Output is correct
29 Correct 1 ms 204 KB Output is correct
30 Correct 1 ms 204 KB Output is correct
31 Correct 1 ms 204 KB Output is correct
32 Correct 1170 ms 78120 KB Output is correct
33 Correct 1093 ms 78324 KB Output is correct
34 Correct 1243 ms 78224 KB Output is correct
35 Correct 1157 ms 78180 KB Output is correct
36 Correct 1000 ms 78508 KB Output is correct
37 Correct 1018 ms 78444 KB Output is correct
38 Correct 978 ms 78444 KB Output is correct
39 Correct 1126 ms 78376 KB Output is correct
40 Correct 1188 ms 78148 KB Output is correct
41 Correct 1239 ms 78216 KB Output is correct
42 Correct 1216 ms 78444 KB Output is correct
43 Correct 1130 ms 78136 KB Output is correct
44 Correct 1106 ms 78200 KB Output is correct
45 Correct 1096 ms 78060 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 212 ms 78388 KB Output is correct
2 Correct 108 ms 488 KB Output is correct
3 Correct 112 ms 580 KB Output is correct
4 Correct 108 ms 568 KB Output is correct
5 Correct 112 ms 580 KB Output is correct
6 Correct 110 ms 616 KB Output is correct
7 Correct 115 ms 564 KB Output is correct
8 Correct 1 ms 204 KB Output is correct
9 Correct 1 ms 204 KB Output is correct
10 Correct 1 ms 204 KB Output is correct
11 Correct 212 ms 78388 KB Output is correct
12 Correct 217 ms 78444 KB Output is correct
13 Correct 214 ms 78600 KB Output is correct
14 Correct 220 ms 78660 KB Output is correct
15 Correct 214 ms 78588 KB Output is correct
16 Correct 218 ms 78264 KB Output is correct
17 Correct 218 ms 78276 KB Output is correct
18 Correct 215 ms 78364 KB Output is correct
19 Incorrect 3 ms 460 KB Output isn't correct
20 Halted 0 ms 0 KB -