传送门

  这题似乎不应该出现在这里。。

日常做法(归并):

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string>
#include<cstdlib>
#include<stack>
#include<vector>
#include<queue>
#include<deque>
#include<map>
#include<set>
using namespace std;
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
#define maxn 2000003
typedef long long LL;
LL n,ans=;
LL a[maxn],r[maxn];
inline LL read()
{
LL kr=,xs=;
char ls;
ls=getchar();
while(!isdigit(ls))
{
if(!(ls^))
kr=-;
ls=getchar();
}
while(isdigit(ls))
{
xs=(xs<<)+(xs<<)+(ls^);
ls=getchar();
}
return xs*kr;
}
void msort(LL s,LL t)
{
if(s==t) return ;
LL mid=(s+t)/;
msort(s,mid);
msort(mid+,t);
LL i=s,j=mid+,k=s;
while(i<=mid&&j<=t)
{
if(a[i]<=a[j])
r[k]=a[i],k++,i++;
else
{
r[k]=a[j],k++,j++;
ans+=mid-i+;
}
}
while(i<=mid)
r[k]=a[i],k++,i++;
while(j<=t)
r[k]=a[j],k++,j++;
for(LL i=s;i<=t;i++)
a[i]=r[i];
}
int main()
{
n=read();
for(LL i=;i<=n;i++)
a[i]=read();
msort(,n);
printf("%lld\n",ans);
return ;
}

权值线段树做法:

  需要先预处理,得到每个值在权值线段树中的位置;再按顺序将数字 a[ i ] 插入到树中相应的位置 ,接着询问树中比它大的元素个数,容易知道这些数都与当前的数 a[ i ] 形成逆序对,直接累加进 ans。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string>
#include<cstdlib>
#include<stack>
#include<vector>
#include<queue>
#include<deque>
#include<map>
#include<set>
using namespace std;
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
#define maxn 500002
typedef long long LL;
LL n,ans=;
LL a[maxn];
struct hh
{
LL l_son,r_son,root;
}sum[maxn<<];
inline LL read()
{
LL kr=,xs=;
char ls;
ls=getchar();
while(!isdigit(ls))
{
if(!(ls^))
kr=-;
ls=getchar();
}
while(isdigit(ls))
{
xs=(xs<<)+(xs<<)+(ls^);
ls=getchar();
}
return xs*kr;
}
inline void build_sum(LL k,LL l,LL r)
{
sum[k].l_son=l;sum[k].r_son=r;
if(l==r) return ;
LL mid=sum[k].l_son+sum[k].r_son>>;
build_sum(k<<,l,mid);
build_sum(k<<|,mid+,r);
}
inline void up_date(LL k,LL q)
{
if(q==sum[k].l_son&&q==sum[k].r_son)
{
sum[k].root++;
return;
}
LL mid=sum[k].l_son+sum[k].r_son>>;
if(q<=mid) up_date(k<<,q) ;
else if(mid<q) up_date(k<<|,q);
sum[k].root=sum[k<<].root+sum[k<<|].root;
}
inline LL query(LL k,LL r,LL l)
{
if(r<=sum[k].l_son&&l>=sum[k].r_son )
return sum[k].root ;
LL mid=(sum[k].l_son+sum[k].r_son)>>;
if (r>mid) return query(k<<|,r,l);
else if(l<=mid) return query(k<<,r,l);
return query(k<<,r,mid)+query(k<<|,mid+,l);
}
int main()
{
n=read();
for(LL i=;i<=n;i++)
a[i]=read();
build_sum(,,n);
for(LL i=;i<=n;i++)
{
LL tmp=a[i];
up_date (,tmp);
ans+=i-query(,,tmp);
}
printf("%lld\n",ans);
return ;
}

