P9843 [ICPC2021 Nanjing R] Paimon Sorting 题解 (SPJ)

[ICPC2021 Nanjing R] Paimon Sorting

传送门

题面翻译

给出一个排序算法(用伪代码表示):

// 排序算法
SORT(A)for i from 1 to n // n 是序列 A 的元素个数for j from 1 to nif a[i] < a[j] // a[i] 是序列 A 的第 i 个元素Swap a[i] and a[j]

请你算出对于一个序列 A = a 1 , a 2 , ⋯ , a n A=a_1,a_2,\cdots,a_n A=a1,a2,,an 的所有前缀 A k = a 1 , a 2 , ⋯ , a k A_k=a_1,a_2,\cdots,a_k Ak=a1,a2,,ak 1 ≤ k ≤ n 1\le k\le n 1kn), SORT ⁡ ( A k ) \operatorname{SORT}(A_k) SORT(Ak) 中的交换(Swap)操作将会被执行几次。

题目描述

Paimon just invents a new sorting algorithm which looks much like bubble sort \textit{bubble sort} bubble sort, with a few differences. It accepts a 1 1 1-indexed sequence A A A of length n n n and sorts it. Its pseudo-code is shown below.

// The Sorting Algorithm
SORT(A)for i from 1 to n // n is the number of elements if Afor j from 1 to nif a[i] < a[j] // a[i] is the i-th element in ASwap a[i] and a[j]

If you don’t believe this piece of algorithm can sort a sequence it will also be your task to prove it. Anyway here comes the question:

Given an integer sequence A = a 1 , a 2 , ⋯ , a n A = a_1, a_2, \cdots, a_n A=a1,a2,,an of length n n n, for each of its prefix A k A_k Ak of length k k k (that is, for each 1 ≤ k ≤ n 1 \le k \le n 1kn, consider the subsequence A k = a 1 , a 2 , ⋯ , a k A_k = a_1, a_2, \cdots, a_k Ak=a1,a2,,ak), count the number of swaps performed if we call SORT ( A k ) \text{SORT}(A_k) SORT(Ak).

输入格式

There are multiple test cases. The first line of the input contains an integer T T T indicating the number of test cases. For each test case:

The first line contains an integer n n n ( 1 ≤ n ≤ 1 0 5 1 \le n \le 10^5 1n105) indicating the length of the sequence.

The second line contains n n n integers a 1 , a 2 , ⋯ , a n a_1, a_2, \cdots, a_n a1,a2,,an ( 1 ≤ a i ≤ n 1 \le a_i \le n 1ain) indicating the given sequence.

It’s guaranteed that the sum of n n n of all test cases will not exceed 1 0 6 10^6 106.

输出格式

For each test case output one line containing n n n integers s 1 , s 2 , ⋯ , s n s_1, s_2, \cdots, s_n s1,s2,,sn separated by a space, where s i s_i si is the number of swaps performed if we call SORT ( A i ) \text{SORT}(A_i) SORT(Ai).

Please, DO NOT output extra spaces at the end of each line or your solution may be considered incorrect!

样例 #1

样例输入 #1

3
5
2 3 2 1 5
3
1 2 3
1
1

样例输出 #1

0 2 3 5 7
0 2 4
0

以上由米哈游赞助 以上由米哈游赞助 以上由米哈游赞助(注意题目标题:Paimon?)

解题思路

