3nd ucup 部分题目记录

news/2024/11/27 20:04:33/文章来源:https://www.cnblogs.com/cwhfy/p/18573023

退役之后一直想着,我至少还是更新一下 ucup 好题和互测好题,但很遗憾一直摆到了现在;论文也还没有开始施工。

我一直觉得自己如果改掉不良的生活习惯,提高自己的学习效率,完全可以达到更高的水平,但很遗憾我确实战胜不了自己,我或许永远都看不到自己的上限了。

马上就 NOIP/CTT 了。我觉得我起码得象征性的训练一下。我仔细想了想,我还有一个上 LGM 的梦;我是 ucup 队里最菜的人,我不想继续次次在后期摆烂。

那趁我清醒,开始写点东西吧。

先写下没打但是想做的:stage4,stage8

2J. Polygon II

\(n\) 个在 \([0,2^{a_i}]\) 随机的实数,求它们能围成多边形的概率。\(n\le 1000\)

算不合法的概率,那就是枚举最大的边 \(p\),要求 \(\sum x\le 2x_p\) 。改变一下 \(x_p\) 的定义,重新令其为 \(2^{a_p}-x_p\) ,这样就得到 \(\sum x\le 2^{a_p}\) 了。

接下来是关键的一步: 由于我们只关心 \(\sum x\) 和一个整数的大小关系,那其实可以把 \(x\) 拆成整数部分和小数部分。也就是如果指定 \(x\) 的整数部分,令 \(A=2^{a_p}-\sum [x]\) ,那合法的概率其实就是 \(n\)\([0,1]\) 间随机的实数加起来 \(\le A\) 的概率,这可以容斥计算。

问题转化成:计算 \(A\geq 0,A\geq 1,A\geq 2,\dots,A\geq n\) 的概率。

现在 \([x_i]\)\([0,2^{a_i})\) 随机的整数,发现我们可以进一步拆解:可以看成二进制下每一位都有 \(\frac{1}{2}\) 的概率为 \(1\) 。最后的计算就是数位 dp 状物了,从低到高 dp ,记录下当前 \(\sum x\) 和限制的大小关系,以及往后的进位。复杂度大概是 \(O(n^4\log V)\)

怎么优化呢,由于我们最后只需要计算 \(\sum e_iP(i+\sum [x]\le 2^{a_p})\) 状物,我们在 dp 的时候只需要在最低位先垫上 \(i+1\) ,最后看第 \(a_p\) 位有没有进位即可,于是也不需要记与限制的大小关系,答案就是 \(dp_{a_p,0}\) ;又可以发现并不需要枚举 \(p\) ,所以复杂度降为 \(O(n^2\log V)\)

2L. Chords

一个环上 \(2n\) 个点连了 \(n\) 条边,要取出尽量的边满足两两不交,数据随机。

\(n\le 10^5\)

先编出来 \(O(n^2)\) 的 dp ,就是设 \(dp_{i,j}\)\([i,j]\) 内能取多少线段。发现由于数据随机,答案是 \(O(\sqrt{n})\) 级别的,于是经典的交换状态和值域,设 \(p_{j,k}\) 是令 \(dp_{i,j}\geq k\) 的最大的 \(i\) ,发现 \(p\) 也是好算的,复杂度 \(O(n\sqrt{n})\)

2I. Mercenaries

\(n\) 个点, \(i\)\(i+1\) 的边上有若干物品,物品有属性 \((x,y)\) ;点 \(i\) 上也有一件物品。现在有若干询问 \(R,a,b,c\) ,你想求出最大的 \(L\) 使得:能从点 \(L\) 到点 \(R\) ,使得取出点 \(L\) 的物品,再在路上每条取一件物品,能使得 \(a(\sum x)+b(\sum y)\geq c\)

\(n,q\le 2*10^5\) ,物品总个数 \(S\le 5*10^5\)

可以发现这个问题一看就很凸包。

