답안 #847444

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
847444 2023-09-09T16:24:05 Z qwerasdfzxcl Mizuyokan 2 (JOI23_mizuyokan2) C++17
100 / 100
850 ms 229560 KB
#include <bits/stdc++.h>

using namespace std;
typedef long long ll;

constexpr int INF1 = 1e9 + 100;

int n;
int a[250250];

int go[250250], sp[250250][20];
ll S[250250];

struct Node{
	array<int, 2> f[51];
	int pos, sz;

	Node(){}
	Node(int _pos, int nxt){
		f[0] = {nxt, 1};
		pos = _pos;
		sz = 1;
	}
};

array<int, 2> operator + (const array<int, 2> &x, int y){
	return {x[0], x[1]+y};
}

void merge(Node &P, const Node &L, const Node &R){
	P.sz = 0;
	for (int i=0;i<L.sz;i++){
		if (L.f[i][0] >= R.pos + R.sz) P.f[P.sz++] = L.f[i];
		else P.f[P.sz++] = R.f[L.f[i][0]-R.pos] + L.f[i][1];
	}

	for (int i=0;i<R.sz;i++){
		if (P.sz==51) return;
		P.f[P.sz++] = R.f[i];
	}
}

void push(Node &L, const Node &R){
	for (int i=0;i<L.sz;i++) if (L.f[i][0] < R.pos + R.sz) L.f[i] = R.f[L.f[i][0]-R.pos] + L.f[i][1];
	for (int i=0;i<R.sz;i++){
		if (L.sz==51) return;
		L.f[L.sz++] = R.f[i];
	}
}

struct Seg{
	Node tree[1101000], ret;

	void init(int i, int l, int r){
		if (l==r) {tree[i] = Node(l, go[l]); return;}
		
		int m = (l+r)>>1;
		init(i<<1, l, m); init(i<<1|1, m+1, r);

		tree[i].pos = l;
		merge(tree[i], tree[i<<1], tree[i<<1|1]);
	}

	void update(int i, int l, int r, int s, int e){
		if (r<s || e<l) return;
		if (l==r){
			tree[i] = Node(l, go[l]);
			return;
		}

		int m = (l+r)>>1;
		update(i<<1, l, m, s, e); update(i<<1|1, m+1, r, s, e);
		merge(tree[i], tree[i<<1], tree[i<<1|1]);
	}

	void query(int i, int l, int r, int s, int e){
		if (r<s || e<l) return;
		if (s<=l && r<=e){
			push(ret, tree[i]);
			return;
		}

		int m = (l+r)>>1;
		query(i<<1, l, m, s, e); query(i<<1|1, m+1, r, s, e);
	}
}tree;

struct Seg2{
	ll tree[500500];
	int sz;

	void init(int n){
		sz = n;
		for (int i=sz;i<sz*2;i++) tree[i] = a[i-sz];
		for (int i=sz-1;i;i--) tree[i] = tree[i<<1] + tree[i<<1|1];
	}

	void update(int p, int x){
		p += sz;
		tree[p] = x;
		for (p>>=1;p;p>>=1) tree[p] = tree[p<<1] + tree[p<<1|1];
	}

	ll query(int l, int r){
		r++;
		ll ret = 0;
		for (l+=sz, r+=sz;l<r;l>>=1, r>>=1){
			if (l&1) ret += tree[l++];
			if (r&1) ret += tree[--r];
		}

		return ret;
	}
}tree2;

void init(int n){
	for (int i=1;i<=n;i++) S[i] = S[i-1] + a[i];

	go[n+1] = n+1;
	for (int i=1;i<=n;i++){
		go[i] = n+1;
		for (int j=i+2;j<=min(i+50, n);j++) if (S[j-1] - S[i] > max(a[i], a[j])){
			go[i] = j;
			break;
		}
	}

	for (int i=n;i;i--) go[i] = min(go[i], go[i+1]);

	tree.init(1, 1, n);
	tree2.init(n+1);
}

int solve(int l, int r){
	if (r-l+1 < 3) return -INF1;
	
	int cnt = 0;
	tree.ret.sz = 0;
	tree.ret.pos = l;
	tree.query(1, 1, n, l, r);

	for (int i=0;i<tree.ret.sz;i++) cnt = max(cnt, tree.ret.f[i][1]-1);

	return cnt * 2 + 1;
}

