国庆模拟赛总结

概览

国庆期间的集训也过完了,六天的模拟赛也打完了(可能还没有订正完),写一篇总结先

day1

没啥好说的,基本上\(AK\), 后面发现\(T1 , T2\) 挂了\(13pts\) ,是少了两种特殊情况的判断

所以一定要注意不要少特判啊喂!

day2

没参加 \(QWQ\)

所以就先不总结了

day3

炸了

首先是 \(T1\) 因为数组开小惨痛挂掉\(40pts\), 接着切掉 \(T2\) ,结果 \(T3\)思路正确,结果全错,也是\(16pts\) 遗憾离场

归根结底还是一堆智障错误

1.数组一定开够

2.调不出来的代码往往比暴力的分还低!

day4

至少没有 \(day3\) 那么炸了

\(T2\) 记得数组别再开小了

day5

\(T1\) 上来心态直接崩了,于是拿到了两位数的分数

day6

依旧是全面崩盘

\(T2\) 终于搞了一个大模拟,瞅了一眼发现不可做,于是直接跳过

\(T3\) 一直做到比赛结束都没有搞出来正解,\(T4\) 打算打一个\(25pts\) 的\(subtask1\) 还挂了

所以总结就到这里了

赛时思路 & solution

\(Tips\) 如果非赛时思路会加上Sol:

day1

T1

第一眼觉得是一个并查集,同一个集合内的都可以,但是后面觉着不对劲

于是再次读题,推导样例

原来是一个bfs!

我们果断写一个bfs,如果能够从1到i,那么i号点就可行

也是顺利通过样例,开 \(T2\)

T2

可能是相关题目做多了,一瞅见 \(l, r\) 这类询问就想上线段树(认真读题前)

然后仔细读了一遍

这是神马鬼畜容斥题?

于是我们先考虑对于某一段区间内恰好有k个1的[l, r] 来说,我们有多少种不同的序列

显然答案就是 \(C_{r - l + 1} ^ k\)

这个是不用多说的

那么对于两个相交区间,我们直接相加肯定有问题,我们减去中间区间的即可

然后这道题就做完了,开\(T3\)

T3

又又又又是树上问题,感觉要没

思考了一会发现我们最后一定要选择k个点(k为叶子节点个数),正确性显然,而且我们选择的点所对应叶子应该为一 一对应的或者是某两个交集正好为一个叶子节点,否则我们就没办法保证正确性

那么我们求最小值是好做的

我们直接深搜,到叶子节点之后记录minn[i]表示当前的叶子节点i,我们为他选择的节点点权最小为多少,对于若干个叶子节点交汇的一个父节点,我们直接把最大值拿出来,其他统计进答案,最大值继续往上return 取最小值,注意边界即可

那么我们既然已经会最小值,那么对应的节点也是好做的

写一个vector 维护即可

T4

套路,太套路了!

先考虑一下我们最后的答案是怎样的

要么直接走从u到v的最短路

要么先从u走到某个点x,再走到y,最后走到v,其中从u到x走的是最短路A,从y走到v也是最短路B,而从x到y则是经过s到t上的最短路C(正反都可)

第一种是好处理的,一个单源最短路即可

第二种情况中,A路径,B路径都是好处理的,也是最短路

而C路径的话,我们可以在转移从s或者从t出发的最短路时记录每个点P可以从哪些点转移过来,记ans[i]为计入从s到t的最短路时从u出发到i的最短路,那么就有转移

ans[now] = dis[now][0];
for (auto x : pre[now]) 
	ans[now] = min (ans[now], ans[x]);

于是注意一下细节就做完了

end

\(T1\)挂了\(10pts\),\(T2\)挂了\(3pts\)

原因在于特判

总分 \(387pts\), \(rank\ \ 1\)

day2

没打,不写

day3

T1

我们考虑 \(n ^ 2\) 显然是好做的,那么我们如何拓展呢?

敏锐的发现 \(\sum\limits_{i = 1}^{n} a_i \leq 5000\)十分可疑,我们可以由此下手

考虑到其实所有为0的位置都没有贡献,那么我们只保存每个正整数位置,这样的位置最多有5000个

我们枚举\(a_i, b_j\) 对应时的偏移量\(k = (i + j + n) \mod n\) ,并令 \(c_k = \max (a_i + b_j, c_k)\)

最后我们还要考虑到并非两个正整数对应的情况,与两个数组的单体最大值取max即可

T2

第二题要求异或值的平方之和,正解不好直接上手,那么我们考虑前 \(60pts\) 如何拿到手

我们考虑到\(a_i \leq 1000\),显然是有着某种特殊意味的

欸?我们考虑到最多有\(1000\times 1000\)种不同的异或组合,我们记录一个桶数组\(cnt\),直接枚举每个数字的值 \(a\), 与其组合的数字 \(b\),那么他们的贡献就是 \(cnt_a \times cnt_b \times (a \oplus b) ^ 2\)