建出线段树,设 \(G_p\) 是节点 \(p\) 内每条边取一个物品得到的 \((\sum x,\sum y)\) 形成的上凸包;\(F_p\) 是节点 \(p\) 内取一个点为起点,走到右端点的 \((\sum x,\sum y)\) 构成的凸包。令 \(M\)\(mid\)\(mid+1\) 的物品构成的凸包,发现 \(G_p=G_l*G_r*M\)\(F_p=F_l*G_r*M+F_r\) ,其中 \(*\) 是闵可夫斯基和,\(+\) 是求两个点集并起来形成的凸包。查询在线段树上二分即可。

发现每次询问要对 \(O(\log n)\) 个凸包求出,取一个点 \((x,y)\) 使 \(ax+by\) 最大。考虑把询问离线下来,把 \((a,b)\) 按极角排序,然后只用对每个凸包维护一个指针即可。复杂度 \(O((n+q+S)\log n)\)

3K. Knocker

这场开始和两个超级传奇大师做队友。

给你一个序列,一次操作能整体模一个数,问最后能得到多少不同的序列。\(n\le 500\)

(记录官方题解)先来分析终止状态 \(b\) 合法的条件。不妨对 \(a\) 从大到小排序并去掉相同的位置,接下来观察 \(b_1\) ,现在不妨设 \(k=b_1-a_1\) ,我们有结论:对于 \(a_i\geq k\)\(b_i\) 一定等于 \(a_i-k\)

只需要证明一步操作后这个条件成立,然后归纳即可。不妨设模 \(x\) 后得到的分别是 \(a'_1\)\(a'_i\) ,那首先有 \(a_1-a'_1\le k\le a_i\) ,于是 \(a_i-a'_i\geq a_1-a'_1\) 。另一方面由于 \(a_i-a'_i=x[\frac{a_i}{x}]\) 。所以 \(a_1-a'_{1}\geq a_i-a'_i\) 。就发现 \(a_1-a'_1=a_i-a'_i\) 了。

回到问题,这里还有一个条件:\(a_i<2k\) ,一步有效操作后 \(a_1\) 一定会减半。发现这之后直接取模数为 \(k\) ,即可让 \(a_i\geq k\) 的数都变成 \(b_i\) 了;这也是最优的方法,因为取更小的数后效性更大,取更大的不合法。你发现这样就不会影响 \(a_i<k\) 的那些数,于是此时递归到了一个子问题!只不过我们为了不再影响已经固定了的这些数,会要求之后每次取的模数 \(> b_1\)

于是设 \(dp_{i,j}\) 表示只使用 \(\geq j\) 的模数能得到的不同 \(b_i\)\(b_n\) 个数,转移枚举 \(k\) 即可。复杂度 \(O(n^3)\)

3B. Breaking Bad

给你一个 \(n*n\) 的矩阵,对于 \(k=0,1,\dots,4\) ,问是否存在排列 \(p\) 使得 \((\sum A_{i,p_i})\bmod 5=k\)\(n\le 1000\)

首先可以想到随机赋权算行列式,可惜过不了。

(记录官方题解)

观察到大多数情况下每个 \(k\) 都是有解的。考虑如果有一个排列满足能取出不交的四对数 \((i,j)\) ,都满足 \(a_{i,p_i}+a_{j,p_j}\neq a_{i,p_j}+a_{j,p_i}\) (模 \(5\) 意义下)那就可以通过交换/不交换 \(i,j\) ,对排列进行调整,不难发现一定能调整出所有可能的余数。

(其实有一个数学上的结论是,对于 \(k\) 个模 \(p\)\(0\) 的数 \((k<p)\) ,它们不同的子集和一定有至少 \(k+1\) 个。)

接下来先找到任意一对这样的 \((i,p_i),(j,p_j)\) 。事实上去尝试 \((i,j),(i+1,j+1)\) 就好了,反证易得。如果找不到的话也不难说明此时排列怎么取,结果都是一样的:一定存在序列 \(R,C\) 使得 \(a_{i,j}=R_i+C_j\)

