| ||||||||||
| 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 | |||||||||
线段树代码 仅供参考#include <iostream>
#include <set>
using namespace std;
#define SIZE 501000
struct Data{
int value,idx;
};
bool operator <(Data d1,Data d2)
{
if(d1.value==d2.value)
return d1.idx<d2.idx;
else
return d1.value<d2.value;
}
struct Node{
int l,r,v;
};
Node node[SIZE*3];
int data[SIZE];
int n;
void init(int v,int l,int r)
{
node[v].l=l;
node[v].r=r;
if(l==r)
{
node[v].v=1;
return ;
}
int mid=(l+r)/2;
init(v*2,l,mid);
init(v*2+1,mid+1,r);
node[v].v=node[v*2].v+node[v*2+1].v;
}
int query(int v,int l,int r)
{
if(node[v].l == l && node[v].r == r)
{
return node[v].v;
}
int mid=(node[v].l+node[v].r)/2;
if(l>mid)
return query(v*2+1,l,r);
else if(r<=mid)
return query(v*2,l,r);
else
{
return query(v*2,l,mid)+query(v*2+1,mid+1,r);
}
}
void sub(int v,int idx)
{
node[v].v--;
if(node[v].l==node[v].r && node[v].l==idx)
{
return ;
}
int mid=(node[v].l+node[v].r)/2;
if(idx<=mid)
sub(v*2,idx);
else
sub(v*2+1,idx);
}
set<Data>st;
int main()
{
while(scanf("%d",&n) && n!=0)
{
st.clear();
int i;
for(i=1;i<=n;i++)
{
scanf("%d",&data[i]);
Data dt;
dt.value=data[i];
dt.idx=i;
st.insert(dt);
}
init(1,1,n);
__int64 ans=0;
set<Data>::iterator it;
for(it=st.begin();it!=st.end();it++)
{
if(it->idx==1)
{
sub(1,it->idx);//还是得删除
continue;
}
ans+=query(1,1,it->idx - 1);
sub(1,it->idx);
}
printf("%I64d\n",ans);
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator