Time Limit: 7000MS | Memory Limit: 65536K | |
Total Submissions: 48371 | Accepted: 17657 |
Description
Input
Output
Sample Input
5 9 1 0 5 4 3 1 2 3 0
Sample Output
6 0 因为没用long long 而WA。。#include <iostream> #include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> #include <ctype.h> #define LL long long #include<algorithm> LL a[500010],b[500010],ans,n; using namespace std; void he(LL s,LL mid,LL e) { LL i=s,j=mid+1,k=0; while(i<=mid&&j<=e) { if(a[i]>=a[j])//逆序数的生成只可能在a[i]>=a[j]的情况下,切有多少a[i]在a[j]前,就有多少逆序对<span id="transmark"></span> { ans+=(mid-i+1); b[k++]=a[j++]; } else { b[k++]=a[i++]; } } while(i<=mid) b[k++]=a[i++]; while(j<=e) b[k++]=a[j++]; for(i=s,k=0;i<=e;k++,i++) a[i]=b[k]; } void mer(LL s,LL e) { if(s<e)//分为两堆时,不可以有=,否则没意义。 { LL mid=(s+e)/2; mer(s,mid); mer(mid+1,e); he(s,mid,e); } } int main() { LL n,m,i,j,k,s; while(scanf("%lld",&n)!=EOF&&n) { ans=0; for(i=0;i<n;i++) { scanf("%lld",&a[i]); } mer(0,n-1); printf("%lld\n",ans); } }