nyoj 117 找到的倒数 【树阵】+【分离】
这个问题的解决方案是真的很不错!!!
思路:建立一个结构体包括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 找到的倒数 【树阵】+【分离】的更多相关文章
- BZOJ 3211 弗洛拉前往国家 树阵+并检查集合
标题效果:给定一个序列,它提供了以下操作: 1.将[l.r]每个号码间隔a[i]变sqrt(a[i]) 2.查询[l,r]间隔和 剧烈的变化不支持由间隔,因此,我们选择单 - 点更换间隔查询的树阵,但 ...
- poj 2309 BST 使用树阵lowbit
假设领悟了树阵lowbit,这个问题很简单,底部是奇数,使用lowbit(x)寻找x父亲,然后x父亲-1是的最大数量 至于lowbit问题是如何计算,寻找x父亲,事实上x+2^x二进制结束0的数量. ...
- HDOJ 5147 Sequence II 树阵
树阵: 每个号码的前面维修比其数数少,和大量的这后一种数比他的数字 再枚举每一个位置组合一下 Sequence II Time Limit: 5000/2500 MS (Java/Others) ...
- nyoj 322 Sort 【树阵】
这个问题实际上是在测试树的数组. 代码: #include <cstdio> #include <cstring> int c[1005]; int lowbit(int x) ...
- POJ 3928 & HDU 2492 Ping pong(树阵评价倒数)
主题链接: PKU:http://poj.org/problem?id=3928 HDU:http://acm.hdu.edu.cn/showproblem.php?pid=2492 Descript ...
- NYOJ 117 求逆序数 (树状数组)
题目链接 描述 在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序.一个排列中逆序的总数就称为这个排列的逆序数. 现在,给你一个N个元素的序列,请你判断出 ...
- 每天一个小算法(5)----找到链表倒数第K个结点
估计这个问题在面试中被问烂了. 思路是先找到正数的第K个结点的指针pT,然后和指向头结点的指针pN一起向后移动,直到第K个指针指向NULL,此时pN指向的结点即倒数第K个结点. 如图: #includ ...
- NYOJ 231 Apple Tree (树状数组)
题目链接 描述 There is an apple tree outside of kaka's house. Every autumn, a lot of apples will grow in t ...
- poj 1804 (nyoj 117)Brainman : 归并排序求逆序数
点击打开链接 Brainman Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 7810 Accepted: 4261 D ...
随机推荐
- Twenty Newsgroups Classification实例任务之TrainNaiveBayesJob(一)
接着上篇blog,继续看log里面的信息如下: + echo 'Training Naive Bayes model' Training Naive Bayes model + ./bin/mahou ...
- java定义和实现接口
1.定义接口 使用interface来定义一个接口.接口定义同类的定义类似,也是分为接口的声明和接口体.当中接口体由常量定义和方法定义两部分组成.定义接口的基本格式例如以下: [修饰符] in ...
- firebug使用
查看网页的header是优化web应用的关键一环,从header中,可以检查到非常 多的信息:网页在squid中的缓存时间(age).客户端缓存时间(expires).是否有最后修改时间(last-m ...
- Advanced Data Structures
Advanced Data Structures Advanced Data Structures
- iOS学习——iOS国际化(十二)
开发的移动应用更希望获取更多用户,走向世界,这就需要应用国际化,国际化其实就是多语言.这篇文章介绍Xcode4.5以后的国际化,包括应用名国际化和应用内容国际化.如果是Xcode4.5之前版本请参考. ...
- 上mongodb创建一些吸取的经验教训指数
想来接触mongodb它已经快一年了,对于其指数已经积累了很多的经验,知识,以这个夜黑风高的优势,放mongodb总结一番吧. 一,索引介绍 mongodb具有两类索引,分别为单键索引和复合索引. 1 ...
- Defender Game 游戏实践(1) 基本游戏场景实现
在网上看到 郑州|boy 这个博客,里面有几篇文章,记录了其用cocos2d-x这个游戏引擎编写的一个游戏,十分不错,所以这段时间,依样画葫芦,依次学习一下. 由于博主开发的平台是在win32,而且屏 ...
- achieve aop through xml
The main way to achive AOP is deploying a xml file. Now a xml file is presented to be a explanation ...
- Ubuntu9.04更新源
1.sudo gedit /etc/apt/sources.list 编辑你的源列表,加入以下列表中你认为适合你的,拷贝到你的列表中,然后保存列表. Archive.ubuntu.com更新serve ...
- swift-switch使用方法
// Playground - noun: a place where people can play import UIKit //--------------------------------- ...