接下来直接把 \(i,i+1\) 行和 \(j,j+1\) 列删掉,继续找下去,如果最终找到了四对我们就 win 了。否则看一下发生了什么,设此时找到了 \(q\) 对,发现我们其实就得到一个 \((n-2q)*(n-2q)\) 的子矩阵,满足 \(a_{i,j}=R_i+C_j\) 。不妨设 \(q=3\) ,把特殊的 \(6\)\(6\) 列提到最前面。接下来直接状压 dp:

\(dp_{i,S,h}\) 表示考虑到第 \(i\) 行,关键列取了 \(S\) 且当前和为 \(h\) 是否可能。注意这里算和的时候,我们先把和当成 \(\sum R+\sum C\) ,每次取了一个特殊的格子后就把对应的 \(R,C\) 减去,再把实际值加上即可。复杂度即为 \(O(4^mn)\) ,本题中 \(m=5\)

感觉这场这两个题都不在我脑洞范围内啊,大概想一想,K 是找到了判定过程中的子问题,从而设计 dp;B 是观察到了难搞的情况形式很好看,于是也不难搞了。

5J. Prefix Divisible by Suffix

问你 \(n\) 以内有多少数满足:把十进制写出来,能够把它划分成两段 \(p,q\) ,使得 \(q+c|p\) ,其中 \(c\) 是给定常数。\(n\le 10^{14},c\le 10^4\)

发现自己其实一眼就会了,只是不敢剪枝。考虑直接枚举最低的 \(7\) 位,发现此时我们对 \(n\) 提出来若干限制 \((p,c)\) 表示:若模 \(p\) 余数为 \(c\) 就一定合法了。对这些限制容斥,这样就得到了一个算量 \(20^{7}*\log V\) 的做法。(需要解 CRT)

但自己想想,算量真的会那么大吗?可以发现指定容斥的集合,其模数的 lcm 很有可能很大,于是容斥的时候直接搜索要钦定的集合,lcm 太大了就剪掉。然后就能通过了。。挺没意思的。

5C. Painting Fences

给你一个网格,给出每个格子开始的颜色(黑/白),一次操作可以选一条与 x/y 轴平行的直线对网格翻折,对于重合的两个格子,如果一个为黑的话可以把另一个也染黑。求出使得所有格子变黑的最小次数。\(n\le 1000\)

倒着来看这个过程,于是发现起作用的其实只是一个全黑的子矩形,设 \(f_{l,r}\) 是假设这个矩阵是 \(1*n\) 的,且 \([l,r]\) 为黑那需要操作多少次,\(g_{l,r}\) 同理为矩阵长为 \(m\) 时的次数。则可以发现一个子矩阵需要的操作数就是 \(f_{xl,xr}+g_{yl,yr}\)

枚举 \(xl,yl\) 。一个一开始就能做出的观察是答案很小,具体的发现:\(f_{l,r}\) 的大小都是 \(O(\log n)\) 级别的,所以求出 \(p_{l,i}\) 表示最小的 \(r\) 使得 \(f_{l,r}\le i\)\(q_{l,i}\) 同理。于是只需要枚举 \(xr=p_{xl,i},yr=q_{xr,j}\) 看看是否合法即可。这里可以双指针,复杂度 \(O(n^2\log n)\)

7E. Express Eviction

给你一个 \(n*m\) 的网格图。有一些格子存在障碍,障碍可以 ban 掉它周围的四个顶点。现在你想知道:至少要移除多少障碍,才能从 \((0,0)\) 走到 \((n,m)\)

先想想如果已经知道哪些点被 ban 了该怎么判断,发现其实就是,如果存在 \(x=0/y=m\) 的点与 \(x=n/y=0\) 可以通过 ban 掉的点八联通起来,那就寄掉了。

