[ブルーブリッジカップ]子どもたちが並びます

#include<bits/stdc++.h>
#define ls o<<1
#define rs o<<1|1
#define MS(x,y) memset(x,y,sizeof(x))
#define MC(x,y) memcpy(x,y,sizeof(x))
typedef long long LL; 
template<class T> inline void gmax(T &a,T b){if(b>a)a=b;}
template<class T> inline void gmin(T &a,T b){if(b<a)a=b;}
const int N=1e5+10,M=0,Z=1e9+7,W=13,L=2e6;
const double eps=1e-10;
const int dy[4]={-1,0,0,1},dx[4]={0,-1,1,0};
using namespace std;
int casenum,casei;
int id;
int n,m,nn;
//int a[N];

struct AA{
	int idx;
	LL val;
}a[N];
LL cnt[N];

bool cmp(AA a, AA b){
	return a.val<b.val;
}

//make sure two sides are sorted
void solve(int l,int mid,int r){
	int i=l,j=mid+1;
//	printf("%d%d%d",l,mid,r);
	while(i<=mid&&j<=r){
		if(a[i].val<=a[j].val){
			i++;
		}else{
			cnt[a[j].idx]+=(LL)(mid+1-i);
			j++;
		}
	}
	i=mid;j=r;
	while(i>=l&&j>=mid+1){
		if(a[i].val<=a[j].val){
			j--;
		}else{
			cnt[a[i].idx]+=(LL)(j-mid);
			i--;
		}
	}
	sort(a+l,a+r+1,cmp);
	return ;
}

void ddd(int l,int r){
	if(l>=r)return;
	int mid=(l+r)>>1;
//	printf("%d%d\n",l,r);
	ddd(l,mid);
	ddd(mid+1,r);
	solve(l,mid,r);
}

int main(){
//	freopen("in.txt","r",stdin); 
//	freopen("out.txt","w",stdout); 
//	MS(cnt,0);
	scanf("%d",&n);
	for(int i=0;i<n;i++){
		scanf("%lld",&a[i].val);
		a[i].idx=i;
	}
	ddd(0,n-1);
	LL ans=0;
	for(int i=0;i<n;i++){
		ans+=(cnt[i]+1)*(cnt[i])/2;
	}
	printf("%lld\n",ans);
	return 0;
}

 文言ビットは、時間に追わ

各パスを超える注文されることに注意してください

https://blog.csdn.net/tc_to_top/article/details/50932693

公開された810元の記事 ウォン称賛19 ビュー60000 +

おすすめ

転載: blog.csdn.net/ujn20161222/article/details/104056823