博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDOJ2838(树状数组)
阅读量:6914 次
发布时间:2019-06-27

本文共 1033 字,大约阅读时间需要 3 分钟。

大意:求所有逆序数对的和

分析:对于数a,他的逆序数对之和为:逆序对数*a+a之前比a大的数。开两个树状数组,一个求逆序对数,一个求和。

代码

#include 
#include
#include
#include
#define MAXN 100001using namespace std;struct tree{ int t; long long sum;}tree[MAXN];int n;int lowbit(int i){ return i&(-i);}void update(int i, int s, int x){ while (i <= n) { tree[i].t += x; tree[i].sum += s; i = i + lowbit(i); }}int queryx(int n){ int ans = 0; while (n > 0) { ans += tree[n].t; n -= lowbit(n); } return ans;}long long querysum(int n){ long long ans = 0; while (n > 0) { ans += tree[n].sum; n -= lowbit(n); } return ans;}int main(){ while (~scanf("%d", &n)) { long long ans = 0; memset(tree, 0, sizeof(tree)); for (int i = 1; i <= n; i++) { int a; scanf("%d", &a); update(a, a, 1); long long k = i - queryx(a); if (k != 0) { long long k1 = querysum(n) - querysum(a);//前n个数之和减去比a小的数之和,即比a大的数之和。 ans += k*a + k1; } } printf("%lld\n", ans); } return 0;}

转载于:https://www.cnblogs.com/nickqiao/p/7583386.html

你可能感兴趣的文章
mongoDB高级查询这一篇就够了
查看>>
js节流和防抖
查看>>
MySQL学习笔记之三排序和过滤
查看>>
VUE 使用笔记
查看>>
(转)Android studio 多渠道打包(超简洁版)
查看>>
你好!未来的我
查看>>
iOS 【奇巧淫技】获取webView内容高度
查看>>
阿里云CentOS MYSQL无法访问3306端口解决方案之一(不建议)
查看>>
java基础-多线程初步了解
查看>>
零基础微信开发之自动回复电影
查看>>
spring Cloud Gateway 入门简单使用
查看>>
SpringBoot源码解析-内嵌Tomcat容器的启动
查看>>
Flow_学习笔记
查看>>
阿里Java面试题剖析:关于系统拆分,为什么要进行系统拆分?
查看>>
Application 详解
查看>>
玩转Kotlin- 实现方法队列 ,顺序执行
查看>>
朋友,这里有个仓库需要你 PR 一下
查看>>
nginx-kafka 数据采集
查看>>
js把URL转成对象 对象转换成URL
查看>>
犀牛书阅读手记
查看>>