1688 求逆序对

 时间限制: 1 s
 空间限制: 128000 KB
 题目等级 : 黄金 Gold

题解
 查看运行结果

题目描述 Description

给定一个序列a1,a2,…,an,如果存在i<j并且ai>aj,那么我们称之为逆序对,求逆序对的数目

数据范围:N<=105。Ai<=105。时间限制为1s。

输入描述 Input Description

第一行为n,表示序列长度,接下来的n行,第i+1行表示序列中的第i个数。

输出描述 Output Description

所有逆序对总数.

样例输入 Sample Input

4

3

2

3

2

样例输出 Sample Output

3

/*
权值线段树模板
首先我们更改线段树叶子节点处存储的内容,将其更改为权值,并且记录对于一个权值x的个数。
那么我们首先构建一棵空树,
对于每次插入的数字x,我们查找x+1到max区间的数字存在的个数,并将这个个数加入答案,
然后插入这个数字。最后输出答案就可以了。。
*/
#include<iostream>
#include<cstdio>
#include<cstring>#define N 200007using namespace std;
int n,x;
long long ans;
struct tree
{int l,r;long long sum;
}tr[N<<2];void push_up(int now)
{tr[now].sum=tr[now<<1].sum+tr[now<<1|1].sum;
}void build(int now,int l,int r)
{tr[now].l=l;tr[now].r=r;if(l==r) return;int mid=(tr[now].l+tr[now].r)>>1;build(now<<1,l,mid);build(now<<1|1,mid+1,r);
}void insert(int now,int k)
{if(tr[now].l==k && tr[now].l==tr[now].r) {tr[now].sum++;return;} int mid=(tr[now].l+tr[now].r)>>1;if(x>mid) insert(now<<1|1,k);if(x<=mid) insert(now<<1,k);push_up(now);
}long long gets(int now,int l,int r)
{if(tr[now].l>r||tr[now].r<l) return 0;if(tr[now].l==l&&tr[now].r==r)return tr[now].sum;int mid=(tr[now].l+tr[now].r)>>1;if(l>mid) return gets(now<<1|1,l,r);else if(r<=mid) return gets(now<<1,l,r);else return gets(now<<1,l,mid)+gets(now<<1|1,mid+1,r);
}int main()
{scanf("%d",&n);build(1,1,N);ans=0;for(int i=1;i<=n;i++){scanf("%d",&x);ans+=gets(1,x+1,N);insert(1,x);}printf("%lld\n",ans);return 0;
}

转载于:https://www.cnblogs.com/L-Memory/p/7245029.html

codevs1688 求逆序对(权值线段树)相关推荐

  1. 树套树 ----- P1975 [国家集训队]排队(树状数组套权值线段树求动态逆序对)

    解题思路: 首先我们知道交换两个数a[l]和a[r]a[l]和a[r]a[l]和a[r]影响到的区间是[l+1,r−1][l+1,r-1][l+1,r−1] 对于a[l]a[l]a[l],我们要减去[ ...

  2. 【BZOJ3295】动态逆序对,CDQ分治/BIT套权值线段树

    传送门 思路: 用来练习cdq的题目 断断续续纠结了2天 因为loli一直在考试 最后莫名乱搞了一发就A了? 实际上是考虑每一次修改对答案的贡献,即位置在1~x-1且大于x的数以及位置在x+1~n且小 ...

  3. Minimum Inversion Number HDU - 1394(权值线段树/树状数组)

    The inversion number of a given number sequence a1, a2, -, an is the number of pairs (ai, aj) that s ...

  4. HDU1394(权值线段树)

    HDU1394(权值线段树) 题意: 给定一个0到n-1的数字组成的序列,可以将序列进行左移任意次,求所能组成序列的逆序对的最小值 题解: 利用权值线段树,我们先求出当前序列所能组成的逆序对, 然后依 ...

  5. 【bzoj2770】YY的Treap 权值线段树

    题目描述 志向远大的YY小朋友在学完快速排序之后决定学习平衡树,左思右想再加上SY的教唆,YY决定学习Treap.友爱教教父SY如砍瓜切菜般教会了YY小朋友Treap(一种平衡树,通过对每个节点随机分 ...

  6. 树套树 ---- 树状数组套权值线段树模板题 P2617 Dynamic Rankings 动态第K大

    题目链接 题目大意: 给你一个数组aaa,aaa有两个操作 询问aaa中[l,r][l,r][l,r]区间里面第kkk小的数是哪个? 修改axa_xax​为yyy 解题思路: 首先我们知道权值线段树是 ...

  7. 【HDU6701】Make Rounddog Happy【权值线段树+双向单调队列】

    题意:给你一个序列,求满足要求的子序列个数,其中要求为: 1.子序列的max-子序列长度len<=k 2.子序列中不出现重复的数字 题解:首先看到子序列max,很容易想到枚举最大值然后分治,这个 ...

  8. Governing sand(权值线段树/主席树)

    链接:https://ac.nowcoder.com/acm/contest/887/C 来源:牛客网 时间限制:C/C++ 3秒,其他语言6秒 空间限制:C/C++ 65536K,其他语言13107 ...

  9. 权值线段树小结(hdu多校,普通平衡树,郁闷的出纳员)

    之前刷了一点主席树的题目,但是没有系统的做过权值线段树的题目.主席树是多根权值线段树的综合.权值线段树可以解决在总区间里求第k大的问题.在普通的线段树里,我们每一个节点维护的是权值大小.但是在权值线段 ...

最新文章

  1. set.difference() 的用法(python3)_Python 集合 difference_update() 使用方法及示例
  2. oracle中 关于触发器,oracle 闪回关于触发器的bug
  3. Light-Head R-CNN
  4. HDFS数据定时采集demo 简单
  5. dojo Quick Start/dojo入门手册--面向对象,定义Class
  6. sql跨表查询_跨表更新,看到自己写的SQL像个憨憨
  7. centos php 开启libgdgd_CentOS6.5安装Nginx1+MySQL5+PHP5
  8. Linux内存管理:Fixmaps(固定映射地址)和ioremap
  9. 200Smart PLC 与丹佛斯变频器MODBUS RTU通讯实例
  10. 锂镍钴价格齐飞,新能源汽车涨价潮何时休?
  11. android webview打开pdf文件
  12. 【项目管理】开发方法和生命周期绩效域管理
  13. 别瞎扯,元宇宙就是没有切实发展?
  14. 为什么转置一个512x512的矩阵,会比513x513的矩阵慢很多?
  15. 【弹吉他必备的乐理知识】【1】音乐中的音
  16. uniapp 添加本地文件日志 并增加防抖(防止重复写入被覆盖)
  17. Shader攻占笔记(八)屏幕特效
  18. 梦想世界2014年5月29日服务器维护公告,2021年4月30日游戏更新公告
  19. 中文域名,手机号,网址收藏夹
  20. 普法知识(36):软件著作权人

热门文章

  1. swift 3d v6.0汉化中文版
  2. 2017-10-29—英语发音的一些技巧总结
  3. 主流浏览器及对应内核
  4. 建立二叉树A【openjudge】
  5. 我在大学毕业后学习Linux、python的一些经验
  6. Rust 1.27支持SIMD
  7. 在Android界面上显示和获取Logcat日志输出
  8. appium===元素定位
  9. VC使用CRT调试功能检测内存泄漏(转载)
  10. Python OpenCV学习笔记之:分水岭算法分割图像