hdu 1394(有空了用树状数组试试)

/*
分析:
    题目不难,其实就是在教我们学离散化哦~
    上午到现在就做了俩水题,还都被虐,桑透了心……,还好这个
1a了,要不用劝,直接就撞墙了……
*/










#include"stdio.h"


struct segtree
{
	int l,r,mid;
	int sum;
}T[15555];


int min(int a,int b)
{
	return a>b?b:a;
}


void build(int l,int r,int k)
{
	T[k].l=l;
	T[k].r=r;
	T[k].mid=(l+r)/2;
	T[k].sum=0;


	if(l==r)	return ;


	build(l,T[k].mid,2*k);
	build(T[k].mid+1,r,2*k+1);
}


void insert(int aim,int l,int r,int k)
{
	if(T[k].l==aim&&T[k].r==aim)	{T[k].sum++;return ;}


	if(aim<=T[k].mid)	insert(aim,l,T[k].mid,2*k);
	else				insert(aim,T[k].mid+1,r,2*k+1);


	T[k].sum=T[2*k].sum+T[2*k+1].sum;
}


int t_s;
void search(int l,int r,int k)
{
	if(T[k].l==l&&T[k].r==r)	{t_s+=T[k].sum;return ;}


	if(r<=T[k].mid)		search(l,r,2*k);
	else if(l>T[k].mid)	search(l,r,2*k+1);
	else
	{
		search(l,T[k].mid,2*k);
		search(T[k].mid+1,r,2*k+1);
	}
}


int main()
{
	int n;
	int i;
	int num[5011];
	int sum;
	int ans;
	while(scanf("%d",&n)!=-1)
	{
		build(1,n,1);


		sum=0;
		for(i=0;i<n;i++)
		{
			scanf("%d",&num[i]);
			num[i]++;
			t_s=0;
			if(num[i]!=n)	search(num[i]+1,n,1);
			sum+=t_s;


			insert(num[i],1,num[i],1);
		}


		ans=sum;
		for(i=n-1;i>=0;i--)
		{
			sum=sum-(n-num[i])+(num[i]-1);
			ans=min(ans,sum);
		}


		printf("%d\n",ans);
	}
	return 0;
}


你可能感兴趣的:(hdu 1394(有空了用树状数组试试))