2019牛客暑期多校训练营(第四场)

A. meeting

solved by rdc 30 start, 38 AC -1(37 WA)

复盘 除了 BFS 起点 dis 设成 1 蠢了点之外,没什么问题。

做法 等价于求虚树的直径,两边 BFS 即可。


B. xor

解体 by rdc,148+eps start,卡了将近半场比赛

复盘

  • 意识到了问题等价于对两个线性基张成的线性空间求交。
  • 莽了一发,时间复杂度不合理的分治回答区间查询【尽量计算好复杂度再上机
  • 仿着HDU 多校1,1002 来。不想清楚具体该维护什么就开始送。
  • 送了之后开始胡乱调试。
  • 彻底解体!

题解

  • 线段树节点表示区间内,线性基交。
  • 查询可以分成 log 个线段树节点,对每个节点查询 x 即可。
  • 比赛的总想着查询的时候要进行 log 次线性基合并

C. sequence

solved by F0_0H, 60 start, 148 AC (-4 78 RE,79 MLE,124,135 WA)

题意 给定a,b序列,最大化a序列区间最小值b序列区间和的乘积

题解

  • 枚举a序列最小值,单调队列预处理左右边界的限制
  • 根据a的正负性,查询b序列区间最小值和区间最大值即可

本以为是一道被出烂的原题,没想到还有O(n)的做法,强


D. triples I

solved by rdc,85 start,140 AC(-3 97 TLE, 111,130 WA)

复盘 首先 111 交的还是求 xor 的版本。手算样例!手算样例!手算样例!。其实出成 xor 这是个更好玩的题目。

做法

  • 考虑到一个数二进制表示,在奇数位上的 1 和在偶数位上的 1,对答案的贡献。
  • 输入是 3 的倍数,1 个元素就 win 了。
  • 不是 3 的倍数
    • 奇数为有 1,偶数位有 1。(|S|=2),构造方式为,先令 (x=0,y=a),搬运一个奇数为上的 1 或者偶数位上的 1 到 (x),那么一定可以使得 (y \% 3=0),我们再在 (x) 选择一个合法的为 0 的数位设为 1 使得 (x\%3=0) 即可。
    • 只有奇数位有 1,或,只有偶数位有 1,且至少有 3 个 1。(|S|=2),构造类似。
    • 否则解体。

E. triples II

solved by F0_0H 192 start, 214 AC(212 WA)

题意 n个三的倍数的数,or起来得到a的方案数

题解

  • 基本容斥
  • 设x为a奇数位为1的个数,y为a偶数位为1的个数
  • (ans = sum_{0leq ileq x, 0leq jleq y}pow(f[x-i][y-j], n)*C(x,i)*C(y,j)*sign(i+j))
  • (f[i][j]) 表示奇数位1有i个,偶数位1有j,能凑成a的方案数
  • $sign(x) = $ x&1 ? -1 : 1

I. string

solved by sdcgvhgj, 38 start 68 AC -2(52,57 TLE)

题意 求不同的子串个数,反过来相同也算相同
做法

  • PAM求出不同回文串个数a,正反串建广义SAM求不同的正反子串个数b,答案为(b-a)/2+a
  • TLE两发因为数组只开了两倍,其实因为还有反串应该开四倍

数组需要开到 x 倍的时候小心一点【例如:线段树常见的写法是 4 倍,manacher 两倍,前向星存无向边两倍】


J. free

solved by F0_0H 18 start, 29 AC

题意 求s,t最短路,可将k条边权值置零

题解 标准变形最短路问题

  • (dis[i][j]) 表示(s->i)消去了(j)条边的最短路
  • dij跑最短路即可

K. number

solved by rdc 5 start 16 AC

复盘 基本的前缀和差分,在边界(长度为 0 的前缀)犹豫了,导致耽误不少时间。


原文地址:https://www.cnblogs.com/FST-stay-night/p/11256539.html