zoukankan      html  css  js  c++  java
  • 线段树动态开点之逆序对

    对于给定的一段正整数序列,逆序对就是序列中ai>aj且i<j的有序对。
    求这段正整数序列中逆序对的数目。
    Input
    第一行,一个数n,表示序列中有n个数。N<=5*10^5
    第二行n个数,表示给定的序列。序列中每个数字不超过10^9
    Output
    给定序列中逆序对的数目。
    Sample Input
    6
    5 4 2 6 3 1
    Sample Output
    11

    #include<cstdio>
    #define ll long long
    using namespace std;
    const int N=1e7+7; 
    int n,r;
    ll ans;
    struct A
    {
    	int cnt,c[N],lc[N],rc[N];
    	int sum(int p,int l,int r,int x,int y)
    	{
    		if(!p) return 0;
    		if(l==x&&r==y) 
    		    return c[p];
    		int mid=l+r>>1;
    		if(y<=mid) return sum(lc[p],l,mid,x,y);
    		if(x>mid) return sum(rc[p],mid+1,r,x,y);
    		return sum(lc[p],l,mid,x,mid)+sum(rc[p],mid+1,r,mid+1,y);    
    	}
    	
    	void add(int &p,int l,int r,int x,int k)
    	{
    		if(!p) 
    		    p=++cnt; 
    		if(l==r) 
    		{
    			c[p]+=k; 
    			return;
    		}
    		int mid=l+r>>1;
    		if(x<=mid) 
    		    add(lc[p],l,mid,x,k);
    		else 
    		    add(rc[p],mid+1,r,x,k);
    		c[p]=c[lc[p]]+c[rc[p]];
    	}
    }tree;
    int main()
    {
    	scanf("%d",&n);
    	for(int i=1;i<=n;i++)
    	{
    		int x; scanf("%d",&x);
    		ans+=tree.sum(r,1,1e9,x+1,1e9);
    		tree.add(r,1,1e9,x,1);
    	}
    	printf("%lld",ans);
    	return 0;
    }
    

      

  • 相关阅读:
    java DES转C#DES加密解密
    PIE SDK影像格式转换
    PIE SDK位深转换
    PIE SDK存储格式转换
    PIE SDK栅格生成等值线、面
    PIE SDK反距离权重插值算法
    PIE SDK克里金插值法
    PIE SDK热力图
    PIE SDK Alpha通道数据渲染
    PIE SDK 多数据源的复合数据集加载
  • 原文地址:https://www.cnblogs.com/cutemush/p/11833958.html
Copyright © 2011-2022 走看看