集训 Day 2 模拟赛总结

复盘

7:30 开题

想到几天前被普及组难度模拟赛支配的恐惧,下意识觉得题目很难

先看 T1,好像不是很难,魔改 Kruskal 应该就行

看 T2 ,感觉很神奇,看到多串匹配想到 AC 自动机,又想了想 NOIP 模拟赛 T2 考 AC 自动机?奇奇怪怪

T3 神奇构造,先放

T4 想到以前做过的一道很像的题,记得是转化成二维平面中的点会很好做,但仔细想想发现不对

回来准备码 T1,推了推细节感觉问题不大,毕竟纯模拟 Kruskal 过程,大概 7:50 开始码

8:20 码完,测大样例发现跑 1.7s,时间限制 1.2s,? 仔细分析了一下,感觉这个思路很像正解,应该是哪个细节没处理好

尝试一行一行删代码,看那个地方跑得慢,发现竟然是 s o r t sort sort !逆天,想了想改成桶排,大样例极限跑 1.1s ,以为能过,就扔了

看 T2 ,首先看出有性质:包含别人的串没用。那么枚举左端点,找右端点最小的能匹配的串就行,这个 AC 自动机可以解决

接下来唐氏了一会,一直想把这 n n n 个串转化成若干个矩形,然后平面内扫描线?

去了个厕所,突然发现直接 for 一遍就做完了!回忆了一下 AC 自动机的细节 ,10:10 码完过了大样例

接下来看 T3 ,想到一个很显然但巨难写的做法,感觉很不对,决定放弃先看 T4

发现 40 40 40 是送的 ,枚举 x x x 即可,快速码

接下来看式子, h i ⌈ a i x ⌉ h_i\left \lceil \frac{a_i}{x} \right \rceil hixai,意识到 后半部分得到变化是 s q r t sqrt sqrt 级的,想到对于 n ≤ 2000 n\leq 2000 n2000 可以把这些变化的点存起来

然发现数论分块会不了一点!不会找这些变化点

最后就在反复打表、猜性质,竟发现按 a i × h i a_i\times h_i ai×hi 排序后 x x x 有决策单调性?寄完了

最终 60 + 100 + 0 + 20 = 180 , rk_10086

总结一下,T1 应该再去拍一下的,或许能意识到时间上跑不过去的问题,赛后稍微卡一下常( vector<node> -> vector<int> ) 就过了

T3 构造实际上没那么难,应该多想想

T4 想的有点偏,对于 h i ⌈ a i x ⌉ h_i\left \lceil \frac{a_i}{x} \right \rceil hixai 结构应该优先考虑枚举 取整号内部的部分,这样是 O ( n l o g n ) O(nlogn) O(nlogn) 的,而不是数论分块的 n \sqrt n n

题解

T1

在这里插入图片描述
先说 K r u s k a l Kruskal Kruskal 做法

考虑暴力的情况:把所有边建出来,按权值从小到大排序

会发现枚举时会连着处理 一段本质上相同的边(连接同色点),考虑优化这个过程,直接 O ( 1 ) O(1) O(1) 算代价,同时需要注意标记 某颜色点内部是否连通

写的时候注意一下常数问题可以通过

接下来正解:

考虑最终状态,一定是每种颜色的连通块都至少往外连了一条边

那么对于每种颜色取出一个点,钦定这个点是往外连的,直接跑最小生成树

由于是完全图,考虑 P r i m Prim Prim,跑完后对于剩下的所有点,只需选择一个代价最小的颜色连上去即可,这一步可以直接把 P r i m Prim Prim w w w 数组拿来用

#include<bits/stdc++.h>
using namespace std ;

typedef long long LL ;
const int N = 5050 ; 

int n , a[N] ;
int x , y , l , h ;
// 完全图 prim  
int c[N] , e[N][N] ;
bool vis[N] ;

