codevs1688 求逆序对(权值线段树)
给定一个序列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 200007 using namespace std;
int n,x;
long long ans;
struct tree
{
int l,r;
long long sum;
}tr[N<<]; void push_up(int now)
{
tr[now].sum=tr[now<<].sum+tr[now<<|].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)>>;
build(now<<,l,mid);build(now<<|,mid+,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)>>;
if(x>mid) insert(now<<|,k);
if(x<=mid) insert(now<<,k);
push_up(now);
} long long gets(int now,int l,int r)
{
if(tr[now].l>r||tr[now].r<l) return ;
if(tr[now].l==l&&tr[now].r==r)
return tr[now].sum;
int mid=(tr[now].l+tr[now].r)>>;
if(l>mid) return gets(now<<|,l,r);
else if(r<=mid) return gets(now<<,l,r);
else return gets(now<<,l,mid)+gets(now<<|,mid+,r);
} int main()
{
scanf("%d",&n);
build(,,N);ans=;
for(int i=;i<=n;i++)
{
scanf("%d",&x);
ans+=gets(,x+,N);
insert(,x);
}
printf("%lld\n",ans);
return ;
}
codevs1688 求逆序对(权值线段树)的更多相关文章
- 洛谷P1908 逆序对 [权值线段树]
题目传送门 逆序对 题目描述 猫猫TOM和小老鼠JERRY最近又较量上了,但是毕竟都是成年人,他们已经不喜欢再玩那种你追我赶的游戏,现在他们喜欢玩统计.最近,TOM老猫查阅到一个人类称之为“逆序对”的 ...
- [BZOJ 3295] [luogu 3157] [CQOI2011]动态逆序对(树状数组套权值线段树)
[BZOJ 3295] [luogu 3157] [CQOI2011] 动态逆序对 (树状数组套权值线段树) 题面 给出一个长度为n的排列,每次操作删除一个数,求每次操作前排列逆序对的个数 分析 每次 ...
- 动态求区间K大值(权值线段树)
我们知道我们可以通过主席树来维护静态区间第K大值.我们又知道主席树满足可加性,所以我们可以用树状数组来维护主席树,树状数组的每一个节点都可以开一颗主席树,然后一起做. 我们注意到树状数组的每一棵树都和 ...
- BZOJ2141排队——树状数组套权值线段树(带修改的主席树)
题目描述 排排坐,吃果果,生果甜嗦嗦,大家笑呵呵.你一个,我一个,大的分给你,小的留给我,吃完果果唱支歌,大家 乐和和.红星幼儿园的小朋友们排起了长长地队伍,准备吃果果.不过因为小朋友们的身高有所区别 ...
- Luogu P1637 三元上升子序列【权值线段树】By cellur925
题目传送门 emmm..不开结构体的线段树真香! 首先我们知道"三元上升子序列"的个数就是对于序列中的每个数,**它左边比他小的数*它右边比他大的数**.但是如何快速求出这两个数? ...
- R - Weak Pair HDU - 5877 离散化+权值线段树+dfs序 区间种类数
R - Weak Pair HDU - 5877 离散化+权值线段树 这个题目的初步想法,首先用dfs序建一颗树,然后判断对于每一个节点进行遍历,判断他的子节点和他相乘是不是小于等于k, 这么暴力的算 ...
- 线段树(单标记+离散化+扫描线+双标记)+zkw线段树+权值线段树+主席树及一些例题
“队列进出图上的方向 线段树区间修改求出总量 可持久留下的迹象 我们 俯身欣赏” ----<膜你抄> 线段树很早就会写了,但一直没有总结,所以偶尔重写又会懵逼,所以还是要总结一下. ...
- HDU - 5592 ZYB's Premutation (权值线段树)
题意:给出序列前k项中的逆序对数,构造出这个序列. 分析:使用权值线段树来确定序列元素. 逆序对的数量肯定是递增的,从最后一个元素开始逆向统计,则\(a[i] - a[i-1]\)即位置i之前比位置i ...
- 【bzoj2212】[Poi2011]Tree Rotations 权值线段树合并
原文地址:http://www.cnblogs.com/GXZlegend/p/6826614.html 题目描述 Byteasar the gardener is growing a rare tr ...
随机推荐
- day09-文件的操作
目录 文件的基本操作 文件 什么是文件 如何使用文件 打开&关闭文件 打开&关闭文件 del f和f.close()的区别 文件路径 打开模式(不写默认是r) 编码格式 补充(open ...
- 我的FPGA
转眼间我都工作三个年头了,这两年多时间我一直从事着FPGA测试工作,从一开始的懵懂无知,到现在的些许理解,我想记录和分享我对FPGA测试的理解. 之所以选择在博客园写这样,是我发现在这里阅览文章不需要 ...
- Switch组件
Switch组件,业务需求中经常遇到.我司的旧项目中,由于没有使用较为成熟点的组件库.自己实现了一个switch组件,但是实现的略微有些丑陋. 实现基本需求 https://jsfiddle.net/ ...
- PAT 1103 Integer Factorization
The K-P factorization of a positive integer N is to write N as the sum of the P-th power of K positi ...
- 70. Climbing Stairs(动态规划)
You are climbing a stair case. It takes n steps to reach to the top. Each time you can either climb ...
- rpm包下载地址
https://dl.fedoraproject.org/pub/epel/6/x86_64/
- 【[Offer收割]编程练习赛13 A】风格不统一如何写程序
[题目链接]:http://hihocoder.com/problemset/problem/1501 [题意] [题解] 模拟题 [Number Of WA] 1 [完整代码] #include & ...
- 树屋阶梯(codevs 1741)
题目描述 Description 暑假期间,小龙报名了一个模拟野外生存作战训练班来锻炼体魄,训练的第一个晚上,教官就给他们出了个难题.由于地上露营湿气重,必须选择在高处的树屋露营.小龙分配的树屋建立在 ...
- MapReduce Shuffle优化方向
Shuffle过程介绍可以查看该博客:http://langyu.iteye.com/blog/992916 优化方向: 压缩:对数据进行压缩,减少写读数据量: 减少不必要的排序:并不是所有类型的Re ...
- hdu_1863_畅通工程_201403122000
畅通工程 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...