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; }