#6 2023.11.26

发布时间 2023-12-01 15:50:45作者: ZSH_ZSH

395. arc140d One to One

原图是基环树森林。先把已知的边连上,会变成若干个基环树和若干个内向树。我们对环的期望数量计数。

对于基环树,贡献显然为 1。

对于内向树,我们枚举大小的有序序列 \(v_1 ,.. ,v_k\),贡献是 \({1 \over k}\prod {v_i \over n}\)

分治 NTT 算即可。

396. arc140e Not Equal Rectangle

对于质数 \(B\),可以构造大小为 \((B \times B) \times (B \times B)\) 的矩阵。

\(a_{i,j} = (i + j + (i/B)\times(j/B)) \bmod B\)

不知道为啥是对的,反正是对的。

397. arc139c One Three Nine

398. arc139e Wazir

399. uoj818 【NOI2023】贸易

400. uoj819 【NOI2023】字符串

\(s_i\) 是从 \(i\) 开始的后缀,\(p_i\) 是以 \(i\) 结尾的后缀。

先把答案加上所有 \(j \in [1,l],s_i < p_{i+2j-1}\)

考虑有什么东西多算了,发现是 \(s_i < p_{i+2j-1}\)\([i,i+2j-1]\) 是回文串。这个条件等价于 \([i,i+2j-1]\) 是回文串且 \(s_{i+2j} < p_{i-1}\)。因为是回文串,假设 \([i,i+2j-1]\) 可以扩展到 \([x,y]\),条件等价于 \(s_{y+1} < p_{x-1}\)。枚举 \([mid,mid+1]\) 作为回文串中心,设 \([mid,mid+1]\) 可以扩展到 \([x,y]\),则会对 \(i \in [x,mid],i+j = 2mid+1\) 的串产生贡献。扫描线即可。

401. uoj820 【NOI2023】合并书本

答案是若干磨损值加上每本书的贡献系数乘上每本书的权值。所以只需要求出贡献系数集合和对应的磨损值。

考虑把操作树分层,每个点尽量往深了塞,这样磨损值。枚举新分裂的儿子数量,发现新的磨损值只跟原磨损值和当前点数有关,所以不用管当前层数。而新的贡献系数状态可以贪心求出。同时注意到每一层分裂的点数一定单调不降。对于贡献系数集合 \(S\),设磨损值为 \(v\),上一次分裂了 \(m\) 个点。则 \((v_1,m_1),(v_2,m_2)\) 状态可以合并为 \((min(v_1,v_2),min(m_1,m_2))\)

对太离谱的磨损值进行剪枝,进行爆搜发现 \(n = 100\) 时只有 \(< 2000\) 个状态。

402. uoj817 【NOI2023】深搜

403. uoj800 【统一省选2023】城市建造

CNOI 滚出中国!

404. uoj616 【JOISC2021】古老的机器

你 LOJ 咕了 /tx。

考虑最优策略怎么做。找到第一个 \(x\),然后找到这个 \(x\) 后面的第一个 \(z\)。把他们之间的数倒序删空,然后把 \(z\) 删了。注意到相邻 \(z\) 没用,所以这里找的实际上是第一个 \(z\) 连续段的最后一个 \(z\)

于是把 \(x\) 和若干 \(z\) 看作关键位置,只需要传关键位置就行了,并且至多只有两个关键位置相邻。可以使用分段+fib。

405. loj3495 「JOISC 2021 Day3」聚会 2

发现只需要计算偶数的答案。对于一对 \((u,v)\),他会给 \(\leq 2\min(size_u,size_v)\) 的答案贡献 \(dis(u,v) + 1\)

当场点分治,然后扔进桶里,就是一个 \(\log\) 的。

406. loj3494 「JOISC 2021 Day3」保镖

考虑把时间那维也带上,移动就变成了斜线。发现斜线很不爽,不如旋转一下坐标轴。

现在就转化成二维网格往下往右走路,每条边有边权。

预处理出 \(dp_{i,j}\) 表示已经到了 \((i,j)\) 的点之后能获得的最大权值,可以随便预处理。

然后对于一个保镖,要么一直往右走,走到某一竖之后往下。要么一直往下走,走到某一横之后往右。暴力枚举即可。如果过不去的话就套个李超树之类的。

407. loj3498 「JOISC 2021 Day4」最差记者 4

大概就是 \(f_{u,i}\) 表示 \(u\) 子树里的点全都 \(\leq i\) 的最小代价。

然后是一个前缀 min,树上部分可以直接线段树合并。

环上就把若干个线段树拼起来,是一个区间 min。

408. xsy5294 汇聚(gathering)

