萌新30分求调
  • 板块P1908 逆序对
  • 楼主gaojizhe05
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/11/15 21:20
  • 上次更新2023/11/15 22:49:36
查看原帖
萌新30分求调
699271
gaojizhe05楼主2023/11/15 21:20

问题

用了归并排序,但只有30分,一堆WA,请求大佬帮助! logo
哎,满屏蛙声

错误代码

#include <bits/stdc++.h>
using namespace std;
const int maxn=5e5;
int n,a[maxn],b[maxn],ans=0;
void Init(){
	cin>>n;
	for(int i=1;i<=n;i++)
	    cin>>a[i];
}
void Do(int x,int y,int z,int w){
	if(z>n) return;
	int cnt=0;
	int p=x,q=z;
	for(int i=x;i<=w;i++){ 
		if(a[p]<a[q]){
			b[i]=a[p];
			p++;
			ans+=cnt;
			if(p>y){
				for(int j=i+1,k=q;j<=w;j++,k++)
				    b[j]=a[k];
				break;
			}
		}
		else if(a[p]>a[q]){
			b[i]=a[q];
			cnt++;
			q++;
			if(q>w){
				for(int j=i+1,k=p;j<=w;j++,k++){
				    b[j]=a[k];
				    ans+=cnt;
				  
				}
				break;
			}
		}
	}
	for(int i=x;i<=w;i++)
	    a[i]=b[i];
}
void Work(){
	for(int i=1;i<=n;i*=2)
	    for(int j=1;j<=n;j+=i*2)
	        Do(j,j+i-1,i+j,min(j+i*2-1,n));
	cout<<ans;
}
int main(){
	Init();
	Work();
	return 0;
}
2023/11/15 21:20
加载中...