求Hack
查看原帖
求Hack
249447
Shxt_Plus楼主2024/7/18 21:04

在做题的时候观察样例,发现了一个奇怪的规律,然后得到了一个策略,优先交换那些 ala_l 与 ara_r 差比较小且 rr 更大的数对,理论复杂度 O(n4)O(n^4) 但是不知道为啥跑的飞快,而且还能过,求大佬Hack 或者证明正确性。

#include<bits/stdc++.h> 
using namespace std;
int n,k;
int b[5005],a[5005],cnt;
pair<int,int>dn[250005];
signed main()
{
	cin>>n>>k;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		b[a[i]]=i;
	}
	while(1)
	{
		int o=0;
		for(int i=1;i<=n;i++)
		{
			for(int j=n;j>k;j--)
			if(a[j]+i<=n)
			{
				if(j>b[a[j]+i] && j-b[a[j]+i]>=k)
				{
					dn[++cnt]={b[a[j]+i],j};
					int t=b[a[j]+i];
					b[a[j]+i]=j;
					b[a[j]]=t;
					swap(a[t],a[j]);
					o=1;
					break;
				}
			}
			if(o)break;
		}
		if(!o)break;
	}
	cout<<cnt<<"\n";
	for(int i=1;i<=cnt;i++)cout<<dn[i].first<<" "<<dn[i].second<<"\n";
	return 0;
}
2024/7/18 21:04
加载中...