Skip to content

Commit 8971e63

Browse files
committed
Solved problem 25. Min Ends Subsequence from CS Academy
1 parent 30cdb97 commit 8971e63

File tree

2 files changed

+87
-0
lines changed

2 files changed

+87
-0
lines changed
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
/*
2+
Idea:
3+
- Segment tree.
4+
- Try each element with the maximum element after it
5+
and count the number of elements between them less
6+
than the current element.
7+
*/
8+
9+
#include <bits/stdc++.h>
10+
11+
using namespace std;
12+
13+
int const N = 1e5 + 1;
14+
int n, a[N], mx[N];
15+
vector<int> seg[4 * N];
16+
17+
void build(int at, int l, int r) {
18+
if(l == r) {
19+
seg[at].push_back(a[l]);
20+
return;
21+
}
22+
23+
int mid = (l + r) >> 1;
24+
build(at << 1, l, mid);
25+
build(at << 1 | 1, mid + 1, r);
26+
27+
int i = 0, j = 0;
28+
for(; i < seg[at << 1].size() && j < seg[at << 1 | 1].size();)
29+
if(seg[at << 1][i] < seg[at << 1 | 1][j])
30+
seg[at].push_back(seg[at << 1][i++]);
31+
else
32+
seg[at].push_back(seg[at << 1 | 1][j++]);
33+
while(i < seg[at << 1].size())
34+
seg[at].push_back(seg[at << 1][i++]);
35+
while(j < seg[at << 1 | 1].size())
36+
seg[at].push_back(seg[at << 1 | 1][j++]);
37+
}
38+
39+
int s, e, tar;
40+
int get(int at, int l, int r) {
41+
if(l > e || r < s)
42+
return 0;
43+
44+
if(l >= s && r <= e)
45+
return upper_bound(seg[at].begin(), seg[at].end(), tar) - seg[at].begin();
46+
47+
int mid = (l + r) >> 1;
48+
return get(at << 1, l, mid) + get(at << 1 | 1, mid + 1, r);
49+
}
50+
51+
int solve() {
52+
memset(mx, -1, sizeof mx);
53+
for(int i = n, cur = 1; i > 0; --i)
54+
while(cur <= a[i])
55+
mx[cur++] = i;
56+
57+
for(int i = 0; i < 4 * N; ++i)
58+
seg[i].clear();
59+
build(1, 1, n);
60+
61+
int ret = 0;
62+
for(int i = 1; i <= n; ++i) {
63+
s = i, e = mx[a[i]], tar = a[i];
64+
ret = max(ret, get(1, 1, n) + 1);
65+
}
66+
67+
return ret;
68+
}
69+
70+
int main() {
71+
scanf("%d", &n);
72+
for(int i = 1; i <= n; ++i)
73+
scanf("%d", a + i);
74+
75+
if(n == 1) {
76+
puts("1");
77+
return 0;
78+
}
79+
80+
int r1 = solve();
81+
reverse(a + 1, a + n + 1);
82+
int r2 = solve();
83+
printf("%d\n", max(r1, r2));
84+
85+
return 0;
86+
}

CS Academy/README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
- [18. Consecutive Digits Signs](https://csacademy.com/contest/round-18/task/consecutive-digit-signs/)
55
- [24. Vector Size](https://csacademy.com/contest/round-24/#task/vector-size)
66
- [24. Kth Special Number](https://csacademy.com/contest/round-24/#task/kth-special-number)
7+
- [25. Min Ends Subsequence](https://csacademy.com/contest/round-25/task/min-ends-subsequence)
78
- [26. Limited Vocabulary](https://csacademy.com/contest/round-26/#task/limited-vocabulary)
89
- [26. Odd Pair Sums](https://csacademy.com/contest/round-26/#task/odd-pair-sums)
910
- [27. Backpack Packing](https://csacademy.com/contest/round-27/#task/backpack-packing)

0 commit comments

Comments
 (0)