nyoj117——树状数组升级版(树状数组+离散化)
求逆序数
- 描述
-
在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序。一个排列中逆序的总数就称为这个排列的逆序数。
现在,给你一个N个元素的序列,请你判断出它的逆序数是多少。
比如 1 3 2 的逆序数就是1。
- 输入
- 第一行输入一个整数T表示测试数据的组数(1<=T<=5)
每组测试数据的每一行是一个整数N表示数列中共有N个元素(2〈=N〈=1000000)
随后的一行共有N个整数Ai(0<=Ai<1000000000),表示数列中的所有元素。数据保证在多组测试数据中,多于10万个数的测试数据最多只有一组。
- 输出
- 输出该数列的逆序数
- 样例输入
-
2
2
1 1
3
1 3 2 - 样例输出
-
0
1 - 来源
- [张云聪]原创
- 上传者
- 张云聪
#include "bits/stdc++.h"
using namespace std;
typedef long long ll;
const int INF = 0x3f3f3f3f;
const int maxn = ; int c[maxn];
int d[maxn];
int n; struct node
{
ll val;
int pos;
}nd[maxn]; bool cmpp(const node &a, const node &b)
{
if(a.val == b.val)return a.pos < b.pos;
return a.val < b.val;
} int lowbit(ll x)
{
return x&(-x);
} int query(ll x)
{
int res = ;
while(x){
res += d[x];
x -= lowbit(x);
}
return res;
} void add(int x,int v)
{
while(x <= n){
d[x] += v;
x += lowbit(x);
}
} int main()
{
int t;
scanf("%d",&t);
while(t--) {
memset(nd,,sizeof(nd));
memset(d,,sizeof(d));
memset(c,,sizeof(c));
scanf("%d",&n);
for(int i=;i <= n;i++){
int x;
scanf("%d",&x);
nd[i].val = x;
nd[i].pos = i;
}
sort(nd+,nd+n+,cmpp);//数组离散化↓↓
for(int i=;i <= n;i++){
c[nd[i].pos] = i;
} // ↑↑
ll res = ;
for(int i=;i <= n;i++){
add(c[i],);
res += i - query(c[i]);
}
printf("%lld\n",res);
}
return ;
}
---数组肯定是不能开到1000000000的,这时候我们就需要离散化处理。
其实离散化很简单,我们使用离散化的时候,元素之间只有大小关系,比如逆序对,因此我们可以将数组疯狂压缩,输入多少个元素,其实就只需要开多大的数组。
nyoj117——树状数组升级版(树状数组+离散化)的更多相关文章
- 【BZOJ-1452】Count 树状数组 套 树状数组
1452: [JSOI2009]Count Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 1769 Solved: 1059[Submit][Stat ...
- hdu 1166:敌兵布阵(树状数组 / 线段树,入门练习题)
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- js List<Map> 将偏平化的数组转为树状结构并排序
数据格式: [ { "id":"d3e8a9d6-e4c6-4dd8-a94f-07733d3c1b59", "parentId":&quo ...
- hdu 3966 Aragorn's Story(树链剖分+树状数组/线段树)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3966 题意: 给出一棵树,并给定各个点权的值,然后有3种操作: I C1 C2 K: 把C1与C2的路 ...
- zoj2112 树状数组+主席树 区间动第k大
Dynamic Rankings Time Limit: 10000MS Memory Limit: 32768KB 64bit IO Format: %lld & %llu Subm ...
- BZOJ_1901_Zju2112 Dynamic Rankings_树状数组+主席树
BZOJ_1901_Zju2112 Dynamic Rankings_树状数组+主席树 题意: 给定一个含有n个数的序列a[1],a[2],a[3]……a[n],程序必须回答这样的询问:对于给定的i, ...
- Luogu 2680 NOIP 2015 运输计划(树链剖分,LCA,树状数组,树的重心,二分,差分)
Luogu 2680 NOIP 2015 运输计划(树链剖分,LCA,树状数组,树的重心,二分,差分) Description L 国有 n 个星球,还有 n-1 条双向航道,每条航道建立在两个星球之 ...
- 洛谷P2414 阿狸的打字机 [NOI2011] AC自动机+树状数组/线段树
正解:AC自动机+树状数组/线段树 解题报告: 传送门! 这道题,首先想到暴力思路还是不难的,首先看到y有那么多个,菜鸡如我还不怎么会可持久化之类的,那就直接排个序什么的然后按顺序做就好,这样听说有7 ...
- Aragorn's Story 树链剖分+线段树 && 树链剖分+树状数组
Aragorn's Story 来源:http://www.fjutacm.com/Problem.jsp?pid=2710来源:http://acm.hdu.edu.cn/showproblem.p ...
- 【BZOJ】1047: [HAOI2007]理想的正方形(单调队列/~二维rmq+树状数组套树状数组)
http://www.lydsy.com/JudgeOnline/problem.php?id=1047 树状数组套树状数组真心没用QAQ....首先它不能修改..而不修改的可以用单调队列做掉,而且更 ...
随机推荐
- JAVA中重写equals()方法为什么要重写hashcode()方法?
object对象中的 public boolean equals(Object obj),对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true:注意:当此方法 ...
- android 读取联系人
设置读取权限 <uses-permission android:name="android.permission.READ_CONTACTS" /> <u ...
- 03 linux命令的操作
开启Linux操作系统,要求以root用户登录GNOME图形界面,语言支持选择为汉语 使用快捷键切换到虚拟终端2,使用普通用户身份登录,查看系统提示符 使用快捷键切换到虚拟终端5,使用管理员身份登录, ...
- hdu2825Wireless Password
地址:http://acm.hdu.edu.cn/showproblem.php?pid=2825 题目: Wireless Password Time Limit: 2000/1000 MS (Ja ...
- SpringMVC项目配置
一.创建一个maven项目 1.new一个maven项目,选择next,如图:
- 20145307第三次JAVA学习实验报告
20145307 <Java程序设计>第三次实验报告 北京电子科技学院(BESTI)实验报告 课程:Java程序设计 班级:1453 指导教师:娄嘉鹏 实验日期:2016.04.22 实验 ...
- 20145327 《Java程序设计》第八周学习总结
20145327 <Java程序设计>第八周学习总结 教材学习内容总结 NIO使用频道(channel)来衔接数据节点,在处理数据时,NIO可以让你设定缓冲区(Buffer)容量,在缓冲区 ...
- 置顶,置低实现与window.scroll
//置顶,置低实现 $('#updown .up').click(function(){$('html,body').animate({scrollTop: '0px'}, 300);}); $('# ...
- @component的注解
1.@controller 控制器(注入服务) 2.@service 服务(注入dao) 3.@repository dao(实现dao访问) 4.@component (把普通pojo实例化到spr ...
- 在eclipse搭建python开发环境
在一次看别人帖子的时候发现,别人是用eclipse来写python代码的,所以好奇也想尝试一番,之前一直在用Pycharm,这个也确实是最好的开发python的IDE了,但是有时候也会有卡顿的情况,主 ...