zoukankan      html  css  js  c++  java
  • HDOJ2689(树状数组)

    大意:求逆序数

    分析:数据较小,可以用树状数组。数据大则用归并。用树状数组求逆序数时,数组tree代表数字x是否在序列中出现过,如果数字x已经存在于序列中,则tree[x]=1,否则tree[x]=0,此时query(x)返回值为在序列中比数字x小的元素的个数,如果序列中第i个元素的值为x,那么前i个元素中比x大的元素的个数为i-query(x)。

    代码

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    using namespace std;
    int n, tree[1005];
    int lowbit(int i)
    {
    	return i&(-i);
    }
    void update(int i, int x)
    {
    	while (i <= n)
    	{
    		tree[i] += x;
    		i = i + lowbit(i);
    	}
    }
    int query(int n)
    {
    	int sum = 0;
    	while (n > 0)
    	{
    		sum += tree[n];
    		n = n - lowbit(n);
    	}
    	return sum;
    }
    int main()
    {
    	while (scanf("%d", &n) != EOF&&n)
    	{
    		int a, ans = 0;
    		memset(tree, 0, sizeof(tree));
    		for (int i = 1; i <= n; i++)
    		{
    			scanf("%d", &a);
    			update(a, 1);
    			ans += i - query(a);
    		}
    		printf("%d
    ", ans);
    	}
    	return 0;
    }

  • 相关阅读:
    文件同步工具
    截图工具
    DBF文件工具
    Oracle旗下的开源虚拟机
    远程协助工具
    切换网络IP工具
    MySQL(C#的链接姿势)
    大写URL转小写
    一个textview实现文字在图片上面的效果
    通过代码设置textview颜色
  • 原文地址:https://www.cnblogs.com/nickqiao/p/7583387.html
Copyright © 2011-2022 走看看