Given two arrays, one for for the adjacent elements to move such that:
\ [\ SUM (a_i-B_i) ^ 2 \]
minimum.
Modification made to the original formula:
\ [\ SUM (a_i ^ 2 ^ + B_i 2-2a_ib_i) \\ \\ \\ = \ ^ 2 + SUM a_i \ ^ 2 -2 B_i SUM \ SUM a_ib_i \]
seeking \ (( \ sum (a_ib_i) ^ 2) _ {min} \) i.e. seeking \ ((\ sum a_ib_i) _ {max} \)
By the rearrangement inequality:
\ [a_1b_n a_2b_ {+} +. 1-n-a_3b_ {n-2} + ... +-a_nb_1 \ A_ Leq P_1} {+} Q_1 A_ B_ {} {P_2 Q_2 B_ {} + {A_ P_3 } b_ {q_3} + ... + a_ {p_n} b_ {q_n} \ leq a_1b_1 + a_2b_2 + a_3b_3 + ... + a_nb_n, \\ \ forall i <j \ in [1, n], a_i <a_j, b_i <b_j \]
that is less than the reverse and the scrambled sequence and less than we require is to a minimum sequence number to a relatively ordered b adjacent elements needs to be exchanged.
- To be continued ......
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll N=1000005,mod=99999997;
inline ll read()
{
char c=getchar();ll x=0;
for(;!isdigit(c);c=getchar());
for(;isdigit(c);c=getchar())
x=x*10+c-'0';
return x;
}
ll n,c[N];
ll cnt;
ll ls[N];
struct L
{
int val,ind;
};
L l1[N],l2[N];
inline bool cmp(L i,L j)
{
return i.val<j.val;
}
void mgs(ll l,ll r)
{
if(l==r)return;
ll mid=(l+r)/2;
mgs(l,mid);
mgs(mid+1,r);
ll i=l,j=mid+1,k=l;
while(i<=mid&&j<=r)
{
if(c[i]>c[j])
{
ls[k++]=c[j++];
cnt=(cnt+mid-i+1)%mod;
}
else
{
ls[k++]=c[i++];
}
}
while(i<=mid)ls[k++]=c[i++];
while(j<=r)ls[k++]=c[j++];
for(ll i=l;i<=r;i++)c[i]=ls[i];
}
int main()
{
//freopen("C:\\Users\\Administrator\\Downloads\\testdata (9).in","r",stdin);
cin>>n;
for(ll i=1;i<=n;i++)l1[i].ind=i,l1[i].val=read();
for(ll i=1;i<=n;i++)l2[i].ind=i,l2[i].val=read();
sort(l1+1,l1+n+1,cmp);
sort(l2+1,l2+n+1,cmp);
for(ll i=1;i<=n;i++)c[l1[i].ind]=l2[i].ind;
mgs(1,n);
cout<<cnt;
return 0;
}