luogu P1908 逆序对
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 逆序对相关推荐
- 信息学奥赛一本通 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 ...
- 【算法】树状数组 P1908 逆序对
P1908 逆序对 #include<iostream> #include<cstdio> #include<algorithm> #define ll long ...
- [洛谷P1908] 逆序对|归并排序|树状数组
题目描述 Description 猫猫TOM和小老鼠JERRY最近又较量上了,但是毕竟都是成年人,他们已经不喜欢再玩那种你追我赶的游戏,现在他们喜欢玩统计.最近,TOM老猫查阅到一个人类称之为&qu ...
- 洛谷 P1908 逆序对(树状数组+离散化)
题目描述 猫猫 TOM 和小老鼠 JERRY 最近又较量上了,但是毕竟都是成年人,他们已经不喜欢再玩那种你追我赶的游戏,现在他们喜欢玩统计. 最近,TOM 老猫查阅到一个人类称之为"逆序对& ...
- 用不同的姿势求逆序对(复习篇)
用不同的姿势求逆序对(复习篇) 文章目录 用不同的姿势求逆序对(复习篇) 前言 讲解 归并排序 树状数组 线段树 题目 思路 代码 归并排序求逆序对 树状数组求逆序对 线段树求逆序对 历届试题 小朋友 ...
- 分治算法,逆序对,三维偏序与CDQ分治
分治算法基本思想 当我们求解某些问题时,由于这些问题要处理的数据相当多,或求解过程相当复杂,使得直接求解法在时间上相当长,或者根本无法直接求出. 对于这类问题,我们往往先把它分解成几个子问题,找到求出 ...
- 树状数组(求逆序对)
一.树状数组是什么 树状数组,又称二进制索引树,英文名Binary Indexed Tree 之前遇到一个求逆序对的题,看了很多题解都只说了这个树状数组,关于怎么实现的全都避而不谈,我研究了一下午,总 ...
- 洛谷P1908求逆序对【树状数组】
逆序对 逆序对的定义:对于给定的一段正整数序列,逆序对就是序列中 ai>aj,i<ja_i>a_j,i<jai>aj,i<j,让统计逆序对的个数. 本题的数据加 ...
- 逆序对(洛谷P1908题题解,Java语言描述)
题目要求 题目链接 分析 逆序对这个说法我们在线性代数应该就接触过了吧,这里的逆序对应该与序偶也有关吧,总之简单点说就是顺序反了(相较于我们的比较标准)的一对数据. <1, 2, 3, 4, 5 ...
- 逆序对(洛谷-P1908)
题目描述 猫猫TOM和小老鼠JERRY最近又较量上了,但是毕竟都是成年人,他们已经不喜欢再玩那种你追我赶的游戏,现在他们喜欢玩统计.最近,TOM老猫查阅到一个人类称之为"逆序对"的 ...
最新文章
- -webkit-overflow-scrolling:touch
- 11g中AWR新快照视图
- 获取上传图片路径方法(新旧方法)
- 直播 | ICML 2021论文解读:满足隐私保护要求的去中心化无监督域迁移范式
- JavaScript 解决浮点值运算Bug
- Bootstrap的响应式,当文字超过div长度,换行问题的处理!
- 在asp.net 2.0中使用SqlBulkCopy类迁移数据
- 计算机专业中最受热议的4个专业,2018考研后身价倍增的4个专业盘点
- MongoDB配置主从同步(二)
- BZOJ1938: [CROATIAN2010] ALADIN
- js基础练习:实现资料查找
- 使用java发送邮件(支持多人)
- java 扒网站_扒网站工具,看好哪个网站,指定好URL,自动扒下来做成模版。所见网站,皆可为我所用!...
- python 批量修改图片尺寸
- 懒惰的风纪委Elaine(宁波工程学院)
- echarts渐变色
- IT职场求生法则(3)- 部门经理及副总适用法则
- 英语中学生测试软件,中考英语口语测试软件.doc
- 凝思系统linx删除用户命令
- 黑苹果重置NVRAM方法,无法进入系统,丢失引导
热门文章
- IOS开发之第三方登陆——友盟
- 03-树2. List Leaves (25) 二叉树的层序遍历
- android自定义布局中的平滑移动
- Moon一个无视Linq,无视实体类的设计思路.(不要错过,看了之后, 让我们从此以后不再羡慕linq to entiy!)...
- w3school的PHP教程提炼(一)PHP基础
- Eclipse或者MyEclipse的Help菜单下找不到SoftWare Updates菜单的解决方法
- php 写入.csv文件注意点
- windows上java调用gdal.jar报错
- cloudflare 关于tls 检测,发送未知message type字节
- Hibernate框架 基础