NOIP 模拟赛:2024-11-26

T1:

当你发现你的算法仅对 n 一个小值时正确,不如把 n< 它的情况都打表/特判了。

请构造满足如下要求的序列

  • 首先,元素在1n的所有整数中选,每个整数最多出现一次;
  • 其次,保证序列中相邻的元素都不互质
  • 最后,在满足前述条件的基础上,使得序列最长。

请输出构造的序列长度和该序列。

容易想到这么一个构造:偶数都放进来;奇数,如果存在两个偶数和它都不互质,插入到这两个之间;然后挑两个只存在一个偶数和它不互质的数放两边。

线性筛求出每个数的最小质因数即可。细节比较繁琐,为了避免在特殊数据下出错直接把 n20 的判了

T2:

当你试图增加优化,思考两件事:

  1. 它真的有必要吗?

  2. 它会使得正确性出错吗?


有一间无限酒店有无穷多个房间,编号为0,1,2,。酒店每个房间能住一个人,并且只接待团体入住。将要入住的团体按顺序从1开始编号。

由于是无限酒店,一个新的团队来了总能顺利入住,具体方式为

  • 如果团队人数有限:记团队人数为k,则先将每个原x号房间的人都移动到x+k,然后让新的团队入住在0k1号房间;
  • 如果团队人数无限:先将每个原x号房间的人移动到2x,然后让新的团队入住在奇数编号房间。

你需要维护酒店的如下操作需求

  • 1 k :如果k>0,表示有k人的团体入住酒店;如果k=0,表示有无穷多人的团体入住酒店。注意团体按本操作的顺序从1编号;
  • 2 g x :输出编号为g的团体占据的房间中,第x小的房间编号,对109+7取模;
  • 3 x :输出此时x号房间中的客人对应的团体编号。

认为开始时所有房间都住着一个来自0号团体的人。

每个团队的人的房间编号可以视作一个函数 ax+b。对于操作 1,原本所有团队 bb+k,新加入一个 1x1;对于操作 2,查询 agk+bg 即可;对于操作 3,记录之前所有修改操作,如果是 k=0,此时若 x 是奇数,就是这次修改操作加入的团队,否则 xx/2;否则,若 x<k,就是这次的团队,否则 xxk

前两种操作可以线段树,甚至可以只打全局 tag 完成。瓶颈在于操作 3。

首先,操作 3 的 x/2 情况最多 30 次就 x=0 了。对每次修改操作记录 lst2 表示上一个非 x/2 的修改位置,供 x=0 时跳过即可。

其次,再对每一段非 x/2 的修改操作记录前缀和。如果 x 比这一段的 k 还大,直接减去,然后跳过这一段。因为每跳过一段就会遇到一个 x/2,复杂度不用担心。

如果 xk,二分即可。


T3:

n个城市,编号1n,你在旅行中希望前往n号城市。对于所有1i<n,都有一个参数Ti,表示从i号城市出发可以坐大巴直接到达i+1,i+2,,i+Ti号城市,注意通行是单向的。

给定正整数K和非负整数D,表示如果从i号坐大巴直接到达j号,则疲劳度会增加jiKD。疲劳让人不高兴。

i号城市具有Hi的风景值,可能为负。风景越好,人越高兴。

最终,从一个城市去往n的总快乐度为所有经过的城市(包括起点和终点)的风景值总和减去所有移动的疲劳度总和。

请对每一个可能的起点城市,求出旅行的最大快乐度是多少。

jik 的余数分类,然后线段树优化 DP 即可。具体分析可以画一个 k×n/k 的表格。


T4:

给定两棵树T1,T2,一棵是有n个结点的带边权树,另一棵也是有n个结点的带边权树。两棵树的的结点编号都为1n

定义dist(T,i,j)表示树T(T{T1,T2})上结点i,j的简单路径权值和。

定义两个结点编号i,j的距离为(dist(T1,i,j)+dist(T2,i,j))。请对每一个确定的编号i,找出编号j使得编号i,j的距离最小,你只需确定最小的距离。
n105

树上路径问题先无脑考虑点分治,点分治不太行考虑点分树。发现做不了也留一个心眼,说不定暴力枚举套一个树高 logn 的条件就对了。

两条路径涉及四个点的编号:i,j,l1,l2,其中 l1,l2i,j 在两棵树上的 LCA。

考虑枚举 i(l1,l2),根据 (l1,l2) 找出最优的 j。当确定了 i,l1,l2,变化的量只有 dist(T1,j,l1)+dist(T2,j,l2)。因此,我们希望对每个对 (l1,l2) 求一个 f(l1,l2) 表示在 l1,l2 的子树内到它俩的距离和最小的结点。
为了避免 f() 刚好取到 i 导致出现 i=j 的不合法情况,让 f() 再记录一个次小的结点。

这肯定过不了,但如果我们把 T1,T2 的点分树建出来,(l1,l2) 的对的数量总共 nlog2n 个,这就可以了。

还有一个问题:怎么存 f(l1,l2)?不能用 map,会多一个 log

答案是不存。记录一个数组 g。算法直接枚举 l1O(n)),在 T1 点分树上搜索 l1 的子树(O(nlogn)),对搜索到的每个结点 i 枚举在 T2 点分树上的祖先 l2O(nlog2n)),让 (i,l1,l2) 更新 g[l2]

搜完的 g 数组就是当 l1 固定时的 f。此时再搜一遍 l1 的子树,更新 ans[i] 即可。

posted @   FLY_lai  阅读(22)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示