这样做的复杂度是 \(O(1000000)\) 级别的

我们能否将这种做法推广到全局呢?

显然可行,我们可以按位考虑

按位拆分后,我们的异或平方和按照完全平方公式展开 \((a + b) ^ 2 = a ^ 2 + b ^ 2 + 2 \times a\times b\)

我们考虑每个数的第i位对答案的贡献,我们直接枚举另一个位置j,那么他们两个的值就是 \(2 ^ {i + j}\)

系数也是好统计的,我们分为当前数字第j位上为 \(0/1\) 考虑即可

T3

一眼区间dp

赛场上想的就是我们设 \(f_{i, j, k}\) 表示我们当前区间为 \([i, j]\) 最后剩下的数数值为\(k\) 的方案数,最后成功的把自己绕了进去

​ \(Sol\)

​ 没错就是区间dp,我们设\(f_{i,j}\) 表示我们把区间 \([i, j]\)全部删掉 ,而\(a_{i - 1}, a_{j + 1}\)留下的方案数,那么显然最后我们输出 \(f_{1, n}\) 即可,因为最后删掉的数对于每种方案是唯一的

​ 接下来我们的转移方程就有了,我们枚举最后删掉的位置 \(k\), 则

\[\textstyle f_{i, j} = \begin{cases}0 & a_{i - 1} = a_{j + 1} \\ \sum\limits_{k = i}^{j} [(a_k \neq a_{i - 1}) \wedge (a_k \neq a_{j + 1})] \times f_{i, k - 1} \times f_{k + 1, j}\times C_{j - i + 1}^{k - i} & a_{i - 1} \neq a_{j + 1} \end{cases} \]

​ 这里要乘上组合数是因为两个删除序列合并时,可以有不同的顺序

​ 复杂度 \(O(n ^ 3)\) ,可以通过

T4

赛场上写了一个无脑输出 0,但是由于不知名原因 \(Runtime\ Error\) ,于是痛失 \(5pts\)

正解不太会,这里就不写了

end

\(T1\) 因为数组开小了挂了\(40pts\) , \(T3\) 死磕到最后都没能跳出来,总分数 \(176pts\), \(rank\ \ 7\)

day4

T1

性质题

本质就是说问\([n + 1,n \times m]\) 区间内的质数个数是否大于等于 \(n\)

那么关于质数,我们有一个性质就是越大,质数越稀疏

那么根据这个我们可以推断出必然存在一个位置 \(N\) 使得 $\forall (n\geq N) \wedge (m \in [1, 15]), card (\mathbb{P} \cup [n + 1, n \times m]) < n $

即对于所有 \(n \geq N, m \in [1, 15]\) ,均不满足条件

那么我们先打一份表,发现 \(N\) 的取值大概在 \(10 ^ 6\) 左右

之后我们对于 \(n \le N\) 的数据预处理一下质数个数, 其余直接输出 \(No\) 即可

T2

\(mex\) !!

居然是 \(mex\) 问题!

那么这道题的第一眼是无从下手的

直接计算肯定是不好算的,哪怕你有线段树啊啥的

欸!我们可以拆贡献!

那么我们直接枚举 \(mex \in [0, n]\) (因为只有 \(n\) 个数所以\(mex\) 最大为\(n\))来计算贡献即可

对于 \(mex = i\) ,它的贡献只存在于两个 \(i\) 之间

我们存储一下每一个数出现的位置, 然后枚举计算即可,复杂度为 \(O(n)\)

\(Tips:\) 注意特殊情况,比如相邻相同数不能计算贡献

T3

赛时做到这道题已经没有多少时间了

直接打一个暴力走人

枚举选取的集合,看一下合不合法统计即可

反正觉得这道题一定是\(0/1 \ trie\) 上dp

​ \(Sol:\)

​ 首先挖掘性质。将\(a_i\)从小到大排序后,\(a_i\oplus a_j\)的最小值一定在某一对相邻\(a_i\),即\(a_i\oplus a_{i+1}\)处取到。

​ 简易证明:排过序后,对于相邻的\(i,j,k\),从最高位去考虑,要么是\(0,0,1\),要么是\(0,1,1\),那么选\(i,j\)或\(j,k\)一定不会比选\(i,k\)大。由此,若任意相邻位置满足条件,则整个序列都满足条件。
​ 那么设\(dp_i\)表示以\(a_i\)结尾的方案数。根据以上性质显然有:\(dp_i=1+\sum_{a_j<a_i}dp_j[a_j\oplus a_i\ge m]\)。
​ 考虑在 Trie 上DP。
​ 首先,记录\(val_u\)表示 Trie 上\(u\)号点代表路径的\(dp\)值之和。即在 Trie 上插入\(a_i\)对应的\(dp_i\)时,令路径上每个节点\(u\)的\(val\)值加上\(dp_i\)。
​ 为了求\(dp_i\)在 Trie 上查询时,考察\(m\)二进制下当前位:

