test20230904

写在前面的话

今天考试 \(60+100+100+20=280\), \(\text{rank1}\) ,但一定是运气好。T4 因为没有考虑周全所以挂了 \(10\) 分。

我也意识到考试代码实现的精确离不开日常的练习,不能不重视模板的熟练。争取以后考试可以做到不挂分。

T1

简要题意:有若干次询问,每一次询问 \(a,b,0\) ,求是否存在 \(x\)\(a^{bx \bmod p} \equiv 1 (\bmod p)\)
\(a,b<p \leqslant 10^7\)

思路点拨:由于我的水平问题,我只会 \(p \in prime\) 的情况。此时由于费马小定理,所以 \(a^{p-1}\equiv 1 (\bmod p)\) 。我们希望构造一个 \(x\) 使得 \(bx \equiv -1(\bmod p)\) ,并且这一定是可以构造出来的。
我们令 \(x=b^{p-2}\times(p-1)\) 的时候就可以满足条件,因为此时 \(bx=(p-1)\times b^{p-1}=(p-1)\)

T2

简要题意:有若干个基站在一个数轴上,对于第 \(i\) 个基站,他在 \(x_i\) 处,并且可以向 \([x_i-d_i,x_i+d_i]\) 位置的基站单向发射信号。每一次操作我们可以选择一个基站,然后让这个基站向周围的基站发射型号,接收到信号的基站继续发射信号以此类推。问要让全部的基站接受到信号,至多至少要操作几次。
\(n \leqslant 10^5\)

思路点拨:比较简单一题,我们假设已经按照题目的方式让全部基站向可以发射信号的基站连了单向边,那么我们发现在同一个 \(\text{scc}\) 内的基站其实是可以互相到达的,所以我们缩点之后就形成了许多个 \(\text{DAG}\) 。对于一个 \(DAG\) ,它的节点个数就是最大的操作次数,因为我们可以按照拓扑序的反序操作。操作次数最小就是这个 \(\text{DAG}\) 的源点个数。

这样是 \(O(n+m)\) 的,但是无奈 \(m=n^2\) 。我们考虑优化连边。我们观察到,如果我们按照基站的 \(x_i\) 排序考虑,一个基站可以到达的点是一段区间,我们可以使用线段树或者 \(\text{ST}\) 表优化连边。 \(m=n \log n\) ,可以通过。

T3

简要题意:现在有一个无根树,我们需要维护一个路径的集合 \(S\) ,支持如下操作:

  • 加入一个路径到 \(S\) 中,价值为 \(w\)
  • 查询这个树上的连通块与多少个路径有交,输出这些路径的价值和。

连通块以虚树的形式给出。\(n \leqslant 10^5\)

思路点拨:

我们考虑一个路径与一个连通块有交集,一定是如下两种情况之一:

  • 路径的 \(\text{LCA}\) 在连通块上

  • 路径的 \(\text{LCA}\) 不在连通块上,但是路径经过了连通块中深度最小的点(我们认为 \(1\) 是根)。

现在我们对于两种请款分类讨论:

第一种:我们每一次添加路径就是在 \(\text{LCA}\) 处做单点加,查询就是路径求和。

第二种:每一次我们将路径上的点全部加上 \(w\) ,然后减去 \(\text{LCA}\)\(w\) ,之后做单点查。

显然,这都是 \(O(n \log^2 n)\) 的,可以通过本题。

T4

题目描述:现在有 \(n\) 个人,每一个人有一个重要程度 \(w_i\) 。现在有 \(k\) 个门,每一个门对应一种钥匙,每一种钥匙你可以分发许多把。现在要求,全部重要程度大于等于 \(m\) 的人都可以打开所有门,而重要程度小于 \(m\) 的不可以打开所有门,问 \(k\) 最小可以是多少。

思路点拨:结论就是答案等于满足下述这种条件的子集个数:

  • 价值和小于 \(m\) ,但是任意添加一个人就会导致价值和大于等于 \(m\) 的集合。

时间复杂度 \(O(n2^n)\)

可以这为什么是对的呢?我们假设这样有 \(x\) 个子集满足条件,但是最优解需要 \(x+1\) 个门。那么就存在两个子集 \(x,y\) ,他们缺同一把钥匙。 \(x\)\(y\) 的并集价值和大于等于 \(m\) 可以他们还是缺一把钥匙,这是不满足题目要求的。

但是谁说 \(x\) 个锁就是可以满足题目要求的呢?我们让每一把锁上写一个这种居民的子集。居民持有上述子集中不包含自己锁的钥匙。

答案就是这个 \(x\)

更正情况:\(60+100+100+100=360\)

posted @ 2023-09-04 17:07  Diavolo-Kuang  阅读(45)  评论(0编辑  收藏  举报