牛客赛前集训营提高组(第一场)ita

pts:25 + 20 + 0 + 30 = 75

最惨淡的一场。

出现的最大问题是脑子掉线。。。。

今后考试策略:

拿到题先读完所有的题,然后把所有能写的暴力全敲完之后再来想正解。

考试一定要带脑子 !!!

题目描述

给出三个整数 \({x,y,P(1\le x,y<P)}\), \({P}\) 为素数,可以重复对 \({x}\) 执行如下操作:选择一个整数 \({z\in[1,P-1]}\) ,花费 \({|x-z|}\) 的牛币,使得 \(x=x\times z\bmod P\)。

最小需要花费多少牛币才能使得 \({x=y}\) ?

设 \({ans(i,j)}\) 为当 \({x=i,y=j}\) 时的答案,为了减少输出,你需要输出

\({\sum\limits_{i=1}^{P-1}\sum\limits_{j=1}^{P-1}ans(i,j)*t^{(i-1)*(P-1)+j-1}\bmod 998244353}\)

数据范围

\(2 \leq P \leq 2000\)

考试的时候真没忘建图那方面想,然后就草草打了个暴力走人了。

solution

对于每一个操作,相当于从 \(x\) 向 \(x * z \mod P\) 建一条边权为 \(|x - z|\) 的边,然后到 \(y\) 跑一个最短路就好了。

30pts

当 \(P \leq 500\) 直接 \(Floyed\) 就好了。

但由于数据水或者牛客神机太快了,这玩意赛时能过 \(85\) ,现在加强了数据,但是还能过 \(75\) 分,就挺反人类行为的 = =

code

题目描述

有 \(n + 2\) 个整数 \(a_0, a_1, \dots, a_n, a_{n + 1}\)

你需要做确切地 \(n\) 次操作,每次操作以下形式:

选择一个整数 \(x\) 满足 \(a_x \neq 0\), 使得 \(a_x\), 令 \(l = \max_{i < x, a_i = 0}(i), r = \min_{i > x, a_i = 0}(i)\)

此次操作的操作为 \(\max\{a_l, a_{l + 1}, \dots, a_{x - 1}\} + \max\{a_{x + 1},\dots, a_{r - 1}, a_r\}\) 牛币

有多少不同的操作方式使得操作花费的牛币最少,两种操作不同当且仅当两种操作的操作序列不同。答案对 \({998244353}\) 取模。

数据范围

\(1 \leq T \leq 10\), 每个测试点 \(|n|\) 的和 \(\leq 10000000\)

solution

这道题我的 n! 过掉了 \(n = 20\) 的数据就挺反人类的 = =

这道题 \(n^3\) 能过也挺反人类的 = =。

正解是个卡常。。。。

10pts

枚举全排列就好了。

20pts

状态压缩,计算代价,对比代价,得出答案。

70pts(实测 90)

设第一个操作的人的编号为 \(x\), 在 \(x\) 进行操作 \([1,x−1]\) 和 \({[x+1,n]}\) 的操作就独立了,这两段区间进行操作不会对另一段区间的价值产生影响,因此可以进行区间 \({dp}\)。

设 \(f_{l, r}\) 表示对 \(l, r\) 区间进行操作的最小代价。

显然 \(f_{l, r} = \min\{f_{l, k - 1} + f_{k + 1, r}\}\)

设 \(g_{l, r}\) 为 \([l, r]\) 区间内最小操作的序列数量,枚举断点 \(k\)。

显然只有当 \(f_{l, r} = f_{l, k - 1} + f_{k +1, r}\) 才可以转移。

\(g_{l, r} = g_{l, r} + g_{l, k - 1} \times g_{k +1, r} \times C_{r - l}^{k - l}\)

因为两个序列之间的操作顺序先后都可,所以就有 \(C_{r - l}^{k - l}\) 种方案。

复杂度: \(n^3\)

code

100pts

实际上每次先操作区间最大值是最优的,因此没有必要对区间的所有数都进行枚举,而只枚举区间最大值,时间复杂度 \(O(n^3)\)

code

100pts

对于一段区间 \([l,r]\),如果存在 \({a_i=a_{i+1}=\max\limits_{i=l}^r(a_i)(i\in[l,r))}\)

