洛谷 P4378 [USACO18OPEN]Out of Sorts S(树状数组求冒泡排序循环次数)
https://www.cnblogs.com/violet-acmer/p/9833502.html
要回宿舍休息了,题解明天再补吧。
题解:
定义一数组 a[maxn]
考察冒泡排序的本质。
冒泡排序,每次会把最大的数直接沉底,但是比较小的数,会往前面缓慢冒泡。
具体来说,如果一个数 val 在数组有序后的排名是 i ,但是目前位置在 i 之后,那么,每次循环,val 必然会往前面移动一位。
因为前面必然会有一个比 val 大的数往后沉。
swap的次数,就是逆序对数
循环的次数,就是max( i 前比a[i]大的数的个数)(i=1,2,3,......,n)
注意事项:
(1):首先需要做的是离散化原数组,因为 a[i] 的值最大可达 1e9,但 n 最大才 1e5,注意在排序的时候,对于值相同的两个数,初始编号小的在前。
(2):最终结果要额外 +1
AC代码:
#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
#define lowbit(x) (x&(-x))
const int maxn=1e5+; int N;
struct Node
{
int val;
int id;//存储初始编号
int newVal;//存储离散化后 val 对应的新值
}a[maxn];
//==============BIT===================
int bit[maxn];
void Add(int x)
{
while(x <= N)
{
bit[x]++;
x += lowbit(x);
}
}
int Sum(int x)
{
int sum=;
while(x > )
{
sum += bit[x];
x -= lowbit(x);
}
return sum;
}
//=====================================
bool cmp(Node _a,Node _b){
//值不同,值小的在前;值相同,初始编号小的在前,保证排序的稳定性
return _a.val < _b.val || (_a.val == _b.val && _a.id < _b.id);
}
bool cmp1(Node _a,Node _b){
return _a.id < _b.id;
}
void Solve()
{
sort(a+,a+N+,cmp);
for(int i=;i <= N;++i)
a[i].newVal=i;//离散化后的对应的值,虽然可能大小变了,但其对应的相对次序是不变的
sort(a+,a+N+,cmp1);//恢复原数组对应的顺序
int res=;
for(int i=;i <= N;++i)
{
//Sum(a[i].newVal) : i 之前,数值不大于a[i].newVal 的个数
//i-1-Sum(a[i].newVal) : i 之前,数值大于a[i].newVal的个数
//而答案就是 max(i-1-Sum(a[i].newVal)
res=max(res,i--Sum(a[i].newVal));
Add(a[i].newVal);
}
printf("%d\n",res+);//最终结果要加1,因为不管当前交换完后是否有序,都需要额外输出一个 moo 来判断是否有序
}
int main()
{
scanf("%d",&N);
for(int i=;i <= N;++i)
{
scanf("%d",&a[i].val);
a[i].id=i;
}
Solve();
}
洛谷 P4378 [USACO18OPEN]Out of Sorts S(树状数组求冒泡排序循环次数)的更多相关文章
- 洛谷 P4375 [USACO18OPEN]Out of Sorts G(树状数组求冒泡排序循环次数加强版)
传送门:Problem 4375 参考资料: [1]:https://www.cnblogs.com/Miracevin/p/9662350.html [2]:https://blog.csdn.ne ...
- 洛谷 P1908 逆序对 Label:归并排序||树状数组 不懂
题目描述 猫猫TOM和小老鼠JERRY最近又较量上了,但是毕竟都是成年人,他们已经不喜欢再玩那种你追我赶的游戏,现在他们喜欢玩统计.最近,TOM老猫查阅到一个人类称之为“逆序对”的东西,这东西是这样定 ...
- 【洛谷P1972】HH的项链 离线+树状数组
题目大意:静态查询序列区间颜色数. 题解:对于一个查询区间 [l , r] ,若有两个相同颜色的点在这个区间中,则总是取下标靠近端点 r 的颜色计入答案贡献.对于每个下标,记录下在这个下标之前,且距离 ...
- 洛谷 P3616 富金森林公园题解(树状数组)
P3616 富金森林公园 题目描述 博艾的富金森林公园里有一个长长的富金山脉,山脉是由一块块巨石并列构成的,编号从1到N.每一个巨石有一个海拔高度.而这个山脉又在一个盆地中,盆地里可能会积水,积水也有 ...
- 洛谷P3312 [SDOI2014]数表(莫比乌斯反演+树状数组)
传送门 不考虑$a$的影响 设$f(i)$为$i$的约数和 $$ans=\sum\limits_{i=1}^n\sum\limits_{j=1}^nf(gcd(i,j))$$ $$=\sum\limi ...
- 洛谷P3250 [HNOI2016]网络(整体二分+树状数组+树剖)
传送门 据说正解是树剖套堆???然而代码看着稍微有那么一点点长…… 考虑一下整体二分,设当前二分到的答案为$mid$,如果所有大于$mid$的边都经过当前点$x$,那么此时$x$的答案必定小于等于$m ...
- 洛谷P3810-陌上开花(三维偏序, CDQ, 树状数组)
链接: https://www.luogu.org/problem/P3810#submit 题意: 一个元素三个属性, x, y, z, 给定求f(b) = {ax <= bx, ay < ...
- 洛谷 P1972 [SDOI2009]HH的项链(树状数组,离线)
传送门 解题思路 因为是求区间的不同种类数,所以我们用树状数组(貌似并没有什么直接联系) (...表示到) 还是和原来一样,用s[i]来表示a[i-lowbit(i)]...a[i]的种类数. 因为有 ...
- 洛谷P1972 [SDOI2009]HH的项链(树状数组)
题目链接: https://www.luogu.org/problemnew/show/P1972 题目描述: HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后 ...
随机推荐
- linux书籍
<鸟哥私房菜-基础版> <实战LINUX_SHELL编程与服务器管理> <LINUX命令行与SHELL脚本编程大全第2版].布卢姆.扫描版> <Linux初学 ...
- oracle alter
ALTER TABLE (表名) ADD CONSTRAINT (索引名);ALTER TABLE (表名) DROP CONSTRAINT (索引名); ALTER TABLE (表名) ADD ( ...
- 嵌入式linux教程
串口通信minicom $ sudo apt-get install minicom ///安装 # minicom –s //运行 //CTRL+A Z 弹出菜单 2.NFS网络文件配置 ...
- Which path should be used jdk or jre for JAVA_HOME environment variable?
https://stackoverflow.com/questions/17601827/which-one-should-java-home-to-point-jdk-or-jre 临时变更JAVA ...
- Setting Tomcat Heap Size (JVM Heap) in Eclipse
this article picked from:http://viralpatel.net/blogs/setting-tomcat-heap-size-jvm-heap-eclipse/ Rece ...
- JMeter性能测试基础 (4)-使用JMeter录制测试脚本
在进行压力测试时,由于很多web页面包含了Ajax异步请求等内容,为模拟用户真实输入,除了对html的访问外,还需要将其它的访问考虑入内,这时最好的办法就是对实际访问过程中的所有请求进行录制. 例如, ...
- 属性动画总结(Property Animation)
一.概述 属性动画可以作用在View的属性上,对属性进行修改,而且不要求对应的属性一定是有显示效果的. 二.属性动画的实现方式 1.基础的类Animator Animator是一个抽象类,是属性动画的 ...
- Mysql8 连接提示 Client does not support authentication protocol requested by server; consider upgrading MySQL client 解决方法
USE mysql;ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';FLUSH PR ...
- CSS兼容性详解
前面的话 对于前端工程师来说,不想面对又不得不面对的一个问题就是兼容性.在几年之前,处理兼容性,一般地就是处理IE低版本浏览器的兼容性.而近几年,随着移动端的发展,工程师也需要注意手机兼容性了.本文将 ...
- Leading and Trailing LightOJ - 1282 (取数的前三位和后三位)
题意: 求n的k次方的前三位 和 后三位 ...刚开始用 Java的大数写的...果然超时... 好吧 这题用快速幂取模求后三位 然后用一个技巧求前三位 ...orz... 任何一个数n均可以表示 ...