求助
查看原帖
求助
616964
Adolfo_North楼主2022/12/22 15:04

分治逆序对+排序,求hack

#include<iostream>
#include<algorithm>
using namespace std;
int n,m; 
int lin[101],b[52],ans;
struct ss{
	string a;
	int ans,x;
} a[101];
void merge(int l,int r,int mid)
{
	int i=l,j=mid+1,k=l;
	while(i<=mid&&j<=r)
	{
		if(lin[i]<=lin[j])//等号要加 关乎稳定 
		{
			b[k++]=lin[i++];
		}
		else
		{
			b[k++]=lin[j++];
			ans+=mid-i+1;
		}
	}
	while(i<=mid) b[k++]=lin[i++];//左边有可能还有数 
	while(j<=r) b[k++]=lin[j++]; //右边有可能还有数 
	for(int i=l;i<=r;i++)
	{
		lin[i]=b[i];
	}
}
void mergesort(int l,int r)
{
	if(l==r)
	{
		return;
	}
	//分成左右两部分解决 
	int mid=(l+r)/2;
	mergesort(l,mid);//解决左边部分 
	mergesort(mid+1,r);//解决右边部分 
	merge(l,r,mid);
}
bool cmp(ss c,ss d){
	return c.ans<d.ans;
}
int main()
{
	int T;
	cin>>T;
	while(T--){
		cin>>n>>m;
		for(int i=1;i<=m;i++){
			cin>>a[i].a;
			for(int j=0;j<n;j++){
				lin[j+1]=a[i].a[j];
			}
			ans=0;
			mergesort(1,n);
			a[i].ans=ans;
			a[i].x=i;
		}
		sort(a+1,a+1+m,cmp);
		for(int i=1;i<=m;i++){
			cout<<a[i].a<<endl;
		}
		if(T) cout<<endl;
	}
	
    return 0;
}

2022/12/22 15:04
加载中...