纪中国庆集训 简要题解

30 篇文章 1 订阅
23 篇文章 0 订阅

QaQ主要是因为题目太难写不动blog一直在调程序……所以只好先口胡一波题解
A组10/5
T1:
题意 找 k k k次连续的"23",每次若"2"的位置为奇数则将其变为"22",反之为"23",求最后串变成了什么
题解 我们会发现实际上只有两种循环节"223"和"233",且要求开头再奇数位,其他的消掉之后不会再产生太多……于是只要不断维护下一个就好了 可以用一个指针直接维护,看情况前移后移,可以发现还是线性的。也可以维护一个链表维护下有序序列,不过太麻烦了?
T3:

A组10/6
T1:
题意 设 f ( i ) f(i) f(i)表示不大于 i i i的数中与 i i i互质的数的平均数,求 ∑ i = L R f ( i ) k \sum_{i=L}^Rf(i)^k i=LRf(i)k 模某经典质数
题解 首先由于 ( x , y ) = 1 ⇒ ( x , x − y ) = 1 (x,y)=1\Rightarrow(x,x-y)=1 (x,y)=1(x,xy)=1,那么我们可以发现其实 f ( i ) = i f(i)=i f(i)=i
于是这题就变成自然数幂和的裸题辣 有好多经典做法 某次CF的EduRound还出过一次E(好像是10左右吧)
由于我们可以证明自然数幂和是有 k + 1 k+1 k+1次的通项的,所以我们只要爆算到 k + 2 k+2 k+2的自然数幂和然后用拉格朗日插值就可以搞出这题了。本质上来说,就是高斯消元爆解,但是拉格朗日插值法无疑更加简单。
既然是插值法,那就是构造下函数使得函数过 k + 2 k+2 k+2个点,那么我们只要考虑对于 x = i x=i x=i,让除了包含当前应该有的 y i y_i yi外的项都来一个 ( x − i ) (x-i) (xi)消掉,然后有 y i y_i yi的那一项只需要让系数为1,然后考虑到其他 x ≠ i x\neq i x=i的情况只需要除掉 ∏ j = 1 , j ≠ i k + 2 ( j − i ) \prod_{j=1,j\neq i}^{k+2}(j-i) j=1,j=ik+2(ji)就好了 然后显然是对的。
我用的其实是斯特林数 懒得讲辣
这题还可以用差分表搞出来 等我看完FuLan大爷的博客再来填坑……

T3:
题意:先给出一些字符串 然后动态加进去字符串和查询一些字符串的公共后缀长度
题解:竟然没看出有Trie的动态做法我是不是傻了……
(第一眼:离线把串拼在一起!SA!
过了一会:诶好像还能Hash?算了不管了
考试后:哇哇哇还能Trie动态做……)
先不考虑动态加串 倒着加字符串然后丢Trie里 乱跑LCA
然后再考虑加了串之后怎么继续维护LCA
我们发现给新加的点稍微维护下向上倍增的数组就好了 于是几乎不用加代码
当然离线之后树剖和Tarjan都行(树剖LCA代码好短啊)
顺便%一发某个Splay维护DFS序列的Dalao?
A组 10/7
T1:
题意 给出一个DAG,开头结尾外点数每层为k,可以将相邻两层之间的边翻过来交换连接,问使得最终路径条数为偶数的方案数 模某经典质数
题解 状压DP,因为只需考虑奇偶性,所以用01考虑 k ≤ 10 k\leq10 k10所以直接压进去,另外记下当前搞的是从上往下第几个,然后考虑对一个状态把可产生的状态先用二进制打出来奇偶性,转移的时候直接做,然后用lowbit优化下转移(只转移为 1 1 1的),先翻过来和不翻的都做一遍就好了