此时 \(i, i + 1\) 谁先选择没有关系,因此有 \(g_{l, r} = g_{l, i - 1} \times g_{i + 1, r} \times C_{r - l + 1}^{i - l + 1}\)

因此当碰到两个最大值连续出现时,直接将整个区间划分为两段,最大值不连续则仍然枚举所有最大值。时间复杂度 \(O(n^3)\)

定义无穷序列 \({f:f_1=1,f_{n}=f_{n-1}*2+1}\)

定义函数 \({G(x)=\min\limits_{f_i\ge x}(f_i})\) \({dp_{c,0}=0,dp_{c,i}=max(dp_{c,i-1},[((i*c)\&G(i))==i]*i)}\)

其中 \({[p]}\) 为真值函数,当 \({p}\) 为真返回 \({1}\),否则返回 \({0}\)。

求 \({\sum\limits_{i=0}^ndp_{c,i}}\bmod 998244353\)

数据范围

\(1 \leq T \leq 10\) 每个测试点 \(|n|\) 的和 \(\leq 10000000\)

solution

20pts

直接模拟题意就好。

100pts

设 \(G(i) = 2^{t + 1} - 1\) (\(G(x)\)必然是这样的形式,其中 \(t\) 为 \(i\) 二进制的最高位),则 \(x \& G(i)\) 相当于 \(x\mod 2^{t + 1}\),则:\((i\times c) \& G(i) = i \rightarrow (i \times c) \mod 2^{t + 1} = i \rightarrow i \times (c - 1) \mod 2^{t + 1} = 0\)

设 \(c - 1 = 2^p \times x\),则 \(i\) 需要含有因子 \(2^{t + 1 - p}\)。

设 \(m = |n|\),我们可以枚举 \(t\), 如果 \(t < m - 1\) 则 \([2^t, 2^{t + 1} - 1]\) 内的所有数最高位都为 \(t\),设 \(g = t + 1 - p\), \(i\) 含有因子 \(2^g\) 即 \(i\) 的低于 \(g\) 位的全为 \(0\),这样的数为 \(2^t, 2^t + 2^g, \dots, 2^t + x\times 2^g(2^t + (x + 1)\times 2^g = 2^{t + 1})\), 这是个 \(x + 1\) 项的等差数列,很容易求和,同时每个数对答案贡献了 \(2^g\) 次。

当 \(t = m - 1\) 时,由于 \(2^{t + 1} > n\), 我们需要满足,\(2^t + x\times 2^g \leq n \rightarrow x = \lfloor \frac{n}{2^g}\rfloor - 2^{t - g}\),对这个 \(x + 1\) 项的等差数列计算贡献后,由于最后一项被计数了 \(2^g\) 次(计数范围为\([2^t + x\times 2^g, 2^t + (x + 1)\times 2^g - 1]\)),此时多计数了 \(2^t + (x + 1) \times 2^g - 1 - n\) 次,把这个贡献减掉就好了。

code

100pts

题目描述

给出 \({n}\) 行 \({m}\) 列的矩阵,第 \({i}\) 行第 \({j}\) 列的元素为 \({a_{i,j}}\) ,找出满足以下条件的三元组{(i,j,x)}(i,j,x)的数量:

数据范围

\(1 \leq k \leq n\times m, 1 \leq a[i]\leq 100\)

solution

用 \(bitset\) 记录颜色种类。

在边长扩展的过程中,不同数量的数只会增加不会减少,具有单调性。于是可以二分找到不同数量 \({<k}\) 的最大边长 \({x}\) 和不同数量 \({\le k}\) 的最大边长 \({y}\),\({y-x}\) 即为固定一个左上角符合条件的正方形的数量。

这样需要处理 \({O(n^2logn)}\) 个查询,每个查询查询一个正方形内不同颜色的数量,由于是正方形,故可以采用二维 \({st}\) 表来做。

