这个问题的解决方案是真的很不错!!!



思路:建立一个结构体包括val和id。 val就是输入的数,id表示输入的顺序。然后依照val从小到大排序。假设val相等。那么就依照id排序。

假设没有逆序的话,肯定id是跟i(表示拍好后的顺序)一直一样的。假设有逆序数。那么有的i和id是不一样的。

所以,利用树状数组的特性。我们能够简单的算出逆序数的个数。

假设还是不明确的话举个样例。(输入4个数)

输入:9 -1 18 5

输出 3.

输入之后相应的结构体就会变成这样

val:9 -1 18 5

id:  1  2  3  4

排好序之后就变成了

val :  -1 5 9 18

id:      2 4  1  3

之后再利用树状数组的特性就能够解决这个问题了。



注意:id 要从1開始。

代码:

#include <cstdio>
#include <cstring>
#include <algorithm>
#define M 1000005
using std::sort;
struct node{
int id, val;
}s[M];
int c[M], n;
int cmp(node a, node b){
if(a.val != b.val) return a.val < b.val;
return a.id<b.id;
} int lowbit(int x){
return x&(-x);
} int getsum(int x){
int sum = 0;
while(x){
sum += c[x];
x -= lowbit(x);
}
return sum;
} void add(int x){
while(x <= M){
c[x]++;
x += lowbit(x);
}
}
int main(){
int t, i;
scanf("%d", &t);
while(t --){
scanf("%d", &n);
for(i = 1; i<= n; i ++){
scanf("%d", &s[i].val);
s[i].id = i;
//c[i] = 0;
}
memset(c, 0, sizeof(int)*(n+1));
sort(s+1, s+n+1, cmp);
long long ans = 0;
for( i = 1; i <= n; i ++){
add(s[i].id); //和以下的不能互换
ans += (i-getsum(s[i].id)); //这里是(i-getsum(s[i].id))
}
printf("%lld\n", ans);
}
return 0;
}

题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=117

版权声明:本文博客原创文章,博客,未经同意,不得转载。

nyoj 117 找到的倒数 【树阵】+【分离】的更多相关文章

  1. BZOJ 3211 弗洛拉前往国家 树阵+并检查集合

    标题效果:给定一个序列,它提供了以下操作: 1.将[l.r]每个号码间隔a[i]变sqrt(a[i]) 2.查询[l,r]间隔和 剧烈的变化不支持由间隔,因此,我们选择单 - 点更换间隔查询的树阵,但 ...

  2. poj 2309 BST 使用树阵lowbit

    假设领悟了树阵lowbit,这个问题很简单,底部是奇数,使用lowbit(x)寻找x父亲,然后x父亲-1是的最大数量 至于lowbit问题是如何计算,寻找x父亲,事实上x+2^x二进制结束0的数量. ...

  3. HDOJ 5147 Sequence II 树阵

    树阵: 每个号码的前面维修比其数数少,和大量的这后一种数比他的数字 再枚举每一个位置组合一下 Sequence II Time Limit: 5000/2500 MS (Java/Others)    ...

  4. nyoj 322 Sort 【树阵】

    这个问题实际上是在测试树的数组. 代码: #include <cstdio> #include <cstring> int c[1005]; int lowbit(int x) ...

  5. POJ 3928 &amp; HDU 2492 Ping pong(树阵评价倒数)

    主题链接: PKU:http://poj.org/problem?id=3928 HDU:http://acm.hdu.edu.cn/showproblem.php?pid=2492 Descript ...

  6. NYOJ 117 求逆序数 (树状数组)

    题目链接 描述 在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序.一个排列中逆序的总数就称为这个排列的逆序数. 现在,给你一个N个元素的序列,请你判断出 ...

  7. 每天一个小算法(5)----找到链表倒数第K个结点

    估计这个问题在面试中被问烂了. 思路是先找到正数的第K个结点的指针pT,然后和指向头结点的指针pN一起向后移动,直到第K个指针指向NULL,此时pN指向的结点即倒数第K个结点. 如图: #includ ...

  8. NYOJ 231 Apple Tree (树状数组)

    题目链接 描述 There is an apple tree outside of kaka's house. Every autumn, a lot of apples will grow in t ...

  9. poj 1804 (nyoj 117)Brainman : 归并排序求逆序数

    点击打开链接 Brainman Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 7810   Accepted: 4261 D ...

随机推荐

  1. drupal THEME主要文件

    **.info 文件** .info 文件是一个必需的文件:Drupal 必须包括它,才干看到主题. .info 文件告诉 Drupal 主题的内部名称.比如,假设这个文件的名称是 ibmtheme. ...

  2. Java 螺纹第三版 第一章Thread介绍、 第二章Thread创建和管理学习笔记

    第一章 Thread导论 为何要用Thread ? 非堵塞I/O      I/O多路技术      轮询(polling)      信号 警告(Alarm)和定时器(Timer) 独立的任务(Ta ...

  3. linux通过使用mail发送电子邮件

    通过外部方法发送的电子邮件 bin/mail默认为本地sendmail发送电子邮件,求本地的机器必须安装和启动Sendmail服务.配置很麻烦,并且会带来不必要的 资源占用.而通过改动配置文件能够使用 ...

  4. 温故知新-------jQuery层次选择器

    <html xmlns="http://www.w3.org/1999/xhtml">  <head>     <title></titl ...

  5. Android----------WindowManager

    我们Android平台是一个又一个的Activity组成的,每个Activity有一个或者多个View构成.所以说.当我们想显示一个界面的时候,我们首先想到的是建立一个Activity,然后全部的操作 ...

  6. hdu3829(最大独立集)

    传送门:Cat VS Dog 题意:动物园有N只猫,M只狗,P个小孩.每个小孩都有自己喜欢的动物和讨厌的动物,如果他喜欢狗,那么就讨厌猫, 如果他讨厌狗,那么他就喜欢猫.某个小孩能开心,当且仅当他喜欢 ...

  7. 黑马程序猿————OC在Foundation框架结构和字符串

    ------<a href="http://www.itheima.com" target="blank">Java火车.Android火车.iOS ...

  8. NET工厂模式架构

    NET工厂模式架构 最近项目的架构需要做调整优化,根据业务需要写了一个简单的工厂模式架构 项目介绍:整个系统分为三大平台(这里用A,B,C来标示),每个平台又细分为多个APP客户端(每个APP都有ap ...

  9. 谈谈android反编译和防止反编译的方法(转)

    谈谈android反编译和防止反编译的方法(转) android基于java的,而java反编译工具很强悍,所以对正常apk应用程序基本上可以做到100%反编译还原. 因此开发人员如果不准备开源自己的 ...

  10. pan

    百度云盘地址第一季http://pan.baidu.com/share/link?shareid=198342&uk=1191518428第二季http://pan.baidu.com/sha ...