int query(int l, int r){
	int ret = 1;
	if (l==r) return ret;
	if (tree2.query(l, r-1) > a[r]) ret = 2;
	if (tree2.query(l+1, r) > a[l]) ret = 2;

	int nl = r+1, nr = l-1;
	ll sum = a[l];
	for (int i=l+1;i<=min(l+30, r);sum += a[i++]) if (sum > a[i]) {nl = i; break;}
	sum = a[r];
	for (int i=r-1;i>=max(l, r-30);sum += a[i--]) if (sum > a[i]) {nr = i; break;}
	if (nl <= nr) ret = 3;

	return max({ret, solve(l, r), solve(nl, r) + 1, solve(l, nr) + 1, solve(nl, nr) + 2});
}

void update(int x, int y){
	a[x] = y;
	tree2.update(x, y);

	for (int i=x;i>=max(1, x-50);i--){
		go[i] = go[i+1];
		ll sum = a[i+1];
		for (int j=i+2;j<=min(i+50, go[i+1]-1);sum += a[j++]) if (sum > max(a[i], a[j])){
			go[i] = j;
			break;
		}
	}

	tree.update(1, 1, n, max(1, x-50), x);
}

int main(){
	scanf("%d", &n);
	for (int i=1;i<=n;i++) scanf("%d", a+i);

	init(n);

	int q;
	scanf("%d", &q);
	while(q--){
		int x, y, l, r;
		scanf("%d %d %d %d", &x, &y, &l, &r);
		
		if (a[x]!=y) update(x, y);

		l++;
		printf("%d\n", query(l, r));
	}
}

Compilation message

mizuyokan2.cpp: In function 'int main()':
mizuyokan2.cpp:180:7: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  180 |  scanf("%d", &n);
      |  ~~~~~^~~~~~~~~~
mizuyokan2.cpp:181:30: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  181 |  for (int i=1;i<=n;i++) scanf("%d", a+i);
      |                         ~~~~~^~~~~~~~~~~
mizuyokan2.cpp:186:7: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  186 |  scanf("%d", &q);
      |  ~~~~~^~~~~~~~~~
mizuyokan2.cpp:189:8: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  189 |   scanf("%d %d %d %d", &x, &y, &l, &r);
      |   ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 4440 KB Output is correct
2 Correct 1 ms 4440 KB Output is correct
3 Correct 1 ms 4444 KB Output is correct
4 Correct 1 ms 4440 KB Output is correct
5 Correct 1 ms 4440 KB Output is correct
6 Correct 1 ms 4696 KB Output is correct
7 Correct 1 ms 4440 KB Output is correct
8 Correct 1 ms 4444 KB Output is correct
9 Correct 1 ms 4440 KB Output is correct
10 Correct 1 ms 4440 KB Output is correct
11 Correct 1 ms 4444 KB Output is correct
12 Correct 1 ms 4440 KB Output is correct
13 Correct 1 ms 4440 KB Output is correct
14 Correct 1 ms 4440 KB Output is correct
15 Correct 1 ms 4440 KB Output is correct
16 Correct 1 ms 4440 KB Output is correct
17 Correct 1 ms 4440 KB Output is correct
18 Correct 1 ms 4440 KB Output is correct
19 Correct 1 ms 4440 KB Output is correct
20 Correct 1 ms 4440 KB Output is correct
21 Correct 1 ms 4440 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 4440 KB Output is correct
2 Correct 1 ms 4440 KB Output is correct
3 Correct 1 ms 4444 KB Output is correct
4 Correct 1 ms 4440 KB Output is correct
5 Correct 1 ms 4440 KB Output is correct
6 Correct 1 ms 4696 KB Output is correct
7 Correct 1 ms 4440 KB Output is correct
8 Correct 1 ms 4444 KB Output is correct
9 Correct 1 ms 4440 KB Output is correct
10 Correct 1 ms 4440 KB Output is correct
11 Correct 1 ms 4444 KB Output is correct
12 Correct 1 ms 4440 KB Output is correct
13 Correct 1 ms 4440 KB Output is correct
14 Correct 1 ms 4440 KB Output is correct
15 Correct 1 ms 4440 KB Output is correct
16 Correct 1 ms 4440 KB Output is correct
17 Correct 1 ms 4440 KB Output is correct
18 Correct 1 ms 4440 KB Output is correct
19 Correct 1 ms 4440 KB Output is correct
20 Correct 1 ms 4440 KB Output is correct
21 Correct 1 ms 4440 KB Output is correct
22 Correct 1 ms 6492 KB Output is correct
23 Correct 1 ms 6492 KB Output is correct
24 Correct 2 ms 6488 KB Output is correct
25 Correct 1 ms 6488 KB Output is correct
26 Correct 2 ms 6488 KB Output is correct
27 Correct 2 ms 6488 KB Output is correct
28 Correct 1 ms 6488 KB Output is correct
29 Correct 2 ms 6488 KB Output is correct
30 Correct 2 ms 6488 KB Output is correct
31 Correct 1 ms 6488 KB Output is correct
32 Correct 2 ms 6488 KB Output is correct
33 Correct 1 ms 6488 KB Output is correct
34 Correct 1 ms 6492 KB Output is correct
35 Correct 2 ms 6488 KB Output is correct
36 Correct 2 ms 6488 KB Output is correct
37 Correct 1 ms 6492 KB Output is correct
38 Correct 2 ms 6492 KB Output is correct
39 Correct 2 ms 6488 KB Output is correct
40 Correct 2 ms 6488 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 4440 KB Output is correct
2 Correct 1 ms 4440 KB Output is correct
3 Correct 1 ms 4444 KB Output is correct
4 Correct 1 ms 4440 KB Output is correct
5 Correct 1 ms 4440 KB Output is correct
6 Correct 1 ms 4696 KB Output is correct
7 Correct 1 ms 4440 KB Output is correct
8 Correct 1 ms 4444 KB Output is correct
9 Correct 1 ms 4440 KB Output is correct
10 Correct 1 ms 4440 KB Output is correct
11 Correct 1 ms 4444 KB Output is correct
12 Correct 1 ms 4440 KB Output is correct
13 Correct 1 ms 4440 KB Output is correct
14 Correct 1 ms 4440 KB Output is correct
15 Correct 1 ms 4440 KB Output is correct
16 Correct 1 ms 4440 KB Output is correct
17 Correct 1 ms 4440 KB Output is correct
18 Correct 1 ms 4440 KB Output is correct
19 Correct 1 ms 4440 KB Output is correct
20 Correct 1 ms 4440 KB Output is correct
21 Correct 1 ms 4440 KB Output is correct
22 Correct 1 ms 6492 KB Output is correct
23 Correct 1 ms 6492 KB Output is correct
24 Correct 2 ms 6488 KB Output is correct
25 Correct 1 ms 6488 KB Output is correct
26 Correct 2 ms 6488 KB Output is correct
27 Correct 2 ms 6488 KB Output is correct
28 Correct 1 ms 6488 KB Output is correct
29 Correct 2 ms 6488 KB Output is correct
30 Correct 2 ms 6488 KB Output is correct
31 Correct 1 ms 6488 KB Output is correct
32 Correct 2 ms 6488 KB Output is correct
33 Correct 1 ms 6488 KB Output is correct
34 Correct 1 ms 6492 KB Output is correct
35 Correct 2 ms 6488 KB Output is correct
36 Correct 2 ms 6488 KB Output is correct
37 Correct 1 ms 6492 KB Output is correct
38 Correct 2 ms 6492 KB Output is correct
39 Correct 2 ms 6488 KB Output is correct
40 Correct 2 ms 6488 KB Output is correct
41 Correct 73 ms 224848 KB Output is correct
42 Correct 54 ms 225104 KB Output is correct
43 Correct 67 ms 225104 KB Output is correct
44 Correct 51 ms 222448 KB Output is correct
45 Correct 55 ms 225104 KB Output is correct
46 Correct 58 ms 225104 KB Output is correct
47 Correct 50 ms 222396 KB Output is correct
48 Correct 59 ms 225116 KB Output is correct
49 Correct 57 ms 225180 KB Output is correct
50 Correct 58 ms 225104 KB Output is correct
51 Correct 57 ms 224968 KB Output is correct
52 Correct 50 ms 222544 KB Output is correct
53 Correct 55 ms 225096 KB Output is correct
54 Correct 56 ms 225108 KB Output is correct
55 Correct 51 ms 225104 KB Output is correct
56 Correct 65 ms 225132 KB Output is correct
57 Correct 54 ms 225032 KB Output is correct
58 Correct 58 ms 224952 KB Output is correct
59 Correct 56 ms 225104 KB Output is correct
60 Correct 56 ms 225104 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 4440 KB Output is correct
2 Correct 190 ms 222580 KB Output is correct
3 Correct 280 ms 225388 KB Output is correct
4 Correct 286 ms 225360 KB Output is correct
5 Correct 223 ms 225228 KB Output is correct
6 Correct 403 ms 225892 KB Output is correct
7 Correct 398 ms 225336 KB Output is correct
8 Correct 381 ms 225424 KB Output is correct
9 Correct 386 ms 225720 KB Output is correct
10 Correct 384 ms 223028 KB Output is correct
11 Correct 409 ms 225476 KB Output is correct
12 Correct 429 ms 225360 KB Output is correct
13 Correct 426 ms 225360 KB Output is correct
14 Correct 425 ms 225632 KB Output is correct
15 Correct 450 ms 225724 KB Output is correct
16 Correct 454 ms 225360 KB Output is correct
17 Correct 160 ms 225256 KB Output is correct
18 Correct 386 ms 225460 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 4440 KB Output is correct
2 Correct 1 ms 4444 KB Output is correct
3 Correct 557 ms 225920 KB Output is correct
4 Correct 594 ms 227852 KB Output is correct
5 Correct 493 ms 227836 KB Output is correct
6 Correct 850 ms 227820 KB Output is correct
7 Correct 775 ms 227688 KB Output is correct
8 Correct 794 ms 227520 KB Output is correct
9 Correct 721 ms 227504 KB Output is correct
10 Correct 803 ms 228180 KB Output is correct
11 Correct 780 ms 228256 KB Output is correct
12 Correct 778 ms 227300 KB Output is correct
13 Correct 818 ms 227504 KB Output is correct
14 Correct 784 ms 227420 KB Output is correct
15 Correct 833 ms 227516 KB Output is correct
16 Correct 355 ms 227956 KB Output is correct
17 Correct 576 ms 228096 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 4440 KB Output is correct
2 Correct 1 ms 4440 KB Output is correct
3 Correct 1 ms 4444 KB Output is correct
4 Correct 1 ms 4440 KB Output is correct
5 Correct 1 ms 4440 KB Output is correct
6 Correct 1 ms 4696 KB Output is correct
7 Correct 1 ms 4440 KB Output is correct
8 Correct 1 ms 4444 KB Output is correct
9 Correct 1 ms 4440 KB Output is correct
10 Correct 1 ms 4440 KB Output is correct
11 Correct 1 ms 4444 KB Output is correct
12 Correct 1 ms 4440 KB Output is correct
13 Correct 1 ms 4440 KB Output is correct
14 Correct 1 ms 4440 KB Output is correct
15 Correct 1 ms 4440 KB Output is correct
16 Correct 1 ms 4440 KB Output is correct
17 Correct 1 ms 4440 KB Output is correct
18 Correct 1 ms 4440 KB Output is correct
19 Correct 1 ms 4440 KB Output is correct
20 Correct 1 ms 4440 KB Output is correct
21 Correct 1 ms 4440 KB Output is correct
22 Correct 1 ms 6492 KB Output is correct
23 Correct 1 ms 6492 KB Output is correct
24 Correct 2 ms 6488 KB Output is correct
25 Correct 1 ms 6488 KB Output is correct
26 Correct 2 ms 6488 KB Output is correct
27 Correct 2 ms 6488 KB Output is correct
28 Correct 1 ms 6488 KB Output is correct
29 Correct 2 ms 6488 KB Output is correct
30 Correct 2 ms 6488 KB Output is correct
31 Correct 1 ms 6488 KB Output is correct
32 Correct 2 ms 6488 KB Output is correct
33 Correct 1 ms 6488 KB Output is correct
34 Correct 1 ms 6492 KB Output is correct
35 Correct 2 ms 6488 KB Output is correct
36 Correct 2 ms 6488 KB Output is correct
37 Correct 1 ms 6492 KB Output is correct
38 Correct 2 ms 6492 KB Output is correct
39 Correct 2 ms 6488 KB Output is correct
40 Correct 2 ms 6488 KB Output is correct
41 Correct 73 ms 224848 KB Output is correct
42 Correct 54 ms 225104 KB Output is correct
43 Correct 67 ms 225104 KB Output is correct
44 Correct 51 ms 222448 KB Output is correct
45 Correct 55 ms 225104 KB Output is correct
46 Correct 58 ms 225104 KB Output is correct
47 Correct 50 ms 222396 KB Output is correct
48 Correct 59 ms 225116 KB Output is correct
49 Correct 57 ms 225180 KB Output is correct
50 Correct 58 ms 225104 KB Output is correct
51 Correct 57 ms 224968 KB Output is correct
52 Correct 50 ms 222544 KB Output is correct
53 Correct 55 ms 225096 KB Output is correct
54 Correct 56 ms 225108 KB Output is correct
55 Correct 51 ms 225104 KB Output is correct
56 Correct 65 ms 225132 KB Output is correct
57 Correct 54 ms 225032 KB Output is correct
58 Correct 58 ms 224952 KB Output is correct
59 Correct 56 ms 225104 KB Output is correct
60 Correct 56 ms 225104 KB Output is correct
61 Correct 1 ms 4440 KB Output is correct
62 Correct 190 ms 222580 KB Output is correct
63 Correct 280 ms 225388 KB Output is correct
64 Correct 286 ms 225360 KB Output is correct
65 Correct 223 ms 225228 KB Output is correct
66 Correct 403 ms 225892 KB Output is correct
67 Correct 398 ms 225336 KB Output is correct
68 Correct 381 ms 225424 KB Output is correct
69 Correct 386 ms 225720 KB Output is correct
70 Correct 384 ms 223028 KB Output is correct
71 Correct 409 ms 225476 KB Output is correct
72 Correct 429 ms 225360 KB Output is correct
73 Correct 426 ms 225360 KB Output is correct
74 Correct 425 ms 225632 KB Output is correct
75 Correct 450 ms 225724 KB Output is correct
76 Correct 454 ms 225360 KB Output is correct
77 Correct 160 ms 225256 KB Output is correct
78 Correct 386 ms 225460 KB Output is correct
79 Correct 1 ms 4440 KB Output is correct
80 Correct 1 ms 4444 KB Output is correct
81 Correct 557 ms 225920 KB Output is correct
82 Correct 594 ms 227852 KB Output is correct
83 Correct 493 ms 227836 KB Output is correct
84 Correct 850 ms 227820 KB Output is correct
85 Correct 775 ms 227688 KB Output is correct
86 Correct 794 ms 227520 KB Output is correct
87 Correct 721 ms 227504 KB Output is correct
88 Correct 803 ms 228180 KB Output is correct
89 Correct 780 ms 228256 KB Output is correct
90 Correct 778 ms 227300 KB Output is correct
91 Correct 818 ms 227504 KB Output is correct
92 Correct 784 ms 227420 KB Output is correct
93 Correct 833 ms 227516 KB Output is correct
94 Correct 355 ms 227956 KB Output is correct
95 Correct 576 ms 228096 KB Output is correct
96 Correct 484 ms 225412 KB Output is correct
97 Correct 542 ms 228936 KB Output is correct
98 Correct 475 ms 228944 KB Output is correct
99 Correct 830 ms 228176 KB Output is correct
100 Correct 791 ms 228444 KB Output is correct
101 Correct 728 ms 228132 KB Output is correct
102 Correct 705 ms 227920 KB Output is correct
103 Correct 770 ms 229200 KB Output is correct
104 Correct 782 ms 227960 KB Output is correct
105 Correct 776 ms 228392 KB Output is correct
106 Correct 786 ms 228132 KB Output is correct
107 Correct 781 ms 228184 KB Output is correct
108 Correct 814 ms 228072 KB Output is correct
109 Correct 341 ms 229428 KB Output is correct
110 Correct 578 ms 229560 KB Output is correct