羅区-1966一致キュー

タイトル説明
漢漢は、各一致が高さを有し、2つのボックス、マッチの各ボックスを含むn個を有していて一致しています。今の行のそれぞれの試合でパックは、同じ列には、距離が2試合の間に画定される異なる高さに一致します。 Σ A - B 2 Σ(AI-BI)^ 2
AIはi行目の試合の最初のマッチの高さを表し、BIは、2行目の高さが一致IIIの最初の数と一致して表します。
カラムは、マッチの隣り合う位置が2試合の間の最小距離ことを交換することによって交換することができると一致します。この最小距離を取得します、交換は最小回数を必要としますか?この数は、最小スイッチング周波数、大きすぎるとモジュロ99999997に結果を出力する場合。
入力出力形式の
入力フォーマット:
合計3行は、最初の行は整数n、各ボックス内の一致の数を含んでいます。
第二行は、nは整数、スペースで区切られた2つの整数の間にそれぞれ存在する、最初の列の高さが一致します。
第三行はnは整数、スペースで区切られた2つの整数の間にそれぞれ存在し、第2カラム高さが一致します。
出力フォーマット:
整数、最小スイッチング周波数およびモジュロ99999997の結果を表します。

サンプル入力出力
入力サンプル#1:
4
2 1 3 4
3 4 2 1。

出力サンプル#1:
1

入力サンプル#2:
4
1 2 4 3
1 2 4 7。

出力サンプル#2:
2

DESCRIPTION
データの100%が、1≤n≤100,000,0≤高さが≤maxlongintと一致します

説明:最初の小から大規模な対応に、明らかにソートされ、番号に対応する二対のかを決定するには、完了までに相当します。再符号化プログラミングの最小数は一つのシーケンスの順序付けられたシーケンスから問題となるように、位置の数に対応する行の最初の数。直接逆の順序番号にマージソートを求めているの

#include<iostream>
#include<algorithm>
#define N 100005
#define mod 99999997
using namespace std;
struct node{
    int v;
    int id;
};
node A[N],B[N];
int a[N]={0},b[N]={0};
int n=0;
bool cmp1(node &a,node &b){
    return a.v<b.v;
}
bool cmp2(node &a,node &b){
    return a.id<b.id;
}
long long merge(int *a,int l,int r){
    int i=l,mid=(l+r)>>1,j=mid+1;
    int index=l;
    long long sum=0;
    while(i<=mid&&j<=r){
        if(a[i]<=a[j]){
            b[index++]=a[i++];
        }else{
            b[index++]=a[j++];
            sum+=(long long)mid-i+1;
            sum%=mod;
        }
    }
    while(i<=mid) b[index++]=a[i++];
    while(j<=r) b[index++]=a[j++];
    for(int i=l;i<=r;i++) a[i]=b[i];
    return sum%mod;
}
long long Qsort(int *a,int l,int r){
    if(l>=r) return 0;
    long long ret=0,mid=(l+r)>>1;
    ret+=Qsort(a,l,mid);
    ret%=mod;
    ret+=Qsort(a,mid+1,r);
    ret%=mod;
    ret+=merge(a,l,r);
    ret%=mod;
    return ret;
}
int main(){
    ios::sync_with_stdio(false);
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>A[i].v;A[i].id=i;
    }
    for(int i=1;i<=n;i++){
        cin>>B[i].v;B[i].id=i;
    }
    sort(A+1,A+1+n,cmp1);
    sort(B+1,B+1+n,cmp1);
    for(int i=1;i<=n;i++) A[i].v=B[i].id;
    sort(A+1,A+1+n,cmp2);
    for(int i=1;i<=n;i++) a[i]=A[i].v;
    cout<<Qsort(a,1,n)%mod<<endl;
    return 0;
}



おすすめ

転載: blog.csdn.net/mkopvec/article/details/92588058