随笔分类 - 题目来源-Codeforces
摘要:设dp(i)表示i棵树必胜的方案数(第一棵树的根可以任意,所有根的方案数加起来)。转移时在前面添加一棵树。枚举添加的这棵树的根。发现系数之和可以预处理出来。不过对每个根都预处理一次,复杂度就是n^2了,所以要换根。求出系数之后,用矩阵快速幂优化这个DP即可。
阅读全文
摘要:细品题意,可以把问题转化为,在一张DAG上,按编号从小到大依次标记每个节点。在标记节点 i 时,判断是否存在一个【能到达 i 的】或【i 能到达的】节点已被标记。在过程中维护是不好做的。但可以在拓扑排序时递推出,能到达每个节点的最小标号。
阅读全文
摘要:如果已经知道结果串t,考虑s能不能得到t,可以做一个贪心“匹配”。知道这个贪心的策略后,考虑本题要计算所有t的数量,那么可以DP。设dp[i]表示有多少t能贪心匹配到s的前i位。转移时考虑t的下一位是1还是0即可。
阅读全文
摘要:区间DP。dp[i][j]表示只考虑被[i,j]完全包含的区间,能达到的最大价值。转移时枚举一个k(i<=k<=j),表示把1尽可能集中到第k列。设所有跨过k,且被[i,j]完全包含的区间数量为cnt(k),则新增的贡献就是cnt(k)^2。
阅读全文
摘要:如果只有一次询问,可以分治,每次考虑跨过中点的情况。预处理左半边后缀or和,右半边前缀or和,然后用two pointers求。发现前、后缀or和只会变化O(log a)次。用线段树维护,记录每个区间的答案,以及前、后缀or和(这O(log a)个段)。push_up和查询时,还用two pointers的方法合并左右区间。
阅读全文
摘要:先考虑一个排列的情况。从边界入手,先把a[n]搞成n,同时要保证前面的数,相对大小关系不变。可以依次交换(pos[a[n]+1],n), (pos[a[n]+2],n),...,(pos[n],n)。完成这一轮操作后,转化为一个规模减1的子问题,继续做即可。当不是一个排列时,对相同的数,我们强行令位置小的数更小,这样可以把原序列转化为一个排列,且逆序对不变。
阅读全文
摘要:4步以内,先手总能获胜。可以用逆推的思路来构造。
阅读全文
摘要:发现,球会滚到大于号和小于号中间形成的“坑”里。用线段树维护区间信息:最前面的一个坑,最后面的一个坑,已经中间的坑里最大的大小。合并区间时大力分类讨论。为了支持反转,我们可以在一开始建线段树的时候,就处理好“反转前”和“反转后”两套信息。当需要把一个区间反转时,就把这两套信息交换一下即可。
阅读全文
摘要:D是贪心。难点在于把树的形态和生成方法搞明白。E也是贪心,思路是从边界入手,考虑什么人能被放到最后,然后把这些删掉,继续考虑即可。F是个博弈题,而且是多轮游戏,这比较特别,但处理的方法也是个套路,算是学到了。重点还是在于搞清楚单轮游戏,什么情况下能赢,什么情况下能输。需要仔细的分析。
阅读全文
摘要:集合内两两距离小于等于x,等价于集合里深度最大的点,到所有其他点距离均小于等于x。把所有点按深度排序。依次枚举一个点作为深度最大的点,然后将它标记。我们每次要求所有已标记的点中到当前点距离小于等于x的点的数量。可以用点分树+树状数组统计。统计出这个后,做一遍FFT求出答案
阅读全文
摘要:先将整个串划分为,尽可能少的、L,R交替的子序列,再将这些子序列拼起来。划分可以直接贪心,从左向右依次加入每个字符,没有能加入的子序列,就新开一个子序列。划分好后,构造拼接方案。将子序列分为LL,RR,LR,RL四类。LL,RR这两类可以先合并为一个LL,或一个RR,或一个LR。LR,RL这两类,可以合并为一个LR或一个RL。最后将剩下的不超过两个子序列拼接在一起即可。
阅读全文
摘要:维护每个数上一次、下一次出现的位置:pre[i]和nxt[i]。“某个数在区间里是否出现”的问题,转化为“区间里nxt[i],pre[i]的最大、最小值”的问题。枚举三元组(i,j,k)中的k,对每个j维护最大的i和最小的i,那么答案就是Σmaxi[j]-mini[j]+1。对maxi和mini分别求和。考虑从k-1变成k时对它们的影响。发现需要支持区间对一个数取min。用吉老师线段树维护即可。
阅读全文
摘要:通过二分答案转化为判定性问题。发现如果从前往后安排每一天,很难找到一种固定的贪心策略,来确定当天砍哪些竹子。换个思路,时光倒流!从后往前,每天竹子自己减少ai,我们一次操作将其拔高p。要保证每根竹子高度始终非负,且m天后最终高度大于等于hi。用小根堆维护每根竹子自己能坚持到哪一天(不变成负数),每次取出坚持天数最少的,将其拔高即可
阅读全文
摘要:如果初始时有两个相邻的格子同色,则这两个格子此后将会永远保持同色,而且每轮换一种颜色:交替闪烁。对于周围没有同色格子的格子,它的颜色最开始时不变。直到它被闪烁的格子同化。所以,只要找到距离每个格子最近的闪烁的格子在哪里,就能知道每个格子从第几轮开始闪烁。找最近的、闪烁的格子:二分,把曼哈顿距离转成切比雪夫距离后,用二维前缀和check
阅读全文
摘要:把序列中的数,分为:小于k的,等于k的,和大于k的,三类。我们要使得序列里所有数,排好序后,中间位置的值刚好是k。分大于k的数太多,和小于k的数太多,两种情况。如果大于k的数太多,则通过每次对相邻两个数操作,能恰好消灭掉一个大于k的数,因此这种情况一定有解。如果小于k的数太多,我们需要找到一段区间,满足区间长度至少为2且区间里大于等于k的数占绝对多数。
阅读全文
摘要:[toc] "比赛链接" CF1348D Phoenix and Science 分析问题的性质。首先,每块的大小是无关紧要的,重要的是你每天会切多少块。这取决于两个因素:当前已有的块数$d$,当前所有块的总和$w$。假设你今天要新切$x$刀,那么显然,$i$必须满足:$0\leq x\leq d$
阅读全文
摘要:题目链接 我们设$h(i)$,表示要到达点$i$,最远必须经过$h(i)$。特别地,如果永远无法到达$i$,令$h(i)=\inf$。那么,每个位置$i$,会在$\text\in[h(i),m]\(时成为一个能够到达的位置(其中\)\text\(表示可以走的范围为\)[0,\text]\()。因此最
阅读全文
摘要:比赛链接 CF1340A Nastya and Strange Generator 如题目所定义地,我们设$r_j$表示$\geq j$的位置中,第一个没有被占用的位置。特别地,我们认为位置$n+1$永远不被占用。即:如果$[j,n]$都已经被占用了,那么$r_j=n+1$。 题目还定义了,\(\t
阅读全文
摘要:[toc] "比赛链接" CF1329A Dreamoon Likes Coloring 涂到的格子数最少的构造方案是,让第$i$次涂色的位置从$i$开始。此时涂到的格子数为$\max_{i=1}^{m}(i+l_i 1)$。 涂到的格子数最多的构造方案是,每种颜色都涂在上一种颜色结束后,即不同颜色
阅读全文
摘要:[toc] "比赛链接" CF1334D Minimum Euler Cycle 构造题。 因为要求字典序最小,我们能贪则贪。 从$1$出发,依次走过:$1 2 1 3 1 4 \dots n$。此时如果从$n$再走到$1$,会发现所有从$1$出发的边都被使用过了,无法继续。所以不能走回$1$。我们
阅读全文