Link:

传送门

A:

对于每一条分割线,设本不应在其左侧的个数为$x$

重点要发现每次一来一回的操作恰好会将一对分别应在左/右侧的一个数从右/左移过去

这样就转直接用树状数组求出最大的$x$即可

#include <bits/stdc++.h>

using namespace std;
#define X first
#define Y second
typedef long long ll;
typedef pair<int,int> P;
const int MAXN=1e5+10;
//res至少为1 
int n,bit[MAXN],res=1;P dat[MAXN];

void Update(int x)
{while(x<=n) bit[x]++,x+=x&(-x);}
int Query(int x)
{
    int ret=0;
    while(x) ret+=bit[x],x-=x&(-x);
    return ret;
}

int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%d",&dat[i].X),dat[i].Y=i;
    sort(dat+1,dat+n+1);
    
    for(int i=1;i<n;i++)
        Update(dat[i].Y),res=max(res,i-Query(i));
    printf("%d",res);
    return 0;
}
Problem A

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-05-19
  • 2022-01-16
  • 2021-07-13
  • 2021-11-27
  • 2021-07-20
猜你喜欢
  • 2021-10-13
  • 2021-10-18
  • 2021-12-01
  • 2021-10-06
  • 2021-08-09
  • 2021-09-25
  • 2021-06-24
相关资源
相似解决方案