Problem: 2299 User: shu_dayang
Memory: 7380K Time: 500MS
Language: C++ Result: Accepted
Source Code
//树状数组
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
typedef long long LL;
#define MAXN 500005
#define MID(l,r) ((l + r) >> 1)
using namespace std;
int c[MAXN],aa[MAXN];
int n;
struct Node
{
int val;
int order;
}a[MAXN];
bool cmp(Node a, Node b)
{
return a.val < b.val;
}
int lowbit(int x)
{
return x &(-x);
}
void update(int x)
{
while(x <= n)
{
c[x] += 1;
x += lowbit(x);
}
}
int query(int x)
{
int sum = 0;
while(x > 0)
{
sum += c[x];
x -= lowbit(x);
}
return sum;
}
int main()
{
LL ans;
while(~scanf("%d",&n) && n != 0)
{
memset(c,0,sizeof(c));
for(int i = 1; i <= n; i++)
{
scanf("%d",&a[i].val);
a[i].order = i;
}
sort(a+1,a+1+n,cmp);
for(int i = 1; i <= n; i++)
aa[a[i].order] = i;
ans = 0;
for(int i = 1; i <= n; i++)
{
update(aa[i]);
ans += i - query(aa[i]);
}
printf("%I64d\n",ans);
}
return 0;
}
线段树:
Problem: 2299 User: shu_dayang
Memory: 9540K Time: 922MS
Language: C++ Result: Accepted
//线段树
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
typedef long long LL;
#define MAXN 500005
#define MID(l,r) ((l + r) >> 1)
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
using namespace std;
int sum[MAXN << 2],aa[MAXN];
int n;
struct Node
{
int val;
int order;
}a[MAXN];
bool cmp(Node a, Node b)
{
return a.val < b.val;
}
void PushUp(int rt)
{
sum[rt] = sum[rt << 1] + sum[rt << 1 | 1];
}
void Build(int l,int r ,int rt)
{
sum[rt] = 0;
if(l == r)
{
return;
}
int m = MID(l,r);
Build(lson);
Build(rson);
}
void Update(int p,int l,int r,int rt)
{
if(l == r)
{
sum[rt]++;
return;
}
int m = MID(l,r);
if(p <= m)
Update(p,lson);
else
Update(p,rson);
PushUp(rt);
}
int Query(int L,int R,int l,int r,int rt)
{
if(L<=l&&r <=R)
{
return sum[rt];
}
int res = 0;
int m = MID(l,r);
if(L<=m)
res += Query(L,R,lson);
if(R>m)
res+=Query(L,R,rson);
return res;
}
int main()
{
LL ans;
while(~scanf("%d",&n) && n != 0)
{
Build(1,n,1);
for(int i = 1; i <= n; i++)
{
scanf("%d",&a[i].val);
a[i].order = i;
}
sort(a+1,a+1+n,cmp);
for(int i = 1; i <= n; i++)
aa[a[i].order] = i;
ans = 0;
for(int i = 1; i <= n; i++)
{
Update(aa[i],1,n,1);
ans += i - Query(1,aa[i],1,n,1);
}
printf("%I64d\n",ans);
}
return 0;
}
归并:
Problem: 2299 User: shu_dayang
Memory: 3712K Time: 1360MS
Language: C++ Result: Accepted
//归并
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#define MID(l,r) ((l+r) >> 1)
typedef long long LL;
#define MAXN 500005
using namespace std;
int num[MAXN];
LL ans;
void Merge(int low,int mid,int high)
{
int *temp = new int[high - low + 1];
int k = 0;
int i = low,j = mid + 1;
while(i <= mid && j <= high)
{
if(num[i] > num[j])
{
ans += mid - i + 1;
temp[k++] = num[j++];
}
else
{
temp[k++] = num[i++];
}
}
while(i<=mid) temp[k++] = num[i++];
while(j <= high) temp[k++] = num[j++];
for(int i = 0; i< k; i++)
num[low+i] = temp[i];
delete []temp;
}
void MergeSort(int low,int high)
{
if(low < high)
{
int m = MID(low,high);
MergeSort(low,m);
MergeSort(m+1,high);
Merge(low,m,high);
}
}
int main()
{
int n;
while(~scanf("%d",&n) && n != 0)
{
ans = 0;
for(int i = 0; i< n; i++)
scanf("%d",&num[i]);
MergeSort(0,n-1);
printf("%I64d\n",ans);
}
return 0;
}