emmm

想写一下逆序对

用了两种方法

归并排序和树状数组

我们看到这道题正常的思路就是暴力(也有可能仅限于本蒟蒻这么想

然后写出了这样的代码

#include<cstdio>
using namespace std;
int a[500010];
int main() {int n,ans = 0;scanf("%d",&n);for(int i = 1; i <= n; i++) {scanf("%d",&a[i]);}for(int i = 1; i <= n; i++)for(int j = i + 1; j <= n; j++)if(a[j] < a[i])ans++;printf("%d",ans);return 0;
}

emmm

十分简洁的t了十五个点拿了25分

(其实暴力就够了嘛。

但是仔细想逆序对其实就是排序的过程,暴力的思路就是冒泡,显然超时

那么还有一种排序叫做归并

复杂度。。。(我不知道请您自己百度orz

emmmm

归并排序的思路大概都懂吧。

上代码

#include<cstdio>
#include<algorithm>
using namespace std;
#define maxn 500010
#define ll long longll a[maxn],n;
ll qwq[maxn];
ll ans;void qsort(ll l,ll r){if(l == r)return ;ll mid = (l + r) >> 1;qsort(l,mid);qsort(mid + 1,r);ll i = l,j = mid + 1,k = l;while(i <= mid && j <= r){//合并操作if(a[i] <= a[j])qwq[k++] = a[i++];elseqwq[k++] = a[j++],ans += mid - i + 1;}while(i <= mid)qwq[k] = a[i],k++,i++;while(j <= r)qwq[k] = a[j],k++,j++;for(ll i = l;i <= r;i++)a[i] = qwq[i];
}//其实归并排序不是很难emmmm多想一想就好啦int main(){scanf("%lld",&n);for(ll i = 1;i <= n;i++)scanf("%lld",&a[i]);qsort(1,n);printf("%lld",ans);return 0;
}

再然后呢

学长给我讲了树状数组求逆序对

(这里我们再来膜一下 tql!!!%%%

emmmm

大概就是

利用桶排序的思路,从后往前将数放入数组里

在每一次的数组处加一,并求出其之前的前缀和

最后将前缀和加和,就是答案啦

手推一下就会了~

(当然前置知识树状数组不用我说吧。。。

(然后我正在和离散化过程中两个数相同的情况作斗争,目前写的只有40分

啊对

离散化

就是如果有三个数

30000000 40000000 10000000

太大了

这时候我们可以把这三个数简化成

2 3 1

emmmm

大概这就叫离散化吧

先放一下40分代码

#include<cstdio>
#include<algorithm>
using namespace std;
#define maxn 500010
#define ll long longll ans,n;
ll www[maxn];struct Tree{ll num,QAQ,qwq;
}tree[maxn];bool cmp(Tree x,Tree y){return x.QAQ < y.QAQ;
}bool ccmp(Tree x,Tree y){return x.qwq < y.qwq;
}ll lowbit(ll x){return x & (-x);
}void add(ll x){while(x <= n){www[x] ++;x += lowbit(x);}
}ll sum(ll x){ll orz = 0;while(x > 0){orz += www[x];x -= lowbit(x);}return orz;
}int main(){scanf("%lld",&n);for(ll i = 1;i <= n;i++){scanf("%lld",&tree[i].QAQ);tree[i].qwq = i;}sort(tree + 1,tree + n + 1,cmp);for(ll i = 1;i <= n;i++)tree[i].num = i;sort(tree + 1,tree + n + 1,ccmp);for(ll i = n;i >= 1;i--){add(tree[i].num);ans += sum(tree[i].num - 1);}printf("%lld",ans);return 0;
}

等我什么时候用树状数组拿了100

再来写详细注释orz

【溜

-------------------------------------------------------第二天的分割线------------------------------------------------------------------

emmmm

写出来了诶

然而还是不想写注释

#include<cstdio>
#include<algorithm>
using namespace std;
#define maxn 500010
#define ll long longll ans,n;
ll www[maxn];struct Tree {ll num,QAQ,qwq;
} tree[maxn];bool cmp(Tree x,Tree y) {return x.QAQ < y.QAQ;
}bool ccmp(Tree x,Tree y) {return x.qwq < y.qwq;
}ll lowbit(ll x) {return x & (-x);
}void add(ll x) {while(x <= n) {www[x] ++;x += lowbit(x);}
}ll sum(ll x) {ll orz = 0;while(x > 0) {orz += www[x];x -= lowbit(x);}return orz;
}//以上,树状数组操作int main() {scanf("%lld",&n);for(ll i = 1; i <= n; i++) {scanf("%lld",&tree[i].QAQ);//QAQ记录原始数据tree[i].qwq = i;//qwq记录输入顺序
    }sort(tree + 1,tree + n + 1,cmp);//排QAQ来进行我那被学长称为独特的离散化操作
// for(ll i = 1;i <= n;i++)// tree[i].num = i;int now = 1;int last = tree[1].QAQ;tree[1].num = 1;for(int i = 1; i <= n; i++) {if(tree[i] .QAQ == last) {tree[i].num = now;continue;}last = tree[i].QAQ;now++;tree[i].num = now;}//这里就是我从40到100的转折点emmmm防止数据重复sort(tree + 1,tree + n + 1,ccmp);//排序qwq使恢复正常输入顺序for(ll i = n; i >= 1; i--) {add(tree[i].num);ans += sum(tree[i].num - 1);}//从后往前依次放到树状数组里然后求和printf("%lld",ans);return 0;
}

emmmm

写出来了开心~

-----------------------------------------再次分割线----------------------------------------------------

突然想起来把两种代码运行结果放一起比较一下

首先这是归并排序的emmmm

然后是树状数组的

(emmmmm没有对比就没有伤害啊

转载于:https://www.cnblogs.com/sevenyuanluo/p/10127754.html

luogu P1908 逆序对相关推荐

  1. 信息学奥赛一本通 1311:【例2.5】求逆序对 | 1237:求排列的逆序数 | OpenJudge NOI 2.4 7622:求排列的逆序数 | 洛谷 P1908 逆序对

    [题目链接] ybt 1311:[例2.5]求逆序对 ybt 1237:求排列的逆序数 OpenJudge NOI 2.4 7622:求排列的逆序数 洛谷 P1908 逆序对 ybt 1311,123 ...

  2. 【算法】树状数组 P1908 逆序对

    P1908 逆序对 #include<iostream> #include<cstdio> #include<algorithm> #define ll long ...

  3. [洛谷P1908] 逆序对|归并排序|树状数组

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

  4. 洛谷 P1908 逆序对(树状数组+离散化)

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

  5. 用不同的姿势求逆序对(复习篇)

    用不同的姿势求逆序对(复习篇) 文章目录 用不同的姿势求逆序对(复习篇) 前言 讲解 归并排序 树状数组 线段树 题目 思路 代码 归并排序求逆序对 树状数组求逆序对 线段树求逆序对 历届试题 小朋友 ...

  6. 分治算法,逆序对,三维偏序与CDQ分治

    分治算法基本思想 当我们求解某些问题时,由于这些问题要处理的数据相当多,或求解过程相当复杂,使得直接求解法在时间上相当长,或者根本无法直接求出. 对于这类问题,我们往往先把它分解成几个子问题,找到求出 ...

  7. 树状数组(求逆序对)

    一.树状数组是什么 树状数组,又称二进制索引树,英文名Binary Indexed Tree 之前遇到一个求逆序对的题,看了很多题解都只说了这个树状数组,关于怎么实现的全都避而不谈,我研究了一下午,总 ...

  8. 洛谷P1908求逆序对【树状数组】

    逆序对 逆序对的定义:对于给定的一段正整数序列,逆序对就是序列中 ai>aj,i<ja_i>a_j,i<jai​>aj​,i<j,让统计逆序对的个数. 本题的数据加 ...

  9. 逆序对(洛谷P1908题题解,Java语言描述)

    题目要求 题目链接 分析 逆序对这个说法我们在线性代数应该就接触过了吧,这里的逆序对应该与序偶也有关吧,总之简单点说就是顺序反了(相较于我们的比较标准)的一对数据. <1, 2, 3, 4, 5 ...

  10. 逆序对(洛谷-P1908)

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

最新文章

  1. -webkit-overflow-scrolling:touch
  2. 11g中AWR新快照视图
  3. 获取上传图片路径方法(新旧方法)
  4. 直播 | ICML 2021论文解读:满足隐私保护要求的去中心化无监督域迁移范式
  5. JavaScript 解决浮点值运算Bug
  6. Bootstrap的响应式,当文字超过div长度,换行问题的处理!
  7. 在asp.net 2.0中使用SqlBulkCopy类迁移数据
  8. 计算机专业中最受热议的4个专业,2018考研后身价倍增的4个专业盘点
  9. MongoDB配置主从同步(二)
  10. BZOJ1938: [CROATIAN2010] ALADIN
  11. js基础练习:实现资料查找
  12. 使用java发送邮件(支持多人)
  13. java 扒网站_扒网站工具,看好哪个网站,指定好URL,自动扒下来做成模版。所见网站,皆可为我所用!...
  14. python 批量修改图片尺寸
  15. 懒惰的风纪委Elaine(宁波工程学院)
  16. echarts渐变色
  17. IT职场求生法则(3)- 部门经理及副总适用法则
  18. 英语中学生测试软件,中考英语口语测试软件.doc
  19. 凝思系统linx删除用户命令
  20. 黑苹果重置NVRAM方法,无法进入系统,丢失引导

热门文章

  1. IOS开发之第三方登陆——友盟
  2. 03-树2. List Leaves (25) 二叉树的层序遍历
  3. android自定义布局中的平滑移动
  4. Moon一个无视Linq,无视实体类的设计思路.(不要错过,看了之后, 让我们从此以后不再羡慕linq to entiy!)...
  5. w3school的PHP教程提炼(一)PHP基础
  6. Eclipse或者MyEclipse的Help菜单下找不到SoftWare Updates菜单的解决方法
  7. php 写入.csv文件注意点
  8. windows上java调用gdal.jar报错
  9. cloudflare 关于tls 检测,发送未知message type字节
  10. Hibernate框架 基础