C++归并排序30分 有AC有WA还有TLE
查看原帖
C++归并排序30分 有AC有WA还有TLE
661595
a2lyaXNhbWUgbWFyaXNh楼主2022/7/22 11:43

求调,本蒟蒻找不出问题在哪QAQ,%%%膜拜大佬%%%

悬赏关注

注:吸氧后提升了10分

Code:

#include<bits/stdc++.h>
using namespace std;
#define int long long
int a[500010],b[500010],n,ans;
inline int read() {//快读
	int x=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9') {
		if(ch=='-')f=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9') {
		x=(x<<1)+(x<<3)+(ch^48);
		ch=getchar();
	}
	return x*f;
}
inline void write(int x) {//快写
	if(x<0)putchar('-'),x=-x;
	if(x>9)write(x/10);
	putchar(x%10 +'0');
}
inline void mgs(int l,int r) {//归并+统计
	if(l==r)return;
	int mid=(l+r)/2;
	mgs(l,mid);
	mgs(mid+1,r);
	int p1=l,p2=mid+1,p3=l;
	while(p1<=mid&&p2<=r) {
		if(a[p1]<a[p2])b[p3++]=a[p1++];
		else{
			b[p3++]=a[p2++];
			ans+=mid-p1+1;
		} 
	}
	while(p1<=mid)b[p3++]=a[p1++];
	while(p2<=r)b[p3++]=a[p2++];
	for(int i=1; i<=r; i++)a[i]=b[i];
}
signed main() {//main包
	n=read();
	for(int i=1; i<=n; i++)a[i]=read();
	mgs(1,n);
	write(ans);
	return 0;//好习惯
}
//然而30分,O2YYDS
2022/7/22 11:43
加载中...