分类讨论

  • 对于每个长度的第一轮循环之后,结果是将其严格单增序列相对位置后移,之后第 2 , 3 … 2,3\dots 2,3 轮排序的交换次数就是前 i i i 个比 a i a_i ai 大的个数,该操作有去重效果。 因此为了获得最后的解,在扫描的时候可以直接处理,保证每次只获得当前长度下第一次循环的结果,当遇到 a i > a 1 a_i>a_1 ai>a1 时,就交换 a i a_i ai a 1 a_1 a1 的位置,这就是一次必要的交换,计数器增加 1 1 1,然后对于每个在线处理输入的 a i a_i ai,统计先前比它大的个数,直接加上即可。 但是,当录入的 a i a_i ai a 1 a_1 a1 相等( a 1 a_1 a1 为当前最大值)(设值为 x x x)并且后面存在比 a 1 a_1 a1 更大的数(设值为 y y y),那么在后面的长度当中,第一轮排序会使得当前的 a i a_i ai 的值不变,而 a 1 a_1 a1 对应的值被移到了更大的数位置上,(形象一些就是这样: x , x , y → y , x , x x,x,y→y,x,x x,x,yy,x,x)那么在插入 y y y 之后,由于 y y y 向前移动了, y y y x x x 也有一个需要交换的贡献,举例如下,假设当前长度构造的序列为: x , a , a , a , x , x − 1 , x − 2 , x − 1 x,a,a,a,x,x−1,x−2,x−1 x,a,a,a,x,x1,x2,x1,那么插入 y y y 之后,由于 y y y 大于 x x x,则变为了: y , a , a , a , x , x − 1 , x − 2 , x − 1 , x y,a,a,a,x,x−1,x−2,x−1,x y,a,a,a,x,x1,x2,x1,x。那么对于 x , x − 1 , x − 2 , x − 1 x,x−1,x−2,x−1 x,x1,x2,x1 这几个数,都需要加上 y y y y y y 的这个贡献,所以需要增加一个计数器(cnt),记录第二个 x x x y y y 间有几个数,插入 y y y 的时候结果加上计数器值即可。
  • 对于序列所有元素各不相同的情况,首先从第一个元素开始,找到并跳到当前元素右边第一个比它大的元素。称这些元素为“特殊元素”。可以发现外层循环的第一轮会把所有特殊元素右移一位,此时序列中最大的元素就到了序列第一个。
    从外层第二轮循环开始,对于第 i i i 轮循环,序列前 ( i − 1 ) (i−1) (i1) 个元素已经是有序的。设此时第一个比 a i a_i ai 大的元素是 a k a_k ak​ ,那么第 i i i 轮循环将会发生 ( i − k ) (i−k) (ik) 次交换。因此,非特殊元素将会贡献“前面有几个数比它大”次交换,但一开始特殊元素的右移对答案没有影响,因为虽然移走了一个比它大的元素,但是最大的元素移到了开头,而特殊元素将会贡献 2 2 2 次交换。
  • 对于存在相同元素的情况,对非特殊元素,前面比它大的,但是相同的元素只会发生一次交换,因此需要对元素去重一下再统计。另外,如果这个非特殊元素恰好等于上一个特殊元素,那么上一个特殊元素的右移会导致该非特殊元素的贡献加 1 1 1

这么长题解不想看?那就给我看完。

AC Code

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int Maxn = 1e5 + 5;
int n, a[Maxn];
int Tree[Maxn];
bool vis[Maxn];
inline int lowbit(int x) {return x & (-x);
}
inline void Add(int x) {for (int i = x; i <= n; i += lowbit(i)) {Tree[i]++;}
}
inline int Sum(int x) {int tot = 0;for (int i = x; i; i -= lowbit(i)) {tot += Tree[i];}return tot;
}
inline void solve() {memset(Tree, 0, sizeof(Tree));memset(vis, 0, sizeof(vis));cin >> n;int res = 0, cnt = 0;bool flag = 0;for (int i = 1; i <= n; i++) {cin >> a[i];}cout << 0;vis[a[1]] = 1;Add(a[1]);for (int i = 2; i <= n; i++) {if (!vis[a[i]]) {vis[a[i]] = 1;Add(a[i]);}if (a[i] == a[1]) {flag = 1;}cnt += flag - (flag ? a[i] > a[1] : 0);if (a[i] > a[1]) {res += cnt + 1;swap(a[1], a[i]);cnt = flag = 0;}res += Sum(a[1]) - Sum(a[i]);cout << " " << res;}cout << endl;
}
inline void work() {int T;cin >> T;while (T--) {solve();}
}
signed main() {ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);work();return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/630268.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Linux】Linux 系统编程——cd 命令

