逆序对模板题/x(怎么又是模板题啊)
题目大意:
给你一个长度为n的序列,求逆序对数
直接上归并排序。。。才怪。。。
作为一个热衷于权值线段树的菜鸡,当然直接上权值线段树辣!
只需要实现insert()添加一个数和find()查询值的范围属于查询区间的数字的个数
这两个基本函数就行。
代码:
#include<bits/stdc++.h> using namespace std; const int N=1e5+1; int W[N<<2]; inline void insert(int now,int l,int r,int x){ ++W[now]; if(l==r)return; int mid=(l+r)>>1; if(x<=mid)insert(now<<1,l,mid,x); else insert(now<<1|1,mid+1,r,x); } inline int find(int now,int l,int r,int lc,int rc){ if(lc<=l&&r<=rc)return W[now]; int mid=(l+r)>>1,res=0; if(lc<=mid)res+=find(now<<1,l,mid,lc,rc); if(rc>mid)res+=find(now<<1|1,mid+1,r,lc,rc); return res; } int main(){ int n;long long res=0; scanf("%d",&n); for(int i=1;i<=n;++i){ int x; scanf("%d",&x);++x; if(x!=N)res+=find(1,1,N,x+1,N); insert(1,1,N,x); } printf("%lld",res); return 0; }