답안 #585181

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
585181 2022-06-28T12:03:19 Z GioChkhaidze Progression (NOI20_progression) C++14
57 / 100
882 ms 79716 KB
// Source: https://usaco.guide/general/io

#include <bits/stdc++.h>

#define lf (h << 1)
#define mf ((l + r) >> 1)
#define rf ((h << 1) | 1)
#define tree int h, int l, int r 
#define left lf, l, mf
#define right rf, mf + 1, r
#define ll long long
#define f first
#define s second

using namespace std;

const int N = 3e5 + 5;

int n, m, q, L, R, id;
ll S, C, vl, a[N], b[N];

struct node {
	int ans;
	int len;
	int fr;
	int ls;
	int pr;
	int sf;
	ll add;
	ll sum;
	ll toggle;
	bool flag;
	node () {
		toggle = 0;
		flag = 0;
		sum = 0;
		ans = 0;
		len = 0;
		add = 0;
		fr = 0;
		ls = 0;
		pr = 0;
		sf = 0;
	}
};

node v[4 * N], bs;

node mrg(node a, node b) {
	node c;
	c.len = a.len + b.len;
	c.fr = a.fr, c.ls = b.ls;
	c.pr = a.pr, c.sf = b.sf;
	c.ans = max(a.ans, b.ans);
	c.sum = a.sum + b.sum;
	if (a.ls == b.fr) {
		if (a.len == c.pr) c.pr += b.pr;
		if (b.len == c.sf) c.sf += a.sf;
		c.ans = max(c.ans, a.sf + b.pr);
	}
	return c;
} 

void shift(tree) {
	if (v[h].flag) {
		assert(v[h].add == 0);
		ll x = v[h].toggle;
		v[lf].fr = v[lf].ls = x;
		v[rf].fr = v[rf].ls =x;
		v[h].ans = v[h].pr = v[h].sf = r - l + 1;
		v[lf].toggle = v[rf].toggle = x;
		v[lf].flag = v[rf].flag = true;
		v[lf].add = v[rf].add = false; 
		v[lf].sum = (mf - l + 1) * x;
		v[rf].sum = (r - mf) * x;
		v[h].toggle = 0;
		v[h].flag = 0;
		return ;
	}

	if (v[h].add) {
		v[lf].fr += v[h].add;
		v[lf].ls += v[h].add;
		v[rf].fr += v[h].add;
		v[rf].ls += v[h].add;
		v[lf].sum += (mf - l + 1) * v[h].add;
		v[rf].sum += (r - mf) * v[h].add;

		if (v[lf].flag) v[lf].toggle += v[h].add;
			else v[lf].add += v[h].add;
		
		if (v[rf].flag) v[rf].toggle += v[h].add;
			else v[rf].add += v[h].add;

		v[h].add = 0;
		return ;
	}
}

void build(tree) {
	if (l == r) {
		v[h].pr = v[h].sf = v[h].len = v[h].ans = 1;
		v[h].fr = v[h].ls = v[h].sum = b[l];
		return ;
	}
	build(left), build(right);
	v[h] = mrg(v[lf], v[rf]);
}

void up_range(tree) {
	if (R < l || r < L) return ;
	if (L <= l && r <= R) {
		v[h].fr += C, v[h].ls += C;
		v[h].sum += (r - l + 1) * C;
		if (v[h].flag) {
			v[h].toggle += C;
			v[h].add = 0;
		}
			else {
			v[h].add += C;
		}
		return;
	}
	shift(h, l, r);
	up_range(left);
	up_range(right);
	v[h] = mrg(v[lf], v[rf]);
}

void up_dot(tree) {
	if (l == r) {
		v[h].pr = v[h].sf = v[h].len = v[h].ans = 1;
		v[h].fr = v[h].ls = v[h].sum = b[l];
		return;
	}
	shift(h, l, r);
	if (id <= mf) {
		up_dot(left);
	}
		else {
		up_dot(right);
	}
	v[h] = mrg(v[lf], v[rf]);
}

void up_to_range(tree) {
	if (r < L || R < l) return ;
	if (L <= l && r <= R) {
		v[h].ans = v[h].pr = v[h].sf = r - l + 1;
		v[h].toggle = v[h].fr = v[h].ls = C;
		v[h].sum = (r - l + 1) * C;
		v[h].flag = true;
		v[h].add = 0;
		return;
	}
	shift(h, l, r);
	up_to_range(left);
	up_to_range(right);
	v[h] = mrg(v[lf], v[rf]);
}

ll get_avl(tree, int id) {
	if (r < 1 || id < l) return 0;
	if (1 <= l && r <= id) return v[h].sum;
	shift(h, l, r);
	return get_avl(left, id) + get_avl(right, id);
}

ll get_vl(tree) {
	if (l == r) return v[h].fr;
	shift(h, l, r);
	if (id <= mf) {
		ll x =  get_vl(left);
		v[h] = mrg(v[lf], v[rf]);
		return x;
	}
	ll x = get_vl(right);
	v[h] = mrg(v[lf], v[rf]);
	return x;
}

node get(tree) {
	if (r < L || R < l) return bs;
	if (L <= l && r <= R) return v[h];
	shift(h, l, r);
	return mrg(get(left), get(right));
}

ll Avl(int x) {
	return a[1] + get_avl(1, 1, m, x - 1);
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cin >> n >> q;
	for (int i = 1; i <= n; ++i) {
		cin >> a[i];
		if (1 < i) {
			b[i - 1] = a[i] - a[i - 1];
		} 
	}

	m = n + 1;
	build(1, 1, m);
	for (int i = 1; i <= q; ++i) {
		int tp;
		cin >> tp >> L >> R;
		if (tp == 1) {
			cin >> S >> C;
			if (L == 1) a[1] += S;
			--R, up_range(1, 1, m), ++R;
			if (1 < L) {
				id = L - 1;
				vl = get_vl(1, 1, m);
				b[id] = vl + S;
				up_dot(1, 1, m);
			}

			if (R < n) {
				id = R;
				vl = get_vl(1 , 1, m);
				b[id] = vl - (S + (R - L) * C); 
				up_dot(1, 1, m);
			}
		}
			else
		if (tp == 2) {
			cin >> S >> C;
			if (L == 1) a[1] = S;

			if (1 < L) {
				id = L - 1;
				b[id] = S - Avl(id); 
				up_dot(1, 1, m);
			}

			--R, up_to_range(1, 1, m), ++R;

			if (R < n) {
				id = R;
				b[id] = Avl(id + 1) - (S + (R - L) * C); 
				up_dot(1, 1, m);
			}
		}
			else
		if (tp == 3) {
			--R; cout << get(1 , 1, m).ans + 1 << "\n";
		}
	}
}

/*
 S + (i − L) × C.

 S + i * C - L * C

 (S - L * C) + i * C

b[i] = a[i + 1] - a[i]
*/
# 결과 실행 시간 메모리 Grader output
1 Correct 278 ms 77516 KB Output is correct
2 Correct 122 ms 69316 KB Output is correct
3 Correct 132 ms 69272 KB Output is correct
4 Correct 125 ms 69204 KB Output is correct
5 Correct 130 ms 69372 KB Output is correct
6 Correct 128 ms 69372 KB Output is correct
7 Correct 124 ms 69196 KB Output is correct
8 Correct 28 ms 66096 KB Output is correct
9 Correct 28 ms 66084 KB Output is correct
10 Correct 28 ms 66200 KB Output is correct
11 Correct 243 ms 79348 KB Output is correct
12 Correct 239 ms 79308 KB Output is correct
13 Correct 241 ms 79584 KB Output is correct
14 Correct 253 ms 79716 KB Output is correct
15 Correct 243 ms 79488 KB Output is correct
16 Correct 254 ms 79420 KB Output is correct
17 Correct 243 ms 79292 KB Output is correct
18 Correct 251 ms 79232 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 29 ms 66096 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 303 ms 74732 KB Output is correct
2 Correct 129 ms 68748 KB Output is correct
3 Correct 121 ms 68780 KB Output is correct
4 Correct 109 ms 68716 KB Output is correct
5 Correct 134 ms 68868 KB Output is correct
6 Correct 117 ms 68816 KB Output is correct
7 Correct 120 ms 68944 KB Output is correct
8 Correct 27 ms 66052 KB Output is correct
9 Correct 26 ms 66004 KB Output is correct
10 Correct 27 ms 66092 KB Output is correct
11 Correct 320 ms 74424 KB Output is correct
12 Correct 314 ms 74700 KB Output is correct
13 Correct 318 ms 74688 KB Output is correct
14 Correct 325 ms 74548 KB Output is correct
15 Correct 288 ms 74792 KB Output is correct
16 Correct 344 ms 75144 KB Output is correct
17 Correct 324 ms 75104 KB Output is correct
18 Correct 328 ms 75224 KB Output is correct
19 Correct 290 ms 74484 KB Output is correct
20 Correct 306 ms 74624 KB Output is correct
21 Correct 298 ms 74532 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 695 ms 73920 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 303 ms 74732 KB Output is correct
2 Correct 129 ms 68748 KB Output is correct
3 Correct 121 ms 68780 KB Output is correct
4 Correct 109 ms 68716 KB Output is correct
5 Correct 134 ms 68868 KB Output is correct
6 Correct 117 ms 68816 KB Output is correct
7 Correct 120 ms 68944 KB Output is correct
8 Correct 27 ms 66052 KB Output is correct
9 Correct 26 ms 66004 KB Output is correct
10 Correct 27 ms 66092 KB Output is correct
11 Correct 320 ms 74424 KB Output is correct
12 Correct 314 ms 74700 KB Output is correct
13 Correct 318 ms 74688 KB Output is correct
14 Correct 325 ms 74548 KB Output is correct
15 Correct 288 ms 74792 KB Output is correct
16 Correct 344 ms 75144 KB Output is correct
17 Correct 324 ms 75104 KB Output is correct
18 Correct 328 ms 75224 KB Output is correct
19 Correct 290 ms 74484 KB Output is correct
20 Correct 306 ms 74624 KB Output is correct
21 Correct 298 ms 74532 KB Output is correct
22 Correct 850 ms 74836 KB Output is correct
23 Correct 208 ms 69064 KB Output is correct
24 Correct 179 ms 69068 KB Output is correct
25 Correct 187 ms 69284 KB Output is correct
26 Correct 183 ms 68984 KB Output is correct
27 Correct 180 ms 69024 KB Output is correct
28 Correct 188 ms 69064 KB Output is correct
29 Correct 31 ms 66004 KB Output is correct
30 Correct 30 ms 65992 KB Output is correct
31 Correct 29 ms 66076 KB Output is correct
32 Correct 798 ms 73848 KB Output is correct
33 Correct 808 ms 73804 KB Output is correct
34 Correct 817 ms 73944 KB Output is correct
35 Correct 814 ms 73868 KB Output is correct
36 Correct 604 ms 74128 KB Output is correct
37 Correct 649 ms 74128 KB Output is correct
38 Correct 665 ms 74096 KB Output is correct
39 Correct 864 ms 73908 KB Output is correct
40 Correct 871 ms 73940 KB Output is correct
41 Correct 804 ms 73752 KB Output is correct
42 Correct 813 ms 73824 KB Output is correct
43 Correct 882 ms 73872 KB Output is correct
44 Correct 804 ms 73904 KB Output is correct
45 Correct 780 ms 73932 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 278 ms 77516 KB Output is correct
2 Correct 122 ms 69316 KB Output is correct
3 Correct 132 ms 69272 KB Output is correct
4 Correct 125 ms 69204 KB Output is correct
5 Correct 130 ms 69372 KB Output is correct
6 Correct 128 ms 69372 KB Output is correct
7 Correct 124 ms 69196 KB Output is correct
8 Correct 28 ms 66096 KB Output is correct
9 Correct 28 ms 66084 KB Output is correct
10 Correct 28 ms 66200 KB Output is correct
11 Correct 243 ms 79348 KB Output is correct
12 Correct 239 ms 79308 KB Output is correct
13 Correct 241 ms 79584 KB Output is correct
14 Correct 253 ms 79716 KB Output is correct
15 Correct 243 ms 79488 KB Output is correct
16 Correct 254 ms 79420 KB Output is correct
17 Correct 243 ms 79292 KB Output is correct
18 Correct 251 ms 79232 KB Output is correct
19 Incorrect 29 ms 66096 KB Output isn't correct
20 Halted 0 ms 0 KB -