【树状数组(逆序数)】hdu 3743 Frosh Week

来源:互联网 发布:windows 进程 oid 编辑:程序博客网 时间:2024/04/29 20:16

http://acm.hdu.edu.cn/showproblem.php?pid=3743

分析:就是求逆序数,要注意离散化处理,题目信息也不说行清楚


#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int NM=1000005;int a[NM],c[NM];struct Node{int vau,pos;}node[NM];int lowbit(int x){return x&(-x);}void add(int x){while(x<NM){c[x]++;x+=lowbit(x);}}__int64 getsum(int x){__int64 ans=0;while(x>0){ans+=c[x];x-=lowbit(x);}return ans;}bool comp(struct Node A,struct Node B){if(A.vau<B.vau) return 1;else return 0;}int main(){int n,i;__int64 res;while(scanf("%d",&n)!=EOF){memset(c,0,sizeof(c));for(i=1;i<=n;i++){scanf("%d",&node[i].vau);node[i].pos=i;}sort(node+1,node+1+n,comp);for(i=1;i<=n;i++)a[node[i].pos]=i;res=0;for(i=1;i<=n;i++){add(a[i]);res+=i-getsum(a[i]);}printf("%I64d\n",res);}return 0;}


0 0
原创粉丝点击