NOIP 训练赛#13

时间安排

7:40~8:20 打四道题的暴力

8:20~8:50 想T2,想到反向加边却想了一个十分复杂的维护直径的办法,不会写

8:50~9:30​ 感觉T1可做,打表后找完规律然后思路偏离正解

9:30~10:30 想T3 T4想不出来

10:30~11:20 想不出来,罚坐

11:20~11:40 检查 \(freopen\) ,T1测了一个样例发现自己被 \(hack\) 了,崩溃

题解

T1

考虑 \(a\) 在为奇数的时候一定有一组解满足 \(a^2+b^2+(b+1)^2\)

移项,得到 \(b=\frac{a^2-1}2\),对于偶数的话考虑不断除以 \(2\) ,得到解后再乘回去即可

注意特判 \(a<3\)\((\log_2a)^2\in Z\)

T2

考虑反向加边,并且用并查集维护每个联通块

\(dfs\) 一遍求出深度,然后可以树剖+\(LCA\) 快速查询树上两点距离

考虑如何合并两棵树的直径

对于合并后的树,其直径的两个端点必定在原来的两棵树中的两条直径的四个端点里出,直接枚举组合情况判断两个点即可

引理: 对于任意一棵树,树中以点 \(x\) 为起点的最远距离的另一个端点一定在树的直径的两个端点中

故直接判断当前点所在的联通块的两个直径端点哪个距离点 \(x\) 更远即可

T3

考虑先从低到高按位贪心

首先发现奇数个1的判断可以变成每确定一个1,就更改当前这一位为1的数字的正负性

考虑对于当前数字,当考虑完它的最高位时,任何高于当前数字 \(x\) 最高位的位数都对它不做影响 \((0\&1=0)\) ,故当考虑完 \(x\) 的最高位后直接加入答案即可

对于整个序列,如果要找整个序列小于 \(0\) 的情况,将其转换为大于 \(0\) 的情况然后贪心考虑

贪心策略如果当前的总和大于 \(0\) ,那么就将 \(ans\) 的当前这一位赋为 \(1\) ,否则赋为 \(0\)

T4

由于模数 \(a\) 的取值比较大,故考虑构造一组 \(g(L,R)\) ,然后在通过调整来精确结果
考虑通过构造一种变化方式使得 \(g(L,R)\) 增加 \(1\) 就可以了
显然可以发现右移右端点可以使结果加 \(2\) 再右移左端点可以使得结果减1 \((g(L,R)+f_{10^{18}+1}-f_1)\) 然后可以发现当区间继续整体左移的时候也可以增加1,故可以不断自增来求解
\(g(1,10^{18})%a=p\) 那么左端点即为 \(1+(a-p)\),右端点即为 \(10^{18}+(a-p)\)
\(p\) 即为 \(f_{10^{18}}\) 的值
按位考虑
第一位为 \(10^{18}\times 45(\sum_{i=1}^{10}i)\)
第二位为 \(10^{17} \times 10 \times 45=10^{18} \times 45\) (考虑两位数的时候每个两位数有 \(10\) 种情况)
以此类推,得到 \(p=81\times 10^{18}+1\)

故直接输出左右端点即可(注意取模)

p.s. : T1 T3 T4都为构造题

posted @ 2023-09-22 22:04  dubnium  阅读(20)  评论(0)    收藏  举报