THE END
0.2022牛客OI赛前集训营观察题目性质,可以发现,经过若干次操作后得到的结果一定是一个关于xx的分段函数,图像分为三段,且第一段和第三段斜率为0,中间斜率为1。那么只需要简单地记下拐点的坐标就可以表示这个函数。 简单分类讨论一下,可以线性处理出我们要的分段函数。 那么就很简单了,分BB块维护分段函数,每次修改暴力重构整个块,查询遍历每jvzquC41yy}/ewgnqiy/exr1FEN35<4r13<87@;360nuou
1.2024牛客OI赛前集训营提高组(第一场)查询只需要找到第一个 的位置,从这个位置可以走 边权到达 。 fib 树上博弈 问题可以看作每次删一条边 ,保留根节点所在的连通块,删不了边的一方输。 我们先用 Grundy Number 判断当前局面的胜负。定义 为以节点 为根的子树的 Grundy Number。如果 jvzquC41yy}/px|eqfks0lto1fote~xu18=3495223>:3?8;4;<
2.2023牛客OI赛前集训营提高组(第二场)2023牛客OI赛前集训营-提高组(第二场) T1 题意,给定正整数nnn,计算nnn个元素的集合1,2,⋯ ,n{1,2,\cdots,n}1,2,⋯,n,求所有非空子集和的乘积取模998244353998244353998244353后的结果。 其中1≤n≤2001\le n \le2001≤n≤200 首先,该集合的非空子集有2n−12^n-12n−1个,但子集和的最jvzquC41dnuh0lxfp0tfv8vsa8878A5331gsvrhng1jfvjnnu1745A525:7
3.提高级T3牛牛的凑数游戏2020牛客noip赛前集训营很容易发现对于一个区间,我们将其排序后,如果前iii个数之和+1小于第i+1i+1i+1个数,那么前iii个数之和+1是一定无法构造出来的,于是,我们就要找到第一个前缀和+1不存在的数。 很明显,如果用暴力的话,是明显会T掉的,只能拿30pts。 考虑如果当前前缀和为sumsumsum时,所有的小于sumsumsum的数都可以用来更新jvzquC41dnuh0lxfp0tfv8pmmui15:81ctzjeuj1fgzbkux134=36:562
4.牛客CSPS提高组赛前集训营4赛后总结TaylorSwift13牛客CSP-S提高组赛前集训营4 赛后总结 复读数组 分成3 种区间算答案: 一个块内的区间 两个块交界处,长度小于块长的区间 长度不小于块长的区间 对于第三种区间,容易发现每个区间的权值一样,只需要算出个数即可. 对于前两种空间,我的思路是:对于一个重复出现的元素,记第一次出现的这个元素贡献权值,然后讨论jvzquC41yy}/ewgnqiy/exr1Vcmq{Xykhz258u133>2;9=60jznn
5.牛客练习赛51D羊吃草腾讯云开发者社区牛客练习赛51的D题羊吃草是什么类型的题目? 如何解决牛客练习赛51中D题羊吃草的问题? 牛客练习赛51 D题羊吃草的解题思路是什么? 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/qq_41603898/article/details/100593523 建图jvzquC41yy}/eutwf0zfpljpv0ipo8igxgrprnw1ctzjeuj137693@9
6.比赛总结——牛客网NOIP赛前集训营提高组模拟第一场比赛总结——牛客网 NOIP赛前集训营提高组模拟第一场 第一场打的很惨淡啊 t1二分+前缀最小值没想出来,20分的暴力也挂了,只有10分 t2数位dp,调了半天,结果因为忘了判0的特殊情况WA了一个点,亏死 t3emmmm.. 不会 imone说是DSU on tree的裸题 然后打了半个小时,A了qwq 题解回头再补jvzquC41yy}/ewgnqiy/exr1ftkbixso1r5:8::8494ivvq
7.2020牛客NOIP赛前集训营提高组(第三场)C本文详细介绍了如何使用树剖和线段树解决区间最值问题,并针对状态扩散进行优化。作者指出,树剖时只需一棵线段树即可,关键在于保证链上点的连续性。文章通过实例解析了如何处理祖先和后代方向的最值,并展示了区间修改和单点查询的操作。最后,讨论了初始化和清空操作的实现。 jvzquC41dnuh0lxfp0tfv8|gkzooa=8;82:268ftvkimg8igvcomu862;4:95?>