| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
线段树1700表示鸭梨很大!!!#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <cmath>
#include <stack>
#include <queue>
#define int1 __int64
#define M 850000
using namespace std;
struct no{
int1 left,right,s;
}tree[M*6];
struct kl{
int1 x;
int1 y;
}a[M];
bool cmp(kl s,kl d1){
return s.x<d1.x;
}
void build(int1 l,int1 r,int1 i){
tree[i].left=l;
tree[i].right=r;
tree[i].s=0;
if(l==r) return;
int1 mid=(l+r)>>1;
build(l,mid,i<<1);
build(mid+1,r,i<<1|1);
}
void insert(int1 l,int1 r,int1 i){
if(tree[i].left==l&&tree[i].right==r){
tree[i].s++;
return;
}
int1 mid=(tree[i].left+tree[i].right)>>1;
if(r<=mid) insert(l,r,i<<1);
else if(l>mid) insert(l,r,i<<1|1);
else insert(l,mid,i<<1),insert(mid+1,r,i<<1|1);
tree[i].s=tree[i<<1].s+tree[i<<1|1].s;
}
int ans;
void add(int1 l,int1 r,int1 i){
if(tree[i].left>=l&&tree[i].right<=r){
ans+=tree[i].s;
return;
}
if(tree[i].left==tree[i].right) return;
int1 mid=(tree[i].left+tree[i].right)>>1;
if(r<=mid) add(l,r,i<<1);
else if(l>mid) add(l,r,i<<1|1);
else add(l,mid,i<<1),add(mid+1,r,i<<1|1);
}
int1 sorted[M];
int main(){
int1 n;
while(cin>>n,n){
for(int1 i=1;i<=n;i++){
scanf("%I64d",&a[i].x);
a[i].y=i;
}
sort(a+1,a+1+n,cmp);
int1 u=1;sorted[0]=1;a[n+1].y=-5455;
for(int1 i=1;i<=n;i++){
if(a[i].x!=a[i+1].x){
sorted[a[i].y]=(u++);
}
else {
sorted[a[i].y]=u;
}
}
build(1,n,1);
int1 sum=0;
for(int1 i=1;i<=n;i++){
ans=0;
add(1,sorted[i],1);
sum+=(i-ans-1);
insert(sorted[i],sorted[i],1);
}
printf("%I64d\n",sum);
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator