社区讨论
95pts 求条
P12127 [蓝桥杯 2024 省 B 第二场] 最强小队参与者 2已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @mhj2t1sw
- 此快照首次捕获于
- 2025/11/03 19:48 4 个月前
- 此快照最后确认于
- 2025/11/03 19:48 4 个月前
CPP
// 39 X 03
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 5;
int n, a[N], t[N], Max[N], ans;
map<int, int> mp, rk;
vector<pair<int, int> > del[N];
vector<pair<int, int> > q;
void update( int x, int k ) {
for (; x <= n; x += (x & -x)) {
Max[x] = max (Max[x], k);
}
}
int query( int x ) {
int res = 0;
for (; x; x -= (x & -x)) {
res = max (res, Max[x]);
}
return res;
}
void add( int x, int k ) {
for (; x <= n; x += (x & -x)) {
t[x] += k;
}
}
int ask( int x ) {
int res = 0;
for (; x; x -= (x & -x)) {
res += t[x];
}
return res;
}
int main() {
ios :: sync_with_stdio (0), cin.tie (0);
cin >> n;
for (int i = 1; i <= n; cin >> a[i++]) {
}
for (int i = 1; i <= n; ++i) {
mp[a[i]] = 1;
}
int Rk = 0;
for (auto i : mp) {
rk[i.first] = ++Rk;
}
for (int i = 1; i <= n; ++i) {
a[i] = rk[a[i]], add (a[i], 1), update (i, a[i]);
}
for (int i = n; i; --i) {
add (a[i], -1);
int l = 1, r = i - 1;
while (l < r) {
int mid = l + r >> 1;
if (query (mid) >= a[i]) {
r = mid;
} else {
l = mid + 1;
}
}
if (query (l) >= a[i]) {
q.push_back ({ask (a[i] - 1), 0});
del[l].push_back (make_pair (a[i] - 1, (int)q.size () - 1));
}
for (auto j : del[i]) {
q[j.second].second = ask (j.first);
}
}
for (auto i : q) {
ans = max (ans, 2 + i.first - i.second);
}
reverse (a + 1, a + n + 1);
q.clear ();
for (int i = 1; i <= n; ++i) {
t[i] = Max[i] = 0, del[i].clear ();
}
for (int i = 1; i <= n; ++i) {
add (a[i], 1), update (i, a[i]);
}
for (int i = n; i; --i) {
add (a[i], -1);
int l = 1, r = i - 1;
while (l < r) {
int mid = l + r >> 1;
if (query (mid) >= a[i]) {
r = mid;
} else {
l = mid + 1;
}
}
if (query (l) >= a[i]) {
q.push_back ({ask (a[i] - 1), 0});
del[l].push_back (make_pair (a[i] - 1, (int)q.size () - 1));
}
for (auto j : del[i]) {
q[j.second].second = ask (j.first);
}
}
for (auto i : q) {
ans = max (ans, 2 + i.first - i.second);
}
return cout << ans, 0;
}
一坨
回复
共 2 条回复,欢迎继续交流。
正在加载回复...