題目:
Ultra-QuickSort produces the output
Your task is to determine how many swap operations Ultra-QuickSort needs to perform in order to sort a given input sequence. Input
5 9 1 0 5 4 3 1 2 3 0Sample Output 6 0
線段樹代碼:
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<vector>
#include<stack>
#include<bitset>
#include<cstdlib>
#include<cmath>
#include<set>
#include<list>
#include<deque>
#include<map>
#include<queue>
using namespace std;
typedef long long ll;
const double PI = acos(-1.0);
const double eps = 1e-6;
const int INF = 1000000000;
const int maxn = 555555;
int T,n,m;
int a[maxn];
int sum[4*maxn];
struct HASH
{
int id;
int num;
}Hash[maxn];
bool cmp(HASH a,HASH b)
{
if(a.num!=b.num)
return a.num<b.num;
else
return a.id<b.id;
}
void pushup(int t)
{
sum[t]=sum[t*2]+sum[t*2+1];
}
void build(int l,int r,int t)
{
sum[t]=0;
if(l==r)
return;
int m=(l+r)/2;
build(l,m,t*2);
build(m+1,r,t*2+1);
pushup(t);
}
void update(int k,int l,int r,int t)
{
if(l==r)
{
sum[t]++;
return;
}
int m=(r+l)/2;
if(k<=m)
update(k,l,m,t*2);
else
update(k,m+1,r,t*2+1);
pushup(t);
}
int query(int L,int R,int l,int r,int t)
{
if(L<=l&&R>=r)
return sum[t];
int m=(l+r)/2;
int ret=0;
if(L<=m)
ret+=query(L,R,l,m,t*2);
if(R>m)
return ret+=query(L,R,m+1,r,t*2+1);
return ret;
}
int main()
{
int n;
ll ans;
while(scanf("%d",&n)!=EOF&&n)
{
memset(sum,0,sizeof(sum));
memset(a,0,sizeof(a));
build(1,n,1);
ans=0;
for(int i=1;i<=n;i++)
{
scanf("%d",&Hash[i].num);
Hash[i].id=i;
}
sort(Hash+1,Hash+n+1,cmp);
for(int i=1;i<=n;i++)
{
ans+=query(Hash[i].id+1,n,1,n,1);
update(Hash[i].id,1,n,1);
}
printf("%I64d\n",ans);
}
}
樹狀數組代碼:
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<vector>
#include<stack>
#include<bitset>
#include<cstdlib>
#include<cmath>
#include<set>
#include<list>
#include<deque>
#include<map>
#include<queue>
using namespace std;
typedef long long ll;
const double PI = acos(-1.0);
const double eps = 1e-6;
const int INF = 1000000000;
const int maxn = 654321;
int T,n,q;
ll ans;
int c[maxn];
struct NUM
{
int w;
int id;
}num[maxn];
bool cmp(NUM a,NUM b)
{
if(a.w==b.w)
return a.id<b.id;
else
return a.w<b.w;
}
int lowbit(int x)
{
return x&(-x);
}
int query_sum(int x)
{
int sum=0;
while(x>0)
{
sum+=c[x];
x-=lowbit(x);
}
return sum;
}
void update(int x, int v)
{
while(x<=n)
{
c[x]+=v;
x+=lowbit(x);
}
}
int main()
{
while(scanf("%d",&n)!=EOF&&n)
{
memset(c,0,sizeof(c));
ans=0;
for(int i=1;i<=n;i++)
{
scanf("%d",&num[i].w);
num[i].id=i;
}
sort(num+1,num+n+1,cmp);
for(int i=1;i<=n;i++)
{
ans+=(query_sum(n)-query_sum(num[i].id));
update(num[i].id,1);
}
printf("%lld\n",ans);
}
return 0;
}