poj2299歸併秒過

#include <cstdio>
using namespace std;
const int NMax=500050;
long long N,S[NMax],c[NMax],tot;
void merge(int a,int b)
{
    int mid=(a+b)/2,x=a,y=mid+1,k=0;
    while(x<=mid && y<=b)
    {
        if(S[x]>S[y])
        {
            c[++k]=S[y];
            y++;
            tot+=mid-x+1;    
        }
        else
        {
            c[++k]=S[x];
            x++;
        }
    }
    if(x<=mid)
        for(int i=x;i<=mid;i++) c[++k]=S[i];
    else
        for(int i=y;i<=b;i++) c[++k]=S[i];
    if(k!=b-a+1) puts("Error");
    for(int i=a;i<=b;i++)
        S[i]=c[i-a+1];
}
void solve(int a,int b)
{
    if(a>=b) return ;
    solve(a,(a+b)/2);
    solve((a+b)/2+1,b);
    merge(a,b);
}
int main()
{
    while(scanf("%d",&N),N)
    {
        tot=0;
        for(int i=1;i<=N;i++)
            scanf("%lld",&S[i]);
        solve(1,N);
        printf("%lld\n",tot);
    }
    return 0;
}
//來者請注意longlong
發佈了26 篇原創文章 · 獲贊 1 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章