首页 > 其他分享 >10.12 模拟赛

10.12 模拟赛

时间:2024-10-12 17:26:26浏览次数:8  
标签:cout int 最大值 贡献 答案 10.12 我们 模拟

题解

A. 选择排序

粘过来题面的代码:

for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= n; j++)
        if (a[i] < a[j])
            swap(a[i], a[j]);
}

考虑如何计算整个串的答案。

首先暴力做一遍 \(i = 1\)。此时序列中的最大值一定会被交换到 \(a_1\)。

然后将刚才的答案加上目前 \(a\) 中的逆序对数量就是真实答案。具体的,我们需要对于每个 \(j\),计算 \(j\) 之前有多少数 \(> a_j\)。

为啥?模拟+找规律。

for (int x = 1; x <= n; ++ x ) {
	for (int i = 1; i <= x; ++ i ) a[i] = b[i];
	
	int res = 0;
	for (int j = 1; j <= x; ++ j ) {
		if (a[1] < a[j]) {
			swap(a[1], a[j]);
			res ++ ;
		}
	}
	
	for (int i = 2; i <= x; ++ i ) res += /* i 前面有多少种数 > a[i] */;
	
	cout << res << " \n"[x == n];
}

用树状数组实现可以做到整体 \(\mathcal O(n^2)\) 的复杂度。现在考虑优化上面的代码。

for (int x = 1; x <= n; ++ x ) {
	for (int i = 1; i <= x; ++ i ) a[i] = b[i];
	
	int res = 0;
    
    // 优化这个循环比较简单。注意到从 x -> x+1 时,我们只需要在上一次的基础上多做一次 j = x+1 即可。
	for (int j = 1; j <= x; ++ j ) {
		if (a[1] < a[j]) {
			swap(a[1], a[j]);
			res ++ ;
		}
	}
    // 也就是说,从 x -> x+1 时 a[1 ~ x] 中至多只会有 a[1] 会发生变化,其他位置一定不会发生改变
	
    // 别忘了每次上面的循环结束后,a[1] 都是目前的最大值
    // 我们知道当枚举的是 x 时 a[1] 是最大值。那么当枚举的变成 x+1 时,如果上面 j = x+1 的没有执行(即 a[x + 1] < a[1],即 a[1] 仍然是最大值),那么前面所有数对答案的贡献都没有发生改变。
    // 否则,由于 a[1] 可能会出现多次,考虑下面的图。先我们即将将第一个位置从 a[1] 变成 a[x + 1],且 a[x + 1] > a[i]
    // 显然绿色区间内的数对答案的贡献没有变化。因为 a_1 本来就比它们大,而我们是把 a_1 替换成一个更大的数。
    // 但是蓝色区间内的数对答案的贡献会增加 1。这是因为原先它们前面有两个 a_1,但是我们只计算了一个的贡献。现在我们把其中一个 a_1 改变了,也就是说原来的两个数现在都要贡献一次,所以这些数的贡献会大 1。
	for (int i = 2; i <= x; ++ i ) res += /* i 前面有多少种数 > a[i] */;
	
	cout << res << " \n"[x == n];
}

image-20241012163924009

所以我们需要维护一种数据结构,支持查询某种数字在序列中第一次和第二次的出现位置,以及删除第一个数。双端队列(deque)或链表(list)即可。

加上树状数组总复杂度 \(\mathcal O(n \log n)\)。

标签:cout,int,最大值,贡献,答案,10.12,我们,模拟
From: https://www.cnblogs.com/2huk/p/18460945

相关文章

  • 24.10.12
    所谓NOIp模拟赛。怎么会有NOIp模拟赛放AT银牌题呢哈哈。A暴力:枚举点对\((c,s)\),合法点对的贡献是\((A-c+1)\times(B-s+1)\)。对于\(x=1\)的部分分,打表发现合法点对只有\(c=s\)的点对,那么贡献为\[\begin{aligned}&\sum_{i=1}^{\min(A,B)}(A-......
  • 2024.10.12 1615版
    起于《海奥华预言》的思考◆地球管理结构和参考持续更新中...... 英文地址:https://github.com/zhuyongzhe/Earth/tags中文地址:https://www.cnblogs.com/zhuyongzhe85作者:朱永哲 ---------------------------------------------------------------------------------......
  • 2024.10.12 1530版
    起于《海奥华预言》的思考◆地球管理结构和参考持续更新中...... 英文地址:https://github.com/zhuyongzhe/Earth/tags中文地址:https://www.cnblogs.com/zhuyongzhe85作者:朱永哲 ---------------------------------------------------------------------------------......
  • [DMY]2024 CSP-S 模拟赛 Day 14
    没挂分,没写不完,没超常发挥,平常的有点不平常的一场。AKIG赛时33min26s才过T1,足见比赛难度。赛前听说运动会开幕式很好看,于是我就荣升为本校现读所有学生中为数不多的几个没看过运动会开幕式的人类。比赛开始前20min发现没有比赛,问了以后发现我们被ban了。所以协商好之......
  • 2024.10.12 1438版
    起于《海奥华预言》的思考◆地球管理结构和参考持续更新中...... 英文地址:https://github.com/zhuyongzhe/Earth/tags中文地址:https://www.cnblogs.com/zhuyongzhe85作者:朱永哲 ---------------------------------------------------------------------------------......
  • SkyAGI: 人工智能领域的突破性进展 - 模拟真实人类行为的新技术
    SkyAGI:开启人工智能模拟人类行为的新纪元在人工智能快速发展的今天,一个名为SkyAGI的开源项目正在引起业界的广泛关注。这个基于大型语言模型(LLM)的项目展示了AI在模拟真实人类行为方面的突破性进展,为游戏开发、虚拟助手等领域带来了新的可能性。本文将深入探讨SkyAGI的核心功......
  • springboot+vue火车订票模拟系统【开题+程序+论文】
    系统程序文件列表开题报告内容研究背景随着信息技术的飞速发展,传统火车订票方式已难以满足现代社会的需求。传统的订票方式往往需要用户亲自前往售票点或通过电话进行预订,这种方式不仅效率低下,还容易出现信息滞后、排队等候等问题。为了解决这些问题,火车订票模拟系统的开发......
  • 20241010 模拟赛
    想看题的戳这里A.植物收集难度:绿先讲一下\(O(n^3)\)的暴力:枚举一下要用多少个\(k\)。将价格排序,假设要用\(x\)个\(k\),则每个数会对其右边\(x\)个数产生贡献,按价格从小到大计算贡献。优化一下,每次增加一个\(k\),则每株植物最多往右边贡献\(1\)个,所以每次往右边枚举......
  • 文件管理方案参考 2024.10.12
    文件管理方案参考2024.10.12说明:此文档中的文件是指手机、平板电脑、笔记本电脑等电子设备在使用过程中新建、接收、重命名、移动、编辑的电子文件。例如:Word文档(.docx)、Excel表格(.xlsx)、Photoshop图片(.jpg)、酷我音乐盒无损音乐歌曲(.flac)、国语中字电影视频(.MP4)、视频教程(.AVI)。......
  • 105th 2024/10/11 模拟赛总结61
    傲慢,凭什么傲慢T1开幕雷击,认为水飞了”一眼CDQ板子啊“然后十五分钟时直接开打主要原因绝对是因为昨天场切了T1,所以飘起来了还是应该稳重一点,起码模几个不同数据再下定论实际上也真是水题,相当于板子了自己对排列不够熟悉,真的没想到是直接全局-部分正难则反?从没用上过自以......