int main()
{
	scanf("%d" , &n ) ;
	for(int i = 1 ; i <= n ; i ++ ) {
		scanf("%d" , &a[i] ) ;
	}
	scanf("%d%d%d%d" , &x , &y , &l , &h ) ;
	int C = 0 , A = 1 , B = 1 ;
	for(int i = 1 ; i <= n*n ; i ++ ) {
		C = (1LL*x*C+y)%h ;
		if( A <= B ) {
			e[A][B] = e[B][A] = C ;
		}
		B ++ ;
		if( B == n+1 ) {
			A ++ ;
			B = 1 ;
		}
	}
	LL ans = 0 ;
	for(int i = 1 ; i <= n ; i ++ ) c[i] = e[1][i] ;
	vis[1] = 1 ;
	for(int i = 1 ; i < n ; i ++ ) {
		int Min = 1e9 , id ;
		for(int j = 1 ; j <= n ; j ++ ) {
			if( !vis[j] && Min > c[j] ) {
				Min = c[j] ;
				id = j ;
			}
		}
		vis[id] = 1 ;
		ans += Min ;
		for(int j = 1 ; j <= n ; j ++ ) c[j] = min( c[j] , e[id][j] ) ;
	}
	for(int i = 1 ; i <= n ; i ++ ) ans += 1LL*c[i]*(a[i]-1) ;
	printf("%lld" , ans ) ;
	return 0 ;
}

T2

比较简单,放一个 AC 自动机的板子,回忆一下

	char s[N] ;
	int tr[N*5][26] , tot , fail[N*5] , V[N*5] ;
	void Insert()
	{
		int p = 0 , len = strlen( s+1 ) ;
		for(int i = 1 ; i <= len ; i ++ ) {
			int c = s[i]-'a' ;
			if( !tr[p][c] ) tr[p][c] = ++tot , V[tot] = 1e9 ;
			p = tr[p][c] ;
		} 
		V[p] = len ;
	}
	void AC_build()
	{
		queue<int> q ;
		for(int i = 0 ; i < 26 ; i ++ ) {
			if( tr[0][i] ) q.push( tr[0][i] ) ;
		}
		while( !q.empty() ) {
			int x = q.front() ; q.pop() ;
			for(int i = 0 ; i < 26 ; i ++ ) {
				if( tr[x][i] ) fail[tr[x][i]] = tr[fail[x]][i] , q.push( tr[x][i] ) , V[tr[x][i]] = min( V[tr[x][i]] , V[fail[tr[x][i]]] ) ;
				else tr[x][i] = tr[fail[x]][i] ;
			}
		}
	}

T3

在这里插入图片描述
在这里插入图片描述

T4


比较套路的题,应该会的

考虑 x x x 已知时,每个人的局数显然是 h i ⌈ a i x ⌉ h_i\left \lceil \frac{a_i}{x} \right \rceil hixai

枚举 x x x 后再 check n n n 个人需要 n 2 n^2 n2 的复杂度,不可接受