P1908 逆序对的更多相关文章

  1. 洛谷P1908 逆序对

    P1908 逆序对 2.2K通过 4.4K提交 题目提供者该用户不存在 标签云端 难度普及/提高- 时空限制1s / 128MB 提交  讨论  题解 最新讨论更多讨论 归并排序党注意了!数组要开… ...

  2. 「杂烩」精灵魔法(P1908逆序对弱化版)

    「杂烩」精灵魔法(P1908逆序对弱化版) 题面: 题目描述 \(Tristan\)解决了英灵殿的守卫安排后,便到达了静谧的精灵领地--\(Alfheim\) .由于$ Midgard$ 处在$ Al ...

  3. 洛谷P1908 逆序对【递归】

    题目:https://www.luogu.org/problemnew/show/P1908 题意:给定一个数组,求逆序对个数. 思路: 是一个很经典的题目了.通过归并排序可以求逆序对个数. 现在有一 ...

  4. P1908 逆序对-(树状数组)

    https://www.luogu.org/problem/P1908 比较喜欢线段树,懒得用树状数组(只会套模板,位运算的精髓没有领悟到),一直没有记录树状数组代码,又得捡回来,趁这道题记录一下模板 ...

  5. P1908 逆序对-(cdq分治)

    https://www.luogu.org/problem/P1908 沿用归并排序的思想求逆序对. 坑1:结果爆int型,需要用longlong 坑2:相对于归并排序,在比较的时候多了一个等号 举例 ...

  6. P1908 逆序对(归并排序)

    https://www.luogu.com.cn/problem/P1908 归并排序是用来求逆序对的 归并排序的思想就是分治 #include <bits/stdc++.h> using ...

  7. P1908 逆序对——树状数组&离散化&快读快写の学习

    题目简述: 对于给定的一段正整数序列,逆序对就是序列中 a_i>a_jai​>aj​ 且 i<ji<j 的有序对. 输出序列中逆序对的数目. 知识补充: 树状数组: 这东西就是 ...

  8. 洛谷 P1908 逆序对 Label:归并排序||树状数组 不懂

    题目描述 猫猫TOM和小老鼠JERRY最近又较量上了,但是毕竟都是成年人,他们已经不喜欢再玩那种你追我赶的游戏,现在他们喜欢玩统计.最近,TOM老猫查阅到一个人类称之为“逆序对”的东西,这东西是这样定 ...

  9. 洛谷 P1908 逆序对

    \[传送门qwq\] 题目描述 猫猫\(TOM\)和小老鼠\(JERRY\)最近又较量上了,但是毕竟都是成年人,他们已经不喜欢再玩那种你追我赶的游戏,现在他们喜欢玩统计. 最近,\(TOM\)老猫查阅 ...

  10. (逆序对 分治法)P1908 逆序对 洛谷

    题目描述 猫猫TOM和小老鼠JERRY最近又较量上了,但是毕竟都是成年人,他们已经不喜欢再玩那种你追我赶的游戏,现在他们喜欢玩统计.最近,TOM老猫查阅到一个人类称之为“逆序对”的东西,这东西是这样定 ...

随机推荐

  1. php(数组方法

    什么是数组? 数组就是一组数据的集合 其表现形式就是内存中的一段连续的内存地址 数组名称其实就是连续内存地址的首地址 关于js中的数组特点 数组定义时无需指定数据类型 数组定义时可以无需指定数组长度 ...

  2. Golang覆盖写入文件的小坑

    记录一点Golang文件操作的笔记,环境:Ubuntu // 删除文件 func removeFile() { err := os.Remove("test.txt") if er ...

  3. day19:常用模块(collections,time,random,os,sys)

    1,正则复习,re.S,这个在用的最多,re.M多行模式,这个主要改变^和$的行为,每一行都是新串开头,每个回车都是结尾.re.L 在Windows和linux里面对一些特殊字符有不一样的识别,re. ...

  4. 前后端分离项目,标准json协议格式参考

      正常返回 { "code": 0, "data": [{ "cTime": "2018-11-19 14:46:16" ...

  5. python->读写excel

    from openpyxl import load_workbook#将一个excel文档中的数据存放内存中,即变量wb保存了该excel的所有信息wb = load_workbook(r" ...

  6. CSS中的display属性(none,block,inline,inline-block,inherit)

    css中的display属性(none,block,inline,inline-block,inherit) display属性是我们在前端开发中常常使用的一个属性,其中,最常见的有: none bl ...

  7. MyBatisPlus忽略映射字段注解

    MyBatisPlus忽略映射字段注解 @TableField(exist = false):表示该属性不为数据库表字段,但又是必须使用的. @TableField(exist = true):表示该 ...

  8. java框架之SpringBoot(9)-数据访问及整合MyBatis

    简介 对于数据访问层,无论是 SQL 还是 NOSQL,SpringBoot 默认采用整合 SpringData 的方式进行统一处理,添加了大量的自动配置,引入了各种 Template.Reposit ...

  9. Java基础(变量数&常量&据类型&类型转换)

    什么是变量: 变量就是一个不固定的数值,它随时会改变,就像银行卡里存的钱一样会变动. 变量的格式:1  数据类型 变量名=变量值:  2  数据类型 变量名: 变量名=变量值: 变量的三大要素:1变量 ...

  10. 10 个非常实用的 SVG 动画操作JavaScript 库

      SVG 通常可以用作跨分辨率视频.这意味着在一块高分屏幕上不会降低图片的锐度.此外,你甚至可以让SVG动起来,通过使用一些javascript类库.下面,我们分享一些javascript类库,这些 ...