zoukankan      html  css  js  c++  java
  • 【模板】树状数组求逆序对

    #include<cstdio>
    #include<algorithm>
    using namespace std;
    const int maxn=100010;
    int a[maxn],b[maxn],t[maxn],n,ans;
    void read(int &k){
    	k=0; int f=1; char c=getchar();
    	while(c<'0'||c>'9')c=='-'&&(f=-1),c=getchar();
    	while('0'<=c&&c<='9')k=k*10+c-'0',c=getchar();
    	k*=f; 
    }
    void add(int x){for(;x<=n;x+=(x&-x)) t[x]++;}			//树状数组 
    int query(int x){int ret=0; for(;x>0;x-=(x&-x)) ret+=t[x]; return ret;}
    int main(){
    	read(n);
    	for (int i=1;i<=n;i++) read(a[i]),b[i]=a[i]; int N=n;		//离散化 
    	sort(b+1,b+N+1); N=unique(b+1,b+1+n)-b-1;
    	for (int i=1;i<=n;i++) a[i]=lower_bound(b+1,b+1+N,a[i])-b;
    	for (int i=1;i<=n;i++) ans+=query(a[i]),add(a[i]);		//查询比a[i]小的数的个数,并加入a[i] 
    	return printf("%d
    ",n*(n-1)/2-ans),0;
    }
    

      

  • 相关阅读:
    合并两个有序链表
    有效括号方法二
    有效括号
    es6 中的模块化
    XMLHttpRequest 对象
    AST
    php读写文件方式
    vue开发中遇到的问题
    sublime操作
    cmd命令
  • 原文地址:https://www.cnblogs.com/DriverLao/p/7778987.html
Copyright © 2011-2022 走看看