社区讨论

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 条回复,欢迎继续交流。

正在加载回复...