文章目录 1.命令概述2.命令格式3.常用选项4.相关描述5.参考示例 1.命令概述 “cd 命令&#xff0c;即 ‘change directory’ 的缩写&#xff0c;主要用于 Unix、Linux 和 macOS 等操作系统中&#xff0c;用于改变当前工作目录。该命令支持绝对路径和相对路径两种形式。若未指定…

SpringBoot多环境配置与添加logback日志

1、多环境配置 一个项目会有多个运行环境 所以SpringBoot提供了可以适应多个环境的配置文件 每个文件对应一个端口号 application-dev.yml 开发环境 端口8090 application-test.yml 测试环境 端口8091 application-prod.yml 生产环境 端口8092 在application中选择使用哪个…

Docker 项目如何使用 Dockerfile 构建镜像

1、Docker 和 Dockerfile 的重要性 1.1、Docker 简介&#xff1a;讲述 Docker 的起源、它是如何革新现代软件开发的&#xff0c;以及它为开发者和运维团队带来的好处。重点强调 Docker 的轻量级特性和它在提高应用部署、扩展和隔离方面的优势。 1.2、Dockerfile 的作用&#…

线性回归实例

1、线性回归&#xff08;linear Regression&#xff09;和逻辑回归&#xff08;logistic Regression&#xff09;的区别 线性回归主要是用来拟合数据&#xff0c;逻辑回归主要是用来区分数据&#xff0c;找到决策边界。 线性回归的代价函数常用平方误差函数&#xff0c;逻辑回…

AI在保护环境、应对气候变化中的作用

对于AI生命周期数据领域的全球领导者而言&#xff0c;暂时搁置我们惯常的AI见解和AI生命周期数据内容产出&#xff0c;来认识诸如世界地球日这样的自然环境类活动日&#xff0c;似乎是个奇怪的事情。我们想要知道&#xff0c;数据是否真的会影响我们的地球环境&#xff1f; 简而…

5.5G来了!全球首次采用,就在福建

近日&#xff0c;在以滨海风景优美而闻名的福建厦门马拉松赛道沿线区域&#xff0c;福建移动携手华为采用5G-A通感一体技术率先完成了低空多站连续组网的通感能力验证&#xff0c;基于4.9GHz频段实现了对城市低空120米下多无人驾驶飞行器的探测与及时预警。这一成果为城市低空资…

【windows】右键添加git bash here菜单

在vs 里安装了git for windows 后&#xff0c;之前git-bash 右键菜单消失了。难道是git for windows 覆盖了原来自己安装的git &#xff1f;大神给出解决方案 手动添加Git Bash Here到右键菜单&#xff08;超详细&#xff09; 安装路径&#xff1a;我老的 &#xff1f; vs的gi…

Kafka系列(四)

本文接kafka三&#xff0c;代码实践kafkaStream的应用&#xff0c;用来完成流式计算。 kafkastream 关于流式计算也就是实时处理&#xff0c;无时间概念边界的处理一些数据。想要更有性价比地和java程序进行结合&#xff0c;因此了解了kafka。但是本人阅读了kafka地官网&#…

论文笔记:信息融合的门控多模态单元(GMU)

整理了GMU&#xff08;ICLR2017 GATED MULTIMODAL UNITS FOR INFORMATION FUSION&#xff09;论文的阅读笔记 背景模型实验 论文地址&#xff1a; GMU 背景 多模态指的是同一个现实世界的概念可以用不同的视图或数据类型来描述。比如维基百科有时会用音频的混合来描述一个名人…

vue+echarts 几个案例

