SGU 180 Inversions

点击打开sgu 180

思路: 树状数组+离散化

分析:

1 题目给定n个数,每个数最大为10^9 , 最小为0,求多少个匹配使得1<=i<j<=n并且A[i] > A[j]

2 因为数的最大值为10^9.所以我们应该利用离散化的思想。然后在利用树状数组求个数即可

3 注意由于输入的值由可能为0,我们应该在输入的时候就把所有的值加上1

代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;

const int MAXN = 66000;

int n;
int num[MAXN];
int treeNum[MAXN];

int lowbit(int x){
    return x&(-x);
}

int getSum(int x){
    int sum = 0;
    while(x){
        sum += treeNum[x];
        x -= lowbit(x);
    }
    return sum;
}

void add(int x , int val){
    while(x < MAXN){
         treeNum[x] += val;
         x += lowbit(x);
    }
}

int search(int x){
    int left = 0;
    int right = n-1;
    while(left <= right){
        int mid = (left+right)>>1;
        if(num[mid] == x)
            return mid+1;
        else if(num[mid] < x)
            left = mid+1;
        else
            right = mid-1;
    }
}

long long solve(){
    int tmp[MAXN];
    memcpy(tmp , num , sizeof(num));
    sort(num , num+n);
    long long ans = 0;
    for(int i = 0 ; i < n ; i++){
        int x = search(tmp[i]);
        ans += i-getSum(x);
        add(x , 1);
    }
    return ans;
}

int main(){
    int x;
    while(scanf("%d" , &n) != EOF){
         memset(treeNum , 0 , sizeof(treeNum));
         for(int i = 0 ; i < n ; i++){
             scanf("%d" , &num[i]);
             num[i]++;
         }
         printf("%lld\n" , solve());
    }
    return 0;
}
时间: 2024-08-30 18:46:51

SGU 180 Inversions的相关文章

树状数组专题【完结】

1 国外的论文点击打开链接 2 我的总结点击打开链接 任何能够造成树状数组下表为0的操作都会使得程序TLE,这是个很重要的地方! 第一题 poj 2299 Ultra-QuickSort 点击打开poj 2299 思路: 离散化+树状数组 分析: 1 题目的意思就是要求逆序数对 2 题目的输入个数有500000的规模但是每个数的最大值为999999999,因此我们需要离散化这些数据 3 对于数据9 1 0 5 4我们离散化成5 2 1 4 3 那么对于输入一个树a[i]我们去求一下它的离散化后的

Flash中人物180°转身动作实现

前言:在傲旗的第二届flash大赛中,我提交了个作品,因为当时事儿多,所以没有最后完成,只做到了一半,其中的男主人公有个180°的转身动作,那个flash传上去以后,我记得香港的闪友"李蠢"第一个问我是怎么画的,我告诉他一侦一侦画的,后来又有不少的朋友问我这个问题,近来终于有了点空余时间,所以写了这个教程,希望能对热爱flash动画的朋友们有所帮助! 如下面的动画效果: 一.打开flash MX 新建一个文件,执行View(查看)-Grid(网格)-Show Grid(显示网格)命令:

Flash中人物180°转身动作实现技法

  前言:在傲旗的第二届flash大赛中,我提交了个作品,因为当时事儿多,所以没有最后完成,只做到了一半,其中的男主人公有个180°的转身动作,那个flash传上去以后,我记得香港的闪友"李蠢"第一个问我是怎么画的,我告诉他一侦一侦画的,后来又有不少的朋友问我这个问题,近来终于有了点空余时间,所以写了这个教程,希望能对热爱flash动画的朋友们有所帮助! 如下面的动画效果: 一.打开flash MX 新建一个文件,执行View(查看)-Grid(网格)-Show Grid(显示网格)命

flash人物180°转身动作教程

教程 前言:在傲旗的第二届flash大赛中,我提交了个作品,因为当时事儿多,所以没有最后完成,只做到了一半,其中的男主人公有个180°的转身动作,那个flash传上去以后,我记得香港的闪友"李蠢"第一个问我是怎么画的,我告诉他一侦一侦画的,后来又有不少的朋友问我这个问题,近来终于有了点空余时间,所以写了这个教程,希望能对热爱flash动画的朋友们有所帮助! 如下面的动画效果: 点击这里下载源文件   作者:shume 过程: 一.打开flash MX 新建一个文件,执行View(查看)

WPF案例(二) 模拟Apple OS界面前后180度反转

我们在设计应用程序界面的时候,为了充分利用界面空间,住住需要灵活的界面布局方式, 比如可以在界面正面空间上定义一个Chart,背面空间上定义一个GridView,通过在Chart上鼠标 双击,控件180度旋转后向用户显示出界面背面的GridView,通过在GridView上双击鼠标,控件 再一次平滑的180度旋转向用户显示正面的Chart 这个例子就是使用Wpf模拟Apple OS 实现一个包含正反面元素的控件以Y轴为坐标前后180翻 转的动画效果,在这里为方便示例,在正反面各以一个Image来

windows系统桌面旋转90度或180度怎么修复?

  windows系统桌面旋转了90度或180度怎么修复.有时我们不知道碰到键盘那个按键了,突然电脑旋转了90度,不知道怎么设置回来.下文小编就教大家怎么设置在电脑自己系统内修复桌面旋转了90度或180度问题. 1:在电脑桌面上空白地方右键,选择个性化. 2:找到左下角的显示. 3:点击更改显示器设置. 4:点击方向,选择横向.这里可以通过更改显示的外观那里可以看到.最后要记得保存才会生效的. 这就是小编给大家带来的windows系统桌面旋转了90度或180度怎么修复步骤.

苹果应用商店程序数量超50万总下载180亿次

网易科技讯 10月5日消息,苹果软件部门http://www.aliyun.com/zixun/aggregation/1719.html">高级副总裁Scott Forstall在新品发布会上表示,苹果应用程序商店目前的程序数量已经超过50万个,其中14万个是针对iPad的,总下载次数已经超过180亿次. Scott Forstall表示,目前苹果拥有10万个程序的开发者. 而这样的应用程序数量超过其他商店,在市场统计中,苹果iOS的移动设备拥有43%的市场,开发者也更愿意在用户更多的平

求一条正则表达式 经度纬度的 经度 -180到180之间 小数点后面6位

问题描述 求一条正则表达式 经度纬度的 经度 -180到180之间 小数点后面6位 经度 -180到180之间 小数点后面6位 纬度 -90到90之间 小数点也是6位写两个正则表达式 解决方案 http://tool.oschina.net/regex/ 解决方案二: ^0$|^-?0.d*[1-9]$|^-?1-9?$|^-?[1-9]d(.d*[1-9])?$|^-?1[0-7]d(.d*[1-9])?$|^-?180$ 解决方案三: -?(1[0-9]{2}|[1-9]?[0-9]).[0

c# 正在表达式 经度-180到180之间 小数点后六位 纬度-90到90之间

问题描述 c# 正在表达式 经度-180到180之间 小数点后六位 纬度-90到90之间 c# 正在表达式 经度-180到180之间 小数点后六位 纬度-90到90之间 小数点后六位 求一个有效的正则表达式 解决方案 (-)(([0-8]d)|(90)|(d))(.d{1,6}) (-)((1[0-7]d)|(180)|(d{1,2}))(.d{1,6})