( 赛时一直在想优化枚举 x x x 过程,但是 gg

考虑优化后半过程,在 x x x 一定时, 排好序后,对于一段 a i a_i ai ⌈ a i x ⌉ \left \lceil \frac{a_i}{x} \right \rceil xai 的值是一定的,那么只维护段内最大与次大的 h i h_i hi

枚举 j = ⌈ a i x ⌉ j=\left \lceil \frac{a_i}{x} \right \rceil j=xai,合法的 a i a_i ai 范围可以算出来 [ x × ( j − 1 ) + 1 , x × j ] [x\times (j-1)+1,x\times j] [x×(j1)+1,x×j] ,而且这样总复杂度是 O ( n l n ) O(nln) O(nln)

对于 h i h_i hi 简单的想法是 st 表维护,但有更好 (?) 的做法,直接维护 [ x × ( j − 1 ) + 1 , I N F ] [x\times (j-1)+1,INF] [x×(j1)+1,INF] 后缀最大值,这样显然是对的,但要注意不要重算

这样加速了对于每个 x x x 找最大\次大值 的过程,可以通过本题

#include<bits/stdc++.h>
using namespace std ;

typedef long long LL ;
const int N = 2e5+100 ; 

int T , n , a[N] , h[N] , Max ;
int Sm[N] , Sc[N] , id[N] ;
LL ans[N] ;

int main()
{
	scanf("%d" , &T ) ;
	while( T -- ) {
		scanf("%d" , &n ) ;
		for(int i = 1 ; i <= n ; i ++ ) {
			scanf("%d" , &h[i] ) ;
		}
		int Max = 0 ;
		memset( Sm , 0 , sizeof Sm ) ;
		memset( Sc , 0 , sizeof Sc ) ;
		for(int i = 1 ; i <= n ; i ++ ) {
			scanf("%d" , &a[i] ) ;
			Max = max( Max , a[i] ) ;
			if( h[i] > Sm[a[i]] ) {
				Sc[a[i]] = Sm[a[i]] ;
				Sm[a[i]] = h[i] ;
				id[a[i]] = i ;
			}
			else Sc[a[i]] = max( Sc[a[i]] , h[i] ) ;
		}
		for(int i = Max ; i >= 1 ; i -- ) {
			if( Sm[i+1] > Sm[i] ) {
				Sc[i] = Sm[i] ;
				Sm[i] = Sm[i+1] ;
				id[i] = id[i+1] ;
			}
			else Sc[i] = max( Sc[i] , Sm[i+1] ) ;
			Sc[i] = max( Sc[i] , Sc[i+1] ) ;
		}
		memset( ans , 0 , sizeof ans ) ;
		for(int x = 1 ; x <= Max ; x ++ ) {
			LL Mx = 0 , Cx = 0 ; int ID1 ;
			for(int j = 1 ; x*(j-1)+1 <= Max ; j ++ ) { // 每一段内找 h 最大/次大 即可 
				if( Mx < 1LL*Sm[x*(j-1)+1]*j ) {
					if( id[x*(j-1)+1] != ID1 ) Cx = Mx ;
					Mx = 1LL*Sm[x*(j-1)+1]*j ;
					ID1 = id[x*(j-1)+1] ;
				}
				else if( ID1 != id[x*(j-1)+1] ) {
					Cx = max( Cx , 1LL*Sm[x*(j-1)+1]*j ) ;
				}
				Cx = max( Cx , 1LL*Sc[x*(j-1)+1]*j ) ;
			}
			ans[ID1] = max( ans[ID1] , Mx-Cx ) ;
		}
		for(int i = 1 ; i <= n ; i ++ ) printf("%lld " , ans[i] ) ;
		printf("\n") ;
	}
	return 0 ;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【开源】基于RMBG的一键抠图与证件照制作系统【含一键启动包】

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

优秀策划人必逛的地方,你不会还不知道吧?

道叔今天依然记得当初刚入行的时候&#xff0c;每天为完成策划任务&#xff0c;焦虑的整晚睡不着觉的痛苦。 但其实……很多时候&#xff0c;选择比努力更重要 优秀的策划和文案&#xff0c;也从来不是天生&#xff0c;你要走的路&#xff0c;前人都已经走过,你要做的仅仅是整…

【计算几何】凸包问题 (Convex Hull)

【计算几何】凸包问题 (Convex Hull) 引言 凸多边形 凸多边形是指所有内角大小都在 [ 0 , π ] [0,π] [0,π]范围内的简单多边形 凸包 在平面上能包含所有给定点的最小凸多边形叫做凸包。 其定义为&#xff1a;对于给定集合 X&#xff0c;所有包含 X 的凸集的交集 S 被称…

QT文件生成可执行的exe程序

将qt项目生成可执行的exe程序可按照以下步骤进行&#xff1a; 1、在qt中构建运行生成.exe文件&#xff1b; 2、从自定义的路径中取出exe文件放在一个单独的空文件夹中&#xff08;exe文件在该文件夹中的release文件夹中&#xff09;&#xff1b; 3、从开始程序中搜索qt&#xf…

Python入门 2024/7/8

目录 数据容器 dict(字典&#xff0c;映射) 语法 定义字典字面量 定义字典变量 定义空字典 从字典中基于key获取value 字典的嵌套 字典的常用操作 新增元素 更新元素 删除元素 清空字典 获取全部的key 遍历字典 统计字典内的元素数量 练习 数据容器的通用操作…

运维锅总详解设计模式

本首先简介23种设计模式&#xff0c;然后用Go语言实现这23种设计模式进行举例分析。希望对您理解这些设计模式有所帮助&#xff01; 一、设计模式简介 设计模式是软件设计中用于解决常见设计问题的一套最佳实践。它们不是代码片段&#xff0c;而是解决特定问题的通用方案。设…

(图文详解)小程序AppID申请以及在Hbuilderx中运行

今天小编给大家带来了如何去申请APPID&#xff0c;如果你是小程序的开发者&#xff0c;就必须要这个id。 申请步骤 到小程序注册页面&#xff0c;注册一个小程序账号 微信公众平台 填完信息后提交注册 会在邮箱收到 链接激活账号 确认。邮箱打开链接后&#xff0c;会输入实…

线程并发库复习

1.进行和线程 什么是进程&#xff1a;进程是内存分配的基本单位&#xff0c;它是程序执行时的一个实例&#xff0c;会被放到进程就绪队列&#xff0c;等进程调度器选择它&#xff0c;给它时间片&#xff0c;它才会运行。在java中启动进程&#xff0c;main&#xff0c;test&…

14-54 剑和诗人28 - 用于实时嵌入查找的向量检索

介绍 LLM 成功的关键因素是向量嵌入的使用。通过将文本转换为数字向量表示&#xff0c;我们可以将语义含义映射到数学向量空间。这使得模型能够根据向量之间的相似性在语言中概括模式。 随着我们的模型和数据集变得越来越大&#xff0c;高效地存储、组织和检索这些嵌入变得至关…

STM32智能交通灯控制系统教程

目录 引言环境准备智能交通灯控制系统基础代码实现&#xff1a;实现智能交通灯控制系统 4.1 数据采集模块 4.2 数据处理与控制算法 4.3 通信与网络系统实现 4.4 用户界面与数据可视化应用场景&#xff1a;交通灯管理与优化问题解决方案与优化收尾与总结 1. 引言 智能交通灯控…

【UE5】仅修改结构体的若干个数据

蓝图中的结构体变量 | 虚幻引擎4.27文档 (unrealengine.com) 连线连到傻&#xff0c;因为如果某个变量set空值也一起过去了。一查发现有这个节点。

Kubernetes 为pod指定DNS

在k8s里面&#xff0c;默认创建pod会给pod默认分配一个默认的dns&#xff0c;这个dns是哪来的呢&#xff1f;可不可以改成其他的dns呢&#xff1f; 先进入到pod里面来&#xff0c;可以看到这里面默认设置的DNS服务器&#xff0c;这个服务器地址为10.96.0.10。这个地址是k8s自动…

Qt入门(二):Qt的基本组件

目录 Designer程序面板 1、布局Layout 打破布局 贴合窗口 2、QWidget的属性 3、Qlabel标签 显示图片 4、QAbstractButton 按钮类 按钮组 5、QLineEdit 单行文本输入框 6、ComboBox 组合框 7、若干与数字相关的组件 Designer程序面板 Qt包含了一个Designer程序 &…

【Notepad】Notepad_6.3.1 的中文版安装详情

目录 &#x1f33c;1. Notepad的认识 &#x1f33c;2. Notepad中文版安装详情 &#x1f33c;1. Notepad的认识 Notepad 是 Windows 操作系统中的一个文本编辑器程序&#xff0c;通常用于创建和编辑简单的文本文件&#xff0c;如文本文档 (.txt)。它非常轻量且功能简单&#…

Spring-AOP(二)

作者&#xff1a;月下山川 公众号&#xff1a;月下山川 1、什么是AOP AOP&#xff08;Aspect Oriented Programming&#xff09;是一种设计思想&#xff0c;是软件设计领域中的面向切面编程&#xff0c;它是面向对象编程的一种补充和完善&#xff0c;它以通过预编译方式和运行期…

算法学习笔记(8.2)-动态规划入门进阶

目录 问题判断: 问题求解步骤&#xff1a; 图例&#xff1a; 解析&#xff1a; 方法一&#xff1a;暴力搜索 实现代码如下所示&#xff1a; 解析&#xff1a; 方法二&#xff1a;记忆化搜索 代码示例&#xff1a; 解析&#xff1a; 方法三&#xff1a;动态规划 空间…

全球激光位移传感器市场规模逐渐扩大 企业数量不断增多

全球激光位移传感器市场规模逐渐扩大 企业数量不断增多 位移传感器又称为距离传感器&#xff0c;是用于测量与被测物体之间距离的一种传感器。根据工作原理&#xff0c;位移传感器可以分为超声波位移传感器、红外线位移传感器、激光位移传感器等。其中&#xff0c;激光位移传感…

2024年06月CCF-GESP编程能力等级认证Python编程五级真题解析

本文收录于专栏《Python等级认证CCF-GESP真题解析》&#xff0c;专栏总目录&#xff1a;点这里&#xff0c;订阅后可阅读专栏内所有文章。 一、单选题&#xff08;每题 2 分&#xff0c;共 30 分&#xff09; 第 1 题 在Python中&#xff0c;print((c for c in “GESP”))的输…

vue实例和容器的一夫一制——04

//准备容器 <div classapp> <h1>{{mag}}</h1> </div> //准备容器 <div classapp> <h1>{{mag}}</h1> </div> //准备容器 <div classapp2> <h1>{{name}}</h1> </div> <script> // 验…

深度整合全球资源,分贝通打造高效、合规的海外差旅管理平台

在全球化商业活动的背景下,中国企业出海已成为常态。然而,随着海外差旅市场的全面增长,企业在海外支出管理上面临诸多挑战。据2023年数据显示,分贝通出海差旅业务GMV同比增长高达500倍,这一增长背后隐藏着企业对于更省钱、更高效管控方式的迫切需求。 面对与日俱增的开支,企业开…