【USACO 2018 US Open Contest Gold】不合时宜(金)Out of Sorts

思路

  • 翻译一下代码:双向冒泡排序
  • 每一次排序,都会将一个前面的数放到后面,把一个后面的数提到前面。对于每个位置的数,看他前面的数有多少个到后面去
  • 先序列排序,然后(是到最后面以后不会再移动了,如果移动了则不算,所以需要用vis标记一下),求它们的最大值;
  • 离散化(https://www.cnblogs.com/wuwendongxi/p/13561546.html)
  • 似乎不用树状数组,纯模拟也能做

代码

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int n,flag[100005],c[100005],b[100005];
struct fdfdfd{int num,id;}a[100005];
bool cmp(fdfdfd x,fdfdfd y){return (x.num<y.num)||(x.num==y.num&&x.id<y.id);}
int lowbit(int x){return x&(-x);}
void add(int x,int d){for(int i=x;i<=n;i+=lowbit(i)) c[i]+=d;}
int ask(int x) {int ans=0; for(int i=x;i>0;i-=lowbit(i)) ans+=c[i];	return ans;}
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;++i) scanf("%d",&a[i].num),a[i].id=i,b[i]=a[i].num;
	sort(b+1,b+n+1);
	int len=unique(b+1,b+n+1)-b-1;
	for(int i=1;i<=n;++i) a[i].num=lower_bound(b+1,b+len+1,a[i].num)-b;
	sort(a+1,a+n+1,cmp);
	int ans=1;
	for(int i=1;i<=n;++i)
	{
		add(a[i].id,1);
		ans=max(ans,i-ask(i));
	}
    printf("%d\n",ans);
}
posted @ 2020-08-25 20:15  wuwendongxi  阅读(184)  评论(0编辑  收藏  举报