您的位置:首页 > 其它

树状数组求逆序对数板子

2016-11-10 15:55 344 查看
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<queue>
#include<stack>
#include<set>
#include<map>
#include<cmath>
#include<iomanip>
#define debug(x) cerr<<#x<<"="<<x<<endl
using namespace std;
typedef pair<int,int> pii;
typedef long long ll;
const int INF = 0x7f7f7f7f;
const ll llINF = 0x7fffffffff;
inline int init()
{
int now=0,ju=1;char c;bool flag=false;
while(1)
{
c=getchar();
if(c=='-')ju=-1;
else if(c>='0'&&c<='9')
{
now=now*10+c-'0';
flag=true;
}
else if(flag)return now*ju;
}
}
inline long long llinit()
{
long long now=0,ju=1;char c;bool flag=false;
while(1)
{
c=getchar();
if(c=='-')ju=-1;
else if(c>='0'&&c<='9')
{
now=now*10+c-'0';
flag=true;
}
else if(flag)return now*ju;
}
}
struct node
{
int v,index;
}p[510000];
int lowbit(int x)
{
return x&(-x);
}
int a[510000];
int n;
int b[500010];
bool cmp(node a,node b)
{
return a.v<b.v;
}
int getsum(int x)
{
int tmp=x,tot=0;
while(x)
{
tot+=b[x];
x-=lowbit(x);
}
return tot;
}
void build(int x)
{
int tmp=x;
for(;tmp+=lowbit(tmp);tmp<=n)
{
b[tmp]+=p[x].v;
}
}
void ins(int x,int v)
{
for(int i=x;i<=n;i+=lowbit(i))
{
b[i]+=v;
}
}
int main()
{
int ans=0;
n=init();
for(int i=1;i<=n;i++)
{
p[i].index=i;
p[i].v=init();
}
sort(p+1,p+1+n,cmp);
for(int i=1;i<=n;i++)
{
a[p[i].index]=i;
}
for(int i=1;i<=n;i++)
{
ins(a[i],1);
ans+=i-getsum(a[i]);
}
printf("%d\n",ans);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: