退役前的做题记录4.0

退役前的做题记录4.0

最近主要在LOJ上写题

536. 「LibreOJ Round #6」花札

比较显然的二分图博弈模型,先手必胜当且仅当起始点一定在最大匹配中。连边可以对每种颜色以及数字建一个点优化到\(O(n)\),一定在最大匹配中的点就是源点不能到达的左侧的点。

556. 「Antileaf's Round」咱们去烧菜吧

生成函数大致就是一大堆\(1-x^v\)乘乘除除的形式,转成对数后根据\(\ln(1-x^v)=-\sum_{i=1}^{\infty}\frac{x^{vi}}{i}\),先\(O(n\ln n)\)地求出\(\ln F(x)\)\(\exp\)回来即可。

558. 「Antileaf's Round」我们的 CPU 遭到攻击

裸的\(LCT\)维护子树信息,在\(splay\)的每个点上维护“子树内(这里指原树的子树)所有黑点到这棵\(splay\)最左/右的点的距离之和”即可。注意\(reverse\)操作要交换左/右的答案。

2351. 「JOI 2018 Final」毒蛇越狱

存在一个复杂度\(O(2^{\#?})\)的做法:直接枚举\(?\)填什么即可。

存在一个复杂度\(O(2^{\#0})\)的做法:求超集和并对所有的\(0\)位置容斥。

存在一个复杂度\(O(2^{\#1})\)的做法:求子集和并对所有的\(1\)位置容斥。

发现\(\min(\#?,\#0,\#1)\le 6\),所以复杂度\(O(n2^n+q2^6)\)

2483. 「CEOI2017」Building Bridges

简单斜率优化。发现横坐标不单调怎么办?

不想写\(CDQ\),直接一发二进制分组美滋滋。

式子化出来相当于是要求\(\min\{kx_i+y_i\}\),可以理解为是最小化向量\((x_i,y_i)\)与向量\((k,1)\)的点积,而最小化点积的点一定在下凸壳上,所以维护下凸壳即可。

2496. 「AHOI / HNOI2018」毒瘤

暴力就是枚举每条非树边的状态(要么强制一者不选,要么强制前者选后者不选),\(O(2^{m-n+1}n)\)

发现很多转移都是重复的,所以可以对\(2(m-n+1)\)个点建虚树,并求出虚树上每条边分别对应的\(f_{v,0/1}\to f_{u,0/1}\)的转移系数。复杂度\(O(n+2^{m-n+1}(m-n+1))\)

2509. 「AHOI / HNOI2018」排列

序列中的最小值一定会在其父亲被选后立即被选,于是就可以与其父亲合并成一个大块。将最优化的式子划一划会发现只要优先选平均值最小的块就行了,于是用某个数据结构维护一下即可。

2512. 「BJOI2018」链上二次求和

考虑某个单点\(x\)上的权值\(v\)对答案数组的影响:初始斜率为\(v\),在\(x+1\)后斜率减\(v\),在\(n-x+2\)后斜率减\(v\),那么在\(1,x+1,n-x+2\)三处打上标记再做三次前缀和即可得到答案数组的区间和信息。现在单点变成了区间,相当于是变成了四阶差分。做四次前缀和后\(ans_r=\sum_{x=1}^r\frac{(r-x+1)(r-x+2)(r-x+3)}{6}d_x\),所以只要用树状数组维护\(\sum d_x,\sum d_xx,\sum d_xx^2,\sum d_xx^3\)即可。

2513. 「BJOI2018」治疗之雨

列出方程后发现每行在主对角线上只有一个非零位,于是直接自底向上大力高消就行了。

2525. 「HAOI2018」字串覆盖

之前看到这题以为删掉一个子串后前后拼起来可以继续删感觉不可做就弃了,结果今天回来一看发现。。。这是啥。。。

对于给定区间,一定是从前往后能删则删最优。

部分分提示地很明显了。当\(r-l\)足够大时,直接在给定区间内暴找所有的合法区间,最多不会超过\(\frac{n}{r-l+1}\)个。找的过程可以用主席树维护(下标,后缀排序名次)的二维点集,所以复杂度是\(O(q\frac{n}{r-l+1}\log n)\)的。

\(r-l\)较小时以上方法就不再适用了。但此时我们可以直接对每个长度预处理其后继,然后用倍增优化暴跳的过程,这里的复杂度是\(O((r-l)n\log n+q\log n)\)的。

两者结合即可。注意最好离线否则第二种方法的空间消耗将难以接受。

2572. 「ZJOI2017」字符串

一个结论是一个区间内可能成为最小后缀的后缀数量是\(O(\log n)\)的,证明是考虑两个可能后缀\(a,b\),若\(|b|<|a|<2|b|\),则\(a\)存在一个长度为\(|a|-|b|\)的周期,设\(a=TTc,b=Tc\)\(c\)\(T\)的一段前缀,可以发现此时\(b\)一定不会成为最小后缀(因为在这种情况下要么取\(TTc\)要么取\(c\)),因此相邻两个可能的最小后缀之间长度至少是\(2\)倍。

所以只需要用线段树维护一下区间可能成为答案的后缀位置即可。维护后缀排序可以直接二分+哈希,由于待修改,所以可以分块维护哈希数组,这样可以做到修改\(O(\sqrt n)\)查询\(O(1)\),这样总复杂度就是\(O(n\sqrt n+n\log^2n+m\sqrt n+m\log^3n)\)

2710. 「BalkanOI 2018 Day1」Election

离线以后右端点往右扫,维护一个栈式结构以保证所有后缀和大于等于\(0\)。具体方式是遇到一个\(-1\)就加入栈中,遇到一个\(1\)就将栈顶弹出。接下来就只需要考虑使前缀和大于等于\(0\),可以直接用线段树维护一下区间最小值,同时注意考虑在前一步中删去的一些\(-1\)对后一步操作的影响。

2712. 「BalkanOI 2018 Day1」Minmaxtree

对每条边求出它可以选择的权值范围,可以发现在上界与下界中选择其一一定不会更劣,所以问题就转化成了给每种权值找一条边使得所有权值都出现,直接二分图匹配\(O(n\sqrt n)\)就完事了。

至于怎么求权值范围,可以将权值排序后依次加入,这样每次操作就变成了“给路径上还没有染色的边染上一种颜色”,直接并查集维护即可。复杂度\(O(n\log n+n\alpha(n))\)

2803. 「CCC 2018」平衡树

这个\(dp\)式大致长成\(dp_n=\sum_{k=1}^ndp_{\lfloor\frac nk\rfloor}\)。直接把需要用到的\(O(\sqrt n)\)个位置拿出来在数论分块转移就行了。

2804. 「CCC 2018」最大战略储备

可以理解为一张\(n\times m\)的网格图,每条边可以合并两行/两列。所以还是按照边权排序依次加边,维护一下当前网格图还剩下多少行多少列就行了。

2834. 「JOISC 2018 Day 2」修行

相当于是要求有多少排列\(p\)满足\(p_i>p_{i+1}\)\(i\)的个数恰好为\(k-1\)

转化为求期望。这个期望等价于\(n\)\([0,1)\)随机变量\(a\)满足\(a_i>a_{i+1}\)\(i\)的个数恰好为\(k\)的概率,而这样的\(a\)又可以一一对应为\(n\)\([0,1)\)随机变量\(b\)的前缀和的小数部分,其中当\(a_i\le a_{i+1}\)时前缀和整数部分不变,否则整数部分\(+1\)

于是变成了求\(k-1\le\sum b_i<k\)的概率。

先把\(b_i\in[0,1)\)的限制容斥掉,然后就变成了求\(n\)\([0,+\infty)\)随机变量之和\(<k\)的概率。这个概率实际上等于\(\frac{k^n}{n!}\)

2840. 「JOISC 2018 Day 4」糖

链表模拟费用流,即每次选最大的,然后将其前驱后继删除,加入一个新的决策为:反悔当前决策,改为选择该点的前驱后继决策。注意这里的决策是递归定义的。

2879. 「JOISC 2014 Day3」JOIOJI

\(J=2,O=I=-1\)并做前缀和,这样一个区间的区间和为\(0\)就说明\(J\)的个数恰好是区间长度为\(\frac 13\)。做三个前缀和后找到三维全都相等的两个前缀相减就是答案。

2882. 「JOISC 2014 Day4」两个人的星座

两个不交的三角形一定存在恰好两条顶点之间的连线把它们分开,于是先枚举一个点,极角排序后再依次枚举第二个点,同时维护两点连线分隔开的两个半平面内三种颜色分别有多少个,这样便可以方便地求出答案。最终每对三角形会被算\(4\)次,所以答案除以\(4\)即可。

3010. 「JOI 2019 Final」勇者比太郎

怎么\(JOI\)还有这种送分题啊\(qwq\)

3011. 「JOI 2019 Final」画展

展出的画一定会放在若干个最大的画框里,所以考虑贪心,按美观度从大到小尝试放入当前的最大画框即可。

3012. 「JOI 2019 Final」有趣的家庭菜园 3

从前往后\(dp\),设\(f_{i,j,k,0/1/2}\)表示三种颜色分别放了\(i,j,k\)个且最后一个颜色为\(0/1/2\)的最小代价。转移枚举接下来放哪一种颜色,根据原序列中每种颜色的出现位置计算一下代价就行了。

6101. 「2017 山东二轮集训 Day1」第二题

建出笛卡尔树后可以发现每次的\(k\)块砖头必须放在一条直链上(即任意两点均存在祖孙关系),所以从每个叶子开始放就行了。

6105. 「2017 山东二轮集训 Day2」第三题

因为\(C_i\)无交所以直接看做点权,如果\(i\)\(A_i\)中的每个元素连边那么会连出一张\(DAG\)\(B_i\)实际上就是这张\(DAG\)\(i\)点所有支配点的点权之和加上自身,也就是其在支配树上的深度。所以直接维护支配树即可,由于查询的内容是链并,所以可以用\(LCT\)打标记以及链上二分的方式搞搞。

6140. 「2017 山东三轮集训 Day5」Dark

题面不知道在讲什么。令\(ans=\sum_{d|n}\frac{n!}{(d!)^{\frac nd}(\frac nd)!}\),要求的东西是\(m^{ans}\mod P\)。所以直接卢卡斯就好了。

6142. 「2017 山东三轮集训 Day6」A

如果\(n\)是奇数,那么\(\binom{2n}{n}\)种情况之间可以恰好一一对应,且对应的两种情况中偶数个数的奇偶性不同,所以答案除以\(2\)即可。

如果\(n\)是偶数,结论是当\(n\)\(4\)的倍数时答案为\(\frac{\binom{2n}{n}+\binom{n}{n/2}}{2}\),否则答案为\(\frac{\binom{2n}{n}-\binom{n}{n/2}}{2}\)

6144. 「2017 山东三轮集训 Day6」C

\(Xor\)可以打全局标记,然后在\(Trie\)树上走的时候就只需要根据标记判断方向即可。

\(And\ 1\)\(Or\ 0\)操作没有意义,\(And\ 0\)\(Or\ 1\)会使所有数在某一位上由不同变得相同,而这种“由不同变得相同”只有至多\(O(\log a_i)\)次,所以每次暴力重构就行了。

6146. 「2017 山东三轮集训 Day7」Normal

循环卷积+单位根反演。

设一个步长的生成函数为\(A(x)\),要求的相当于是\(\sum_{i=0}^T[k|i]\binom TiA(x)^i\),这里的乘法定义为循环卷积。显然答案等于\(\frac 1k\sum_{i=0}^{k-1}(1+\omega_k^iA(x))^T\)

由于\(n\)\(2\)的次幂,所以直接\(NTT\)就可以实现循环卷积。

6157. A ^ B Problem

直接\(dfs\)就行了。

6275. 棋盘

显然不能把\(k\)记到状态里去。如果定义当前局面的权值为\(连通块个数x^{\mbox{连通块个数}}\),那么就只要把\(\omega^0\)\(\omega^{k}\)代入再\(IDFT\)回来就可以得到答案了。

考虑怎么对于给定的某个\(\omega^i\),求所有局面的总权值之和。由于\(n\)很小所以可以对每列状压并记录连通性(同构的部分可以一起转移,在\(n=1\)时状态数为\(2\)\(n=2\)时为\(3\)\(n=3\)时为\(7\)),然后矩乘转移,复杂度大概就是\(O(nm7^3\log m+nm\log nm)\)

6300. 「CodePlus 2018 3 月赛」博弈论与概率统计

考虑在一张网格图上,从\((0,0)\)出发走到\((n,m)\),赢一局就向右走一格,输一局就向上走一格。可以发现一种方案的最终收益至于这条路线中\(y-x\)的最大值有关,当\(n\ge m\)时答案等于\(n-m+\frac{\sum_{i=0}^{m-1}\binom{n+m}{i}}{\binom{n+m}{m}}\),否则答案等于\(\frac{\sum_{i=m+1}^{n+m}\binom{n+m}{i}}{\binom{n+m}{m}}\)

所以问题在于怎么求\(\sum_{i=0}^m\binom{n}{i}\),即组合数前缀和。

\(f_{n,m}=\sum_{i=0}^m\binom ni\),首先由\(f_{n,m}\)可以很容易知道\(与f_{n,m-1}与\)\(f_{n,m+1}\)。然后我们有:\(f_{n+1,m}=\sum_{i=0}^m\binom{n+1}{i}=\sum_{i=0}^m\binom{n}{i}+\binom{n}{i-1}=2f_{n,m}-\binom{n}{m}\)

于是四个方向移动都可以\(O(1)\)实现,直接莫队即可做到\(O(n\sqrt n+T\sqrt n)\)

6338. 「SDWC2018 Day2」优秀

\(dp\)状态记录\(f_{i,j,k,l}\)表示加入了\(1-i\)共加了\(j\)个数,尚未满足相邻相差为\(1\)的数有\(k\)个(且这\(k\)必须都是\(i-1\)),排列的方案数为\(l\)的方案数,其中\(l\)的上界为\(k\)

转移时枚举当前数加多少个:至少\(k\)个,且若加\(x\)个相当于把\(x\)个球放入\(k\)个盒子里且每个盒子至少一个球的方案数,即\(\binom{x-1}{k-1}\)

复杂度看上去是\(O(n^5)\)的但是不满所以跑得很快,可能可以分析得到更低的复杂度。

6339. 「SDWC2018 Day2」线段

很显然可以对线段的\(2n\)个端点建立拓扑关系,然后就是要求最小字典序标号。

正确的姿势是倒着做,即反向建拓扑图,每次给入度为\(0\)的编号最大的点安排最大的标号。

6354. 「CodePlus 2018 4 月赛」最短路

异或操作只需要每一位连一条出边就行了,总边数\(O(n\log n+m)\)

6401. 字符串

求出每个本质不同串的最长合法长度\(val_u\),答案就是\(\sum\max(0,\min(len_u,val_u)-len_{fa_u})\)

6494. LJJ 的字符串

枚举\(i,j\)的差,类似NOI2016优秀的拆分那样可以连续一段的\(i,j\)一起计算贡献。不知道发生了什么反正我写的就是一个四阶差分。

posted @ 2019-02-28 17:35  租酥雨  阅读(1488)  评论(4编辑  收藏  举报