codevs1688 求逆序对(权值线段树)
1688 求逆序对
给定一个序列a1,a2,…,an,如果存在i<j并且ai>aj,那么我们称之为逆序对,求逆序对的数目
数据范围:N<=105。Ai<=105。时间限制为1s。
第一行为n,表示序列长度,接下来的n行,第i+1行表示序列中的第i个数。
所有逆序对总数.
4
3
2
3
2
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 求逆序对(权值线段树)相关推荐
- 树套树 ----- 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],我们要减去[ ...
- 【BZOJ3295】动态逆序对,CDQ分治/BIT套权值线段树
传送门 思路: 用来练习cdq的题目 断断续续纠结了2天 因为loli一直在考试 最后莫名乱搞了一发就A了? 实际上是考虑每一次修改对答案的贡献,即位置在1~x-1且大于x的数以及位置在x+1~n且小 ...
- 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 ...
- HDU1394(权值线段树)
HDU1394(权值线段树) 题意: 给定一个0到n-1的数字组成的序列,可以将序列进行左移任意次,求所能组成序列的逆序对的最小值 题解: 利用权值线段树,我们先求出当前序列所能组成的逆序对, 然后依 ...
- 【bzoj2770】YY的Treap 权值线段树
题目描述 志向远大的YY小朋友在学完快速排序之后决定学习平衡树,左思右想再加上SY的教唆,YY决定学习Treap.友爱教教父SY如砍瓜切菜般教会了YY小朋友Treap(一种平衡树,通过对每个节点随机分 ...
- 树套树 ---- 树状数组套权值线段树模板题 P2617 Dynamic Rankings 动态第K大
题目链接 题目大意: 给你一个数组aaa,aaa有两个操作 询问aaa中[l,r][l,r][l,r]区间里面第kkk小的数是哪个? 修改axa_xax为yyy 解题思路: 首先我们知道权值线段树是 ...
- 【HDU6701】Make Rounddog Happy【权值线段树+双向单调队列】
题意:给你一个序列,求满足要求的子序列个数,其中要求为: 1.子序列的max-子序列长度len<=k 2.子序列中不出现重复的数字 题解:首先看到子序列max,很容易想到枚举最大值然后分治,这个 ...
- Governing sand(权值线段树/主席树)
链接:https://ac.nowcoder.com/acm/contest/887/C 来源:牛客网 时间限制:C/C++ 3秒,其他语言6秒 空间限制:C/C++ 65536K,其他语言13107 ...
- 权值线段树小结(hdu多校,普通平衡树,郁闷的出纳员)
之前刷了一点主席树的题目,但是没有系统的做过权值线段树的题目.主席树是多根权值线段树的综合.权值线段树可以解决在总区间里求第k大的问题.在普通的线段树里,我们每一个节点维护的是权值大小.但是在权值线段 ...
最新文章
- set.difference() 的用法(python3)_Python 集合 difference_update() 使用方法及示例
- oracle中 关于触发器,oracle 闪回关于触发器的bug
- Light-Head R-CNN
- HDFS数据定时采集demo 简单
- dojo Quick Start/dojo入门手册--面向对象,定义Class
- sql跨表查询_跨表更新,看到自己写的SQL像个憨憨
- centos php 开启libgdgd_CentOS6.5安装Nginx1+MySQL5+PHP5
- Linux内存管理:Fixmaps(固定映射地址)和ioremap
- 200Smart PLC 与丹佛斯变频器MODBUS RTU通讯实例
- 锂镍钴价格齐飞,新能源汽车涨价潮何时休?
- android webview打开pdf文件
- 【项目管理】开发方法和生命周期绩效域管理
- 别瞎扯,元宇宙就是没有切实发展?
- 为什么转置一个512x512的矩阵,会比513x513的矩阵慢很多?
- 【弹吉他必备的乐理知识】【1】音乐中的音
- uniapp 添加本地文件日志 并增加防抖(防止重复写入被覆盖)
- Shader攻占笔记(八)屏幕特效
- 梦想世界2014年5月29日服务器维护公告,2021年4月30日游戏更新公告
- 中文域名,手机号,网址收藏夹
- 普法知识(36):软件著作权人