进一步可以发现,确定障碍后寄掉的条件其实就是: \(x=1/y=m\) 的某个障碍可以走到 \(x=n/y=1\) 的障碍,其中每一步只能走到 \(x,y\) 之差都不超过 \(2\) 的障碍,证明比较容易。

对着这个做最小割就好了。

7C. Price Combo

很牛的一个题,先咕了。

10H. Intersection of Paths

给定一棵有边权的树,询问:临时修改一条边的边权,然后给定 \(k\) ,求出取 \(k\) 条端点不重合的路径,交的边权和的最大值。\(n,q\le 5*10^5\)

取重心为根,发现如果存在一组方案的交会包含 \(u\)\(v\) 的路径,就等价于 \(sz_u,sz_v\geq k\) ,于是如果没有修改边权的事情,我们就只用求出 \(sz\geq k\) 的点中距离最远的两个点。

现在有边权修改,怎么处理,我们其实只需要求出删掉这条修改的边后,两个子树分别的直径即可。注意到这个直径的端点要么是叶子,要么是删掉的边的端点,那我们考虑把 \(k\) 相同的询问放到一起处理,将保留 \(sz\geq k\) 的点后得到的树的叶子拎出来,容易发现它们只会有 \(\frac{n}{k}\) 个,每次询问相当于查一段区间的点的直径,线段树处理就可以平衡。复杂度 \(O((n+q)\log n)\)

冷静一下,其实这样处理烦了,我们把询问按 \(k\) 从大到小排序,这样只需要维护线段树,要求每次激活一个点,以及查询一个区间激活的点的直径即可。复杂度仍是 \(O((n+q)\log n)\)

LOJ177 生成子群阶数

给你 \(m\) 个长度为 \(n\) 的排列,问你它们能复合出多少不同的置换,其中每个排列都能用若干次。\(n,m\le 50\)

发现还不会这个东西,学一下。

首先可以把给定排列的逆也加进来,因为设其环长 lcm 为 \(L\) ,其实逆就可以表示成原来的排列复合 \(L-1\) 次。

考虑建出一张图,对于一个给定的排列,对任意 \(1\le i\le n\) ,我们从 \(i\) 连向 \(p_i\) ,这样一组操作可以看做是从 \(1\) 开始的一条路径,途中会复合上所有经过的置换。可以发现这里走到的点就代表当前 \(p_1\) 的值。

现在先求出以 \(1\) 为根的生成树,设终点为 \(t\) ,那对于 \(1\)\(t\) 的任意一条路径,考虑在走到 \(t\) 之后,沿着树边走回 \(1\) ,再走到 \(t\) ,可以发现这样效果是不变的,于是终点为 \(t\) 的路径一定都形如:从 \(1\) 出发走回了 \(1\) ,再按照树边走向 \(t\)

就可以得到一个结论,方案等于:\(p_1\) 可能的取值数 ,乘上 \(p_1=1\) 的方案数。

继续思考对于一条走回 \(1\) 的路径 \(1\rightarrow u_1\rightarrow u_2\dots \rightarrow u_k\rightarrow 1\) ,它和 \(1\rightarrow u_1\rightsquigarrow1\rightsquigarrow u_1\rightarrow u_2\rightsquigarrow 1 \rightsquigarrow u_2\rightarrow u_3 \rightsquigarrow 1\dots \rightarrow u_k\rightarrow 1\) 是等价的。其中 \(\rightsquigarrow\) 是在走树边。

于是得到结论:\(p_1=1\) 的排列都可以通过将 \(1\rightsquigarrow u\rightarrow v \rightsquigarrow 1\) 得到的排列复合得到。

