在做题的时候观察样例,发现了一个奇怪的规律,然后得到了一个策略,优先交换那些 al 与 ar 差比较小且 r 更大的数对,理论复杂度 O(n4) 但是不知道为啥跑的飞快,而且还能过,求大佬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;
}