​ 若为\(1\),则这一位必须与\(a_i\)的对应位不同,直接移动指针经过与\(a_i\)状态不同的边。
​ 若为\(0\),则这一位无限制,由于排了序,当前Trie上插入的都比\(a_i\)小,直接累加与\(a_i\)状态不同的边到的节点的\(val\),然后移动指针经过与\(a_i\)状态相同的边。

T4

太难啦不会啊

跳过吧

end

\(T2\) 又是因为数组开小了挂掉 \(10pts\) ,总分 \(200pts\), \(rank\ \ 4\)

day5

最炸的一天

T1

我们敏锐的发现其实题目中的操作将整个序列划分为若干个环

环之内随意两个数都能够进行操作,但是异或值不会改变

然后我们就会发现我们只需要判断一下两个对称位置所在环的异或值是否相同即可

T2

赛时压根就没看 (0-0)

​ \(Sol:\)

​ 我们一看到这种题第一反应肯定是dp

​ 暴力就不说了

​ 直接统计肯定是不好做的,我们考虑拆贡献

​ 对于第 \(i\) 号题目,我们分为两种情况讨论

​ \(1.\) 如果它的结果可见,那么它产生贡献的前提就是在前 \(i - 1\) 道题中结果可见的题目时间总和 \(\leq T - t_i\), 我们直接做一个\(0/1\) 背包维护方案数即可,时间复杂度是 \(O(n\times T)\) 的

​ \(2.\) 如果它的结果不可见,那么它产生贡献的前提是在第 \(i + 1\) 到第 \(n\) 道题中结果不可见的题目时间总和 \(\geq \sum\limits_{j = 1}^{n} a_j - T\), 转换一下其实也相当于是第 \(i + 1\) 到第 \(n\) 道题中结果可见的题目时间总和 \(\leq T - \sum\limits_{j = 1}^{i} a_j\), 同样的,反向用\(0/1\) 背包维护一下即可

T3 T4

都没写,回去看题解吧

end

总分 \(30pts\) ,\(rank \ \ 12\) \((烂到家了)\) (¯―¯٥)

day6

好吧至少比 \(day5\) 能看

T1

类似于字符串匹配的水题,下面是赛场的草稿

// 8:38 passed the big data
// 8:43 wrote down the solution

/*
5 1 4 2 3
1 6 3 2 4

我们考虑 n^2 做法

显然我们先断环成链, 那么我们此时要做的就是类似于滑动窗口,将a数组的第一位分别与b数组的第1-k位匹配,最后取最大值

这样做确实是n^2
那么对于没有在环中出现的点,我们贪心的让他们全匹配上即可

但是这样做效率过于低下
我们可以考虑对于每一位分别计算贡献

比如说,数字4在a中出现的位置为 p,b中为p1,p2
那么显然,当a的第一位与b中的(p1 - p + 1), (p2 - p + 1) 位匹配时有贡献
考虑直接桶数组统计即可
复杂度 O(n)
但是要注意我们还要把b数组反过来做一遍
 
*/

​

T2

也是大模拟上了,一眼不可做,直接跳过

T3

依旧是一眼dp板子,下面还是赛场思路

/*
一眼dp

首先考虑n^4的dp怎么做

设 f[i][j][k] 表示我们枚举到第i个朋友,还剩下j个货币,k个甜筒的最大受欢迎度
转移显然:f[i][j][k] = max (f[i - 1][j + c[i] - u][k + u * x[i]]) + fr[i].p
细节这里不再多说
9:03 实现一下 
9:12 ok

那么我们接下来考虑B = 0的性质分

好吧其实不用说,就相当于没有另一个限制
直接n^2dp秒

再往后走,考虑n^3怎么优化呢?
我们假设目前我们已经确定最后的答案集合,但是我们却还没有分配甜筒,那么我们怎么分配最优呢?
显然是一个贪心,我们每次找x最小的,尽可能放满即可
正确性显然

回归到我们的动态规划
我们可以先按x大小将朋友排序
f[i][j][k]依旧,但是我们的转移不用枚举u了
时间复杂度约为 O(n ^ 3 + n log n)

9:17 实现一下吧  \(^_^)/ 
9:31 passed the example

9:34 接下来打一下 B=0的性质分
9:47 ok

现在手里有75pts
考虑先看其它题,一会再回来死磕
 
10:50 回来死磕 
11:09 放弃 
*/

​

​ \(Sol:\)

​ 剩下最后一步没有退出来

​ 考虑答案一定是前面全用甜筒,中间一个交叉,后面全用银币,那么我们做两次dp, 剩下一个节点特判即可

posted @ 2025-10-23 21:17  Floyd_Hyacinth  阅读(20)  评论(0)    收藏  举报