这样做的好处是,我们可以用的置换都满足 \(p_1=1\) ,于是可以递归到 \(n-1\) 的子问题继续做。但问题是我们建出的图有 \(nm\) 条边,也就是说子问题里 \(m:=nm,n:=n-1\) ,这显然就炸掉了。结论是,我们只需要把这 \(nm\) 个置换先改造成 \(O(n)\) 个,改造的方法是,我们进行随机,在这些置换中随机选择一个子集,将内部的置换复合起来,这样随 \(O(n)\) 次,把每次随机得到的置换给递归下去。

复杂度 \(O(n^5)\) ,瓶颈在于要做 \(O(n^2)\) 次随机复合的过程 ,每次期望会复合 \(O(n^2)\) 个排列,单次复合是 \(O(n)\) 的。

11J Again Permutation Problem

只需要把 LOJ177 的答案和 LOJ4127 的答案乘起来就好了。

回顾一下 LOJ4127 的做法,其实发现这里分析的方法是类似的,我们仍然先把排列的逆加进来,然后建立一张 \(n^2\) 个点的图,对于一个给定排列我们在点 \((i,j)\) 和点 \((p_i,p_j)\) 间连边。这样有结论是:若 \((i,j),(a,b)\) 联通则 \(p_i=a,p_j=b\) 的方案数等于 \(p_i=i,p_j=j\) 的方案数。证明是和上面那个题的证明基本一致的。

于是算逆序对的期望只需要枚举 \(i<j\) ,记与 \((i,j)\) 联通的满足 \(a<b\) 的点数为 \(x\)\(a>b\) 的点数为 \(y\) ,那贡献其实就是 \(\frac{y}{x+y}\) 了。更直接的,就是对每个联通块计算 \(\frac{xy}{x+y}\) 的和。

11F Train Seats

题意是有一些椅子,每次可以拿走一个椅子,代价是离它最近的两把椅子的坐标差(若左边没有则为 \(0\) ,右边没有则为 \(m+1\)) 。让代价的和最大。\(n\le 2*10^5\)

\(a\) 排序,设 \(b_i=a_{i+1}-a_i\) (令 \(a_{n+1}=m+1\)),则一次操作相当于合并 \(b_i,b_{i+1}\) ,代价为 \(b_i+b_{i+1}\) ,最后让代价最大。建一棵二叉树来刻画这个过程,然后我们有结论:不可能有一个点的两个儿子都是非叶子。证明就考虑四个数 \(x,y,z,w\) ,我们相当于要证明:先合并 \((x,y),(z,w)\) ,再合并 \((x+y,z+w)\) 一定不优。原因考虑此时代价是 \(2(x+y+z+w)\) ,而从左往右依次合并的代价是 \(3x+3y+2z+w\) , 从右往左是 \(x+2y+3z+3w\) 。把都有的东西减掉,发现 \(\max(2x+y,z+2w)\geq \frac{2x+2w+y+z}{2}\geq x+w\)

那其实就可以看到我们只有两种可能:要么合并好 \([2,n]\) 再把 \(1\) 合并进来,或者合并好 \([1,n-1]\) 再把 \(n\) 合并进来。也就是说,每次会删掉 \(b\) 的开头/结尾,代价是当前剩余的长度乘上选择的数。

直接使用 qoj2070 的代码即可。大概思路就是枚举最后保留的位置 \(k\) ,那就是对一棵只有两条链的树做 exchange argument,利用线段树来合并两侧已经出现的连续段即可。

11O New School Term

差点把我们队逮捕了的题。

题意是给你一些边,你希望选择其中一些边,在图是二分图的前提下,使选择的边的 \(\sum 2^{编号}\) 最大。

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

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

相关文章

【随手记录】IDEA里面pom文件被忽略,变灰、画横线处理

在setting --> Build -->Build Tools --> Maven 下找到ignored files选项,去掉pom文件的勾选框,重新加载项目即可!

大模型问答的工作流程

从问题输入到输出经历五个步骤文本分词: 大模型会将输入文本转化成单词,词语,词组,符号 分词向量化: 将分词转化成向量为了让计算机更好的理解 大模型推理: 推理时大模型会根据输入计算出下一个输出的分词的集合 分词输出: 从推理出来的集合中选择一个分词,将新的结果再进行大模…