T2:
题意 给出n+1个集合(n是偶数),每个集合有2n个数,用一种神奇的方式给出每个数的存在性(64进制???),然后要求找到一对集合使得交大小不小于 n 2 \frac{n}{2} 2n
(吐槽) 暴力出奇迹!暴力踩标程!(误)@Snakes用标程给的方法130+ms然后暴力1ms!
我是用bitset硬上的因为比较好写,然后现在还是最短代码 另外这题原本有一个"NO Solution"然而事实证明不存在这种情况(所以没用?)
题解 反正暴力可过,我们就只来解释下为何暴力可过吧 正解其实是随机n对判断……不过好像比较慢
我们先定义一个期望,为两两集合交大小的平均(就是随机选两个集合交的大小),同时还是按照二进制我们设一个 c i c_i ci,表示第 i i i位上有几个是1,因为每个都是大小为 n n n的子集,于是 ∑ i = 1 2 n c i = n ( n + 1 ) \sum_{i=1}^{2n} c_i=n(n+1) i=12nci=n(n+1)
然后我们发现对于其中第 i i i位选的总数是 C ( n − 1 , 2 ) = O ( n 2 ) \text C(n-1,2)=\text O(n^2) C(n1,2)=O(n2),能够恰好交起来方案数 C ( c i , 2 ) = O ( c i 2 ) \text C(c_i,2)=\text O(c_i^2) C(ci,2)=O(ci2),那么这里总的期望就是 ∑ i = 1 2 n C ( c i , 2 ) C ( n − 1 , 2 ) = O ( ∑ i = 1 2 n c i 2 n 2 ) \sum_{i=1}^{2n}\frac{\text C(c_i,2)}{\text C(n-1,2)}=\text O(\frac{\sum_{i=1}^{2n}c_i^2}{n^2}) i=12nC(n1,2)C(ci,2)=O(n2i=12nci2)。由均值不等式中 Q n ≥ A n Q_n\geq A_n QnAn,即 ∑ i = 1 2 n c i 2 n ≥ ∑ i = 1 2 n c i n = O ( n ) \sqrt{\frac{\sum_{i=1}^{2n}c_i^2}{n}}\geq\frac{\sum_{i=1}^{2n}c_i}{n}=\text O(n) ni=12nci2 ni=12nci=O(n)
两边平方之后再除就可以得到那个期望就是 O ( n ) \text O(n) O(n)的了(实际上,猜一下由对称性都知道是等的时候取极值)
那么在这里期望就有 O ( n ) \text O(n) O(n)个了,精确值应该是 n − 1 2 \frac{n-1}{2} 2n1,如果平均值到 n n n,那就显然有满足条件的。由上面的推理我们已经得出不会没解了,所以这里需要大一个常数,如果要补上这个常数需要至少 O ( n ) \text O(n) O(n)个集合之间有 n 2 \frac{n}{2} 2n规模的交,也就是说,这样的对数不只有,还挺多的……
所以完全可以暴力做(暴力还挺快的)。
T3:
题意 在一棵树上选最少的点使得每个选定的点能在经过 k k k条边后到达的所有点中选出一个大小为 s s s的点集,使得所有点集的并集为整棵树的点
题解 强行贪心一波 我们会发现我们应该尽可能用完这 k k k的长度,因为可以涉及到的点是最多的 同时我们应该选尽量深的点 因为选其他的不会更劣
然后我们设 F ( x , k ) F(x,k) F(x,k)表示 x x x下面距离为 k k k的多余覆盖点的个数(就是子树里面选定的点往上还可以延伸的点的个数), G ( x , k ) G(x,k) G(x,k)表示 x x x下面距离为 k k k的还需要被覆盖的点的个数。接着我们先考虑用 F ( s o n ( x ) , k − 1 ) F(son(x),k-1) F(son(x),k1)转移到 F ( x , k ) F(x,k) F(x,k) G G G一样),接着考虑下二者间的差距, F ( x , k ′ ) F(x,k') F(x,k) G ( x , k − k ′ ) G(x,k-k') G(x,kk)互相填一下,然后利用除以 s s s的公式直接求好要多多少点,最后再把答案更新一下就好了
这样说好像不太清楚,不如看程序:http://paste.ubuntu.com/25692676/
剩下的先留着坑

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值