2023 NOIP赛前qbxt模拟考试笔记
day1
上午:
T1: 最基础的暴力模拟,也可以贪心直接求,考场上不知道哪里写挂了。
T2: 题目要求按照拓扑的方式遍历图,分别考最优和最劣两种情况。
最优情况只需要每次贪心的走队列中最小的点即可,可用堆(直接将原本拓扑用的队列换成优先队列)实现。
最劣情况考场上想的是每次贪心地走队列中最大的点,然而这种贪心是错误的。因为我们可以通过访问最小的点后去访问更优的最大的点。
例如当前遍历过的最大的点为 \(3\) , 队列中有 \(2\) 和 \(5\) ,走到 \(2\) 之后可以走到 \(6\) ,如果我们选择先走 \(5\) 再走 \(2\) 再走 \(6\) ,那么将造成两次负面贡献,但如果先走 \(2\) 再走 \(6\) 再走 \(5\) , 那么只造成一次负面贡献。
所以每次访问前需要考虑队列中最小的点是否会能产生贡献,如果不能产生贡献就先遍历这个最小的点,否则就优先遍历最大的点。
实现上可以用 \(set\) 维护队列中元素的最大值和最小值,也可以用可并堆实现,不过我选择用线段树。
T3: 只会暴力做法,正解是扫描线。
T4: 只会暴力,正解没听懂。
下午:
T1:可以发现两个性质:
$ V 1 $ : 或 \(1\) 可以强制把数转化成 \(1\) 。
^ 0 : 与 \(0\) 可以强制转化成 \(0\) 。
对每一位进行枚举,如果 '?' 之后碰到了前两种情况,那么这一位则不会产生贡献。 如果存在 '?' 且之后没有上述两种情况,则这一位会产生贡献,使方案数乘二。
时间复杂度大约为 \(64*10^5\) ,能过。
也可以通过找到每一位最后出现上述两种情况的位置,看看之后是否存在 '?' ,如果存在则这一位会产生贡献。
数据范围最大能到 \(2^{64}\) ,会爆 \(long long\) 。
T2: 考场上只会暴力枚举。可以改变枚举方式,用一个一个枚举点,换成直接枚举矩阵中的某一行/列。之后可以发现整个矩阵中有一条分割线,可以通过各种方法去找这个分割线。
T3: 只会暴力。
T4: 只会暴力。
day2
T1 开个桶,O(n)就能过,但考试的时候怕桶开不下所以用map开桶,造数据没造出能卡死的数据,挂成76分.
T2 20分暴力分dfs即可。正解是 简单容斥(莫比乌斯反演),不会。
T3 暴力能拿60分。正解是折半搜索+扩欧求逆,可以通过生日悖论证明最终答案的范围。
T4 计数题,最低档分是dp,加个矩阵快速幂优化能拿40,正解不会。
day3:
上午:
T1: 赛时尝试dfs暴力求期望,没调出代码。最低档暴力可以通过dp来求,正解是斜率优化dp。
T2:赛时看到数据范围,想到给树上各点随机赋值,m越大正确率越高,通过换根dp去check保证正确性,自己造数据后发现数据开满会TLE零点几毫秒,实际得了80分。正解没听懂。
T3: 考场上没读懂题,暴力不会敲。实际上根据题目中给出的程序模拟就能有30分。
T4: 写了暴力,但没调出来。最后4pts。
下午:
T1: 想出正解,但没调出来。
T2: 用并查集维护联通块,考场上没想到背包,写的暴力。正解是用并查集维护后用二进制拆分优化多重背包。
T3:考场上用线段树写了10分的暴力,用st表维护静态可以拿60部分分,正解是根号重构。
T4:期望DP,因为转移过程有环,所以需要用高斯消元处理。
day4
T1: 正解不难想到,直接枚举即可,考试时忘记特判刮了48分。
T2: 暴力区间dp能拿12分,改变状态设计能拿60分,正解是推导异或性质。
T3: 思维题,考场上暴力没调出来。经推导可以发现正解是所有环长的gcd。
T4:正解是单调队列+二分+哈希/后缀数组优化DP
day5
上午:
T1:
易推出答案为:min(b,n)+min(g,n)-n+1。
T2:
现设基础dp式:
dp[now]=min(dp[now],dp[祖先]+len*a[now]+b[now]);
可以发现这个式子可以斜率优化。
T3:
没看懂题目中的收敛,根据样例猜到n=2的情况。
T4:
考场上重构了3、4次代码,把暴力调出来了,但时间复杂度太差,过不了最低测试点。
DAY6
T1:
考场上想的分块打表,拿了60分,推出了正解用到的性质,但没优化计数,所以没过剩下的点。如果打表过程记录块长可以极大优化表长,可以过。
T2:
考场上感觉像是DP,敲的暴力,正解是贪心。
枚举子区间,用堆维护区间区间最大值即可。
T3: 只会暴力。
T4: 没听懂。
DAY7
T1: 暴力是普通dp,很快看出可以用权值线段树维护 [1,l-1] 区间的最大值,写了线段树优化后开始对拍,发现过不了拍,调了一段时间后发现忘加‘l=1’的特判了,加上特判后就能过拍了。
T2: 先想暴力,跑q遍最大生成树,写完后发现最后一个大样例太大了,就用程序对比两个输出文件,显示有差异,但我肉眼看不出来,之后发现是输出的时候多输出了空格。
看到时间不太够就先去想T3、T4暴力了。写完T3、T4暴力后想T2正解,想到离线预处理,但剩下的时间没有支持我把正解代码调出来。
T3:
看到有区间第k大值,想到主席树拿第二档暴力分,但没信心短时间写出主席树,所以选择用优先队列写暴力,拿了第一档部分分。
T4:
根据题意模拟,打的暴力。