[75] (NOIP集训) NOIP2024 加赛 8

A.flandre 我的做法是,所有数离散化之后扔进桶里,去枚举选择 \([i,+\infty)\) 内的数的贡献,在所有的 \(i\) 里取一个最大值作为答案 lbtl 指出可能存在最优答案是选择 \([i+1,+\infty)\) 内的所有数与值为 \(i\) 的部分数的数据 和 lbtl 交涉后尝试构造一组相同元素只选后一…

P10974 换根 dp 解题报告

题目传送门 题目大意: 给定一颗无根树,有一个节点是源点,度数为 \(1\) 的点是汇点,树上的边有最大流量。除源点和汇点外,其它点不储存水,即流入该点的水量之和等于从该点流出的水量之和。整个水系的流量定义为原点单位时间内能发出的水量。 现在需要求出:在流量不超过最…

CH592/CH585工具更新说明_USB篇

①打开USB更新工具 ②保证芯片没有供电以及没有GPIO灌电的前提下,将PB22接到低电平GND上(进入BootLoader),再插入USB线供电,之后点击软件中的Search Device即可搜索到设备 ③点击Download下载程序即可 ④烧录成功样例

H5-6 列表标签 有序列表

1、有序标签有序列表是一列项目,列表项目使用数学进行标记。有序列表始于<ol>标签。每个列表始于<li>标签。 <ol><li></li><li></li></ol> 2、type属性: <ol>的属性type拥有的选项1表示列表项目用数字标号(1,2,…

rust学习十二、测试

测试从来不是一件简单的事情,我本人深有体会! 书本作者引用了很重要的话:软件测试是证明 bug 存在的有效方法,而证明其不存在时则显得令人绝望的不足 (Edsger W. Dijkstra 在其 1972 年的文章【谦卑的程序员】(“The Humble Programmer”)) 注:Edsger W. Dijkstra在1…

NOIP2024加赛8

如此状态,如何NOIP状态很不好,恼了。虚拟机太卡了,根本交不上去。 flandre 发现选取的肯定是从大到小排序后的一个后缀,然后就做完了,时间复杂度\(O(n\log n)\)。点此查看代码 #include<bits/stdc++.h> using namespace std; #define rep(i,s,t,p) for(int i = s;i …

根据条件显示不同背景色

1. 概述1.1 问题描述 在 FineReport 中制作报表时,经常遇到在满足一定条件下「单元格/行/列」需要显示为不同的背景色,那么该如何实现呢? 1.2 解决思路 可以通过添加「条件属性>背景」来实现。 设置「当前格子/当前行/当前列」的原理一样,本文以「当前格子」和「当前行」…

Linux下打包Qt应用程序

linux下打包应用程序 非常复杂 接下来一步一步实现 第一步:下载linuxdeployqt程序 我已经保存在了百度网盘,记住qt5用老一些的版本 第二步:下载好后重命名为linuxdeployqt好用一点 然后将其移动到/usr/local/bin目录下 并且授权 记住 一定要授权 检查是否成功 sudo lin…

Linux ubuntu命令行安装图形界面

前言全局说明服务器上默认是没有图形界面的,但是需要时,只能单独安装。或者安装时没有装图形界面,后期又用到。一、说明 环境: Ubuntu 18.04.6 LTS (Linux qt-vm 5.4.0-150-generic #167~18.04.1-Ubuntu SMP Wed May 24 00:51:42 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux)…

H5-6 文本

<em>  定义着重文字<b>   定义粗体文本<i>   定义斜体字<strong> 定义加重语气 <del>  定义删除字<span> 元素没有特定的含义  常用文本标签和段落是不同的,段落代表一段文本,而文本标签一般表示文本词汇 可以嵌套在&l…