考虑对于一个点 \(u\) ,子树内点集是 \(S_1,...,S_k\)。枚举 \(S_i\) 是区间 \([l,r]\) 的最后一个点,\(u\) 会对 \(l \leq S_i \leq r < S_{i+1}\) 的区间有贡献。特判 \(i =k\)

使用线段树合并求出每一对贡献,总共有 \(O(n \log n)\) 对本质不同的贡献。

后面是个二维数点,用分块平衡一下即可。

409. xsy5288 01 SAM 点数和问题(01sam)

410. xsy5293 括号(brackets)

411. arc138d Differ by K bits

\(k\) 为偶数或者等于 \(n\) 显然无解。找出一组由 \(popcount = k\) 的元素构成的基,然后套格雷码。

412. arc138e Decreasing Subsequence

413. arc138f KD Tree

\(f(l,r,u,d)\) 表示坐标在这个区间的点能构成多少个区间。

我们只统计字典序最小的方案,定义字典序是把区间内坐标离散化之后, \(x_1 < y_1 < ... < x_i < y_i < x_{i+1} < y_{i+1}\)

\(fx\)\(f_y\) 辅助转移。枚举第一个操作,再容斥掉字典序更小的操作。

414. loj3001 「JOISC 2015 Day 3」AAQQZ

首先将答案与每个字符出现次数取 max。接下来只需要考虑由至少两种字符组成的回文串的贡献。

容易发现,排序的区间一定和回文区间有交。在答案区间左半侧有交的情况可以通过中心对称转化为在答案区间右半侧有交的情况。

记 [] 表示回文区间,() 表示排序区间,| 表示回文中点。

case 1 : [...|...(...]) 或 [...|...(...)...]

枚举回文中点 \(mid\),令 \([l,r]\) 是以 \(mid\) 为中心的最长回文串,则排序区间的左端点一定是 \(r+1\)

找到以 \(l-1\) 结尾的极长单调不降段的开头 \(x\)。枚举排序区间右端点 \(i\),问题变为求 \([r+1,i]\) 的字符集与 \([x,l-1]\) 的字符集的匹配长度。

两个集合 \(S,T\) 的匹配可以这样定义:初始有变量 \(i=0\),匹配长度 \(len = 0\)

  • \(i > maxelement(S,T)\),匹配终止。

  • \(cntS_i = cntT_i\),则 \(len \leftarrow len + cntS_i,i \leftarrow i+1\),匹配继续。

  • \(cntS_i \neq cntT_i\),则 \(len \leftarrow len + min(cntS_i,cntT_i)\),匹配终止。

预处理出 \([x,l-1]\)\(cntS\),枚举到 \(i\) 时,先让 \(cntT_{s_i} \leftarrow cntT_{s_i} + 1\)。若 \(cntT_{s_i} > cntS_{s_i}\),就把 \(S\) 集合里大于 \(s_i\) 的数都扔了。否则更新当前匹配长度。

这样就解决了 [...|...(...]) 的情况。对于 [...|...(...)...] 的情况,发现此时匹配长度等于 \(i - r\),那么再加上 \(lcp(pre_{l-1-(i-r)},suf_{i + 1})\) 的贡献即可。

case2 : [...(...|...]) 或 [...(...|...)...]

记回文串中心字符为 \(c\),回文串中心 \(c\) 连续段的左端点是 \(l\)。则排序区间的左端点一定是 \(l\)。找到以 \(l-1\) 结尾的极长单调不降段的开头 \(x\)

枚举排序区间右端点 \(i\),显然 \([l,i]\) 中不能出现小于 \(c\) 的字符,则可以转化为求 \([l,i]\) 的字符集去掉所有 \(c\) 之后和 \([x,l-1]\) 的字符集的匹配长度。

注意到 \(c\) 一定是 \(l-1\) 右侧第一个小于 \(s_{l-1}\) 的字符,枚举 \(l-1\) 进行计算即可。

415. cf1534g A New Beginning

想找个几何题,怎么不是很几何 /ll。

注意到对于一个确定路径,最优秀的方案是作一条斜率 -1 的经过这个点的线,然后在交点执行操作。

然后大力 dp,发现可以 slope trick。

怎么又不是几何 /fn。

显然每个工厂的产出速率单调增。按照速率排序,然后是个单调队列。

417. cf611g New Year and Cake

双指针求出 $i $ 到哪个点超过了面积的一半,所以两边的系数是确定的。

双指针只需要移动一个端点,所以维护信息是容易的。

418. cf776f Sherlock's bet to Moriarty

史。

把有相邻边的连通块连边,发现是个树。就变成树上染颜色了,这个点分治随便做。