普通柱状图 <template><!-- 容器默认宽高是0 如果不设置 页面不显示--><div ref"mychart" id"mychart"></div> </template><script> import * as echarts from "echarts" import axios from axiosexport …

(Matlab)基于CNN-Bi_LSTM的多维回归预测(卷积神经网络-双向长短期记忆网络)

目录 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 亮点与优势&#xff1a; 二、实际运行效果&#xff1a; 三、部分代码展示&#xff1a; 四、完整程序数据分享&#xff1a; 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 本代码基于Matlab平…

数字电源简介

数字电源简介 定义主要应用场景数字电源的基本组成常见算法常见电源拓扑PFCLLC 数字电源与模拟电源对比参考链接 定义 常见定义有以下四种&#xff1a; 通过数字接口控制的开关电源&#xff0c;强调的是数字电源的“通信”功能。可通过I2C或类似的数字总线来对数字信号进行控…

springboot整合websocket后启动报错:javax.websocket.server.ServerContainer not available

一、场景 Springboot使用ServerEndpoint来建立websocket链接。引入依赖。 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> </dependency>配置Websocket Confi…

九:day01_ 消息队列01

第一章 RabbitMQ 概念 1.1.1 消息队列 MQ全称Message Queue&#xff08;消息队列&#xff09;&#xff0c;是在消息的传输过程中保存消息的容器。多用于系统之间的异步通信。 1.1.2 消息 两台计算机间传送的数据单位。消息可以非常简单&#xff0c;例如只包含文本字符串&#x…

【目标检测】YOLOv5算法实现(九):模型预测

本系列文章记录本人硕士阶段YOLO系列目标检测算法自学及其代码实现的过程。其中算法具体实现借鉴于ultralytics YOLO源码Github&#xff0c;删减了源码中部分内容&#xff0c;满足个人科研需求。   本系列文章主要以YOLOv5为例完成算法的实现&#xff0c;后续修改、增加相关模…

深入解析JavaScript属性的getter和setter

&#x1f9d1;‍&#x1f393; 个人主页&#xff1a;《爱蹦跶的大A阿》 &#x1f525;当前正在更新专栏&#xff1a;《VUE》 、《JavaScript保姆级教程》、《krpano》、《krpano中文文档》 ​ ​ ✨ 前言 在JavaScript中,对象属性除了直接设置值之外,还可以通过getter和sett…

鸿蒙OS4.0兼容性测试

背景 OpenHarmony兼容性测评主要是验证合作伙伴的设备和业务应用满足OpenHarmony开源兼容性定义的技术要求&#xff0c;确保运行在OpenHarmony上的设备和业务应用能稳定、正常运行&#xff0c;同时使用OpenHarmony的设备和业务应用有一致性的接口和业务体验。 OpenHarmony兼容…

MongoDB调优

三大导致 MongoDB 性能不佳的原因 1&#xff09;慢查询2&#xff09;阻塞等待3&#xff09;硬件资源不足1,2通常是因为模型/索引设计不佳导致的。排查思路&#xff1a;按1-2-3依次排查。 影响 MongoDB 性能的因素 MongoDB 性能监控工具 Free Monitoring 从版本 4.0 开始&am…

redis经典面试题

说说你对Redis的理解 Redis是一个基于Key-Value存储结构的开源内存数据库&#xff0c;也是一种NoSQL数据库。 它支持多种数据类型&#xff0c;包括String、Map、Set、ZSet和List&#xff0c;以满足不同应用场景的需求。 Redis以内存存储和优化的数据结构为基础&#xff0c;提…

Python爬虫实战:IP代理池助你突破限制,高效采集数据

当今互联网环境中&#xff0c;为了应对反爬虫、匿名访问或绕过某些地域限制等需求&#xff0c;IP代理池成为了一种常用的解决方案。IP代理池是一个包含多个可用代理IP地址的集合&#xff0c;可以通过该代理池随机选择可用IP地址来进行网络请求。 IP代理池是一组可用的代理IP地址…