首页 > 其他分享 >CF/AT/LUOGU 日常做题合集

CF/AT/LUOGU 日常做题合集

时间:2023-11-14 13:22:06浏览次数:31  
标签:Hash 边双 min LUOGU CF DP 端点 合集 sim

标签格式

  • 思路
  • 算法
  • 特殊

CF1155F

标签

分析性质
图论,状压 DP,枚举
记录方案,

思路

做的时候想了几个错误做法,还看错题了。

因为边双的形态必然是由一个点加多条链组成的(耳分解)(一个环 = 一个点 + 一条链),即糖葫芦型。

又因为 \(n\le 14\) 考虑暴力。

先预处理出 \(path_{i,j,S}\) 代表一条链,经过了 \(S\) 中所有点,且两个端点为 \(i,j\) 的一个方案。

直接对于每个点作为其中一个端点暴力即可。

然后 DP,设 \(dp_{S}\) 中存了 \(S\) 作为一个边双的最少边数,枚举所有链,即 \(S\) 的所有子集,将答案取 \(\min\) 。

最终输出方案可采取回退,一条链一条链输出。

带注释 code

经验

边双的形态必然是耳分解形态的,同理,能耳分解的一定是边双。

补充

耳分解指每次一条链(若 \(x_1 = x_k\) 也视为一条链),与边双互为充要。

开耳分解指每次的链满足(\(x_1 \not= x_k\)),与点双满足互为充要。

CF1610G

标签

贪心思想
Hash,字符串,倍增,DP

单调栈

思路

首先若要进行消去操作必然消去一段连续的区间,即若一次操作为 \([l,r]\) 则在这之前 \([l + 1, r - 1]\) 内的都已被消去。

正确性

在 \([l,r]\) 中有字符时,因为 \(s_l = (\) 且消去后变优,故有 \(s_{l + 1} = (\),同理,\(s_{l + 1\sim \frac{l + r - 1}{2}}\) 都为 \((\),如果 \(r - l + 1\) 为奇数,那 \(s_{mid} = (\) 可以将左半边操作全部右移一位。

即一个位置最多作为一个可消除区间的左端点,单调栈处理即可。设 \(to_i\) 中记录可消除区间的右端点,若没有则为 \(i - 1\)。

于是从后往前设 \(f_i\) 为 \(s_{i\sim n}\) 的最优序列。有 \(f_i = \min(s_i + f_{i + 1}, f_{to_i + 1})\)。

但这样是 \(O(n^2)\) 的,因为 \(\min\) 的比较是 \(O(n)\) 的。

考虑如何优化比较,想到用倍增维护 \(s_{i\sim n}\) 的 \(2^j\) 长度的前缀的 Hash 值,比较两个字符串时倍增一下找出第一个不同的位置即可。

写法

先当作 \(f_i = s_i + f_{i + 1}\) 处理。

开一个数组 \(S_i\) 代表 \(s_{i\sim n}\) 的实际开始位置。

初始化 \(S_i = i\)。然后将 \(f_{to_i + 1}\) 与 \(f_i\)(当前)比较一下,若 \(f_{to_i + 1}\) 更优,只需设 \(S_i = S_{to_i + 1}\) 即可,因为可能存在 \(to_i + 1\) 也被消去的可能。

代码

code

经验

用 Hash 维护 st 表可以 \(O(\log n)\) 判断两个子串大小。

最优解问题通过操作最优性简化题目,采用 DP 贪心的思想。

标签:Hash,边双,min,LUOGU,CF,DP,端点,合集,sim
From: https://www.cnblogs.com/SkyMaths/p/17831148.html

相关文章

  • CF232D Fence
    好喜欢SA+DS。洛谷CF给出序列\(a_1\sima_n\),有\(q\)次询问,每次询问给出\([l,r]\),求有多少个区间\([x,y]\)满足\(y-x=r-l\),\([x,y]\bigcap\,[l,r]=\varnothing\)且\(\forall\,i\in[0,r-l],a_{l+i}+a_{x+i}=a_{l}+a_x\)。\(n,q\le10^5\)。tags:\(......
  • [题解] CF1748E Yet Another Array Counting Problem
    YetAnotherArrayCountingProblem给你一个长度为\(n\)的序列和一个数\(m\),求有多少个长度为\(n\)的序列\(b\)满足:\(\foralli\in[1,n],b_i\in[1,m]\)。对于每个区间\([l,r]\),\(b\)中最大值最靠左的位置和\(a\)相同。\(n,m\le2\times10^5,n\ti......
  • CF773D Perishable Roads
    题目描述:有一个\(n\)个点的图,对于每两个点\((i,j)\)之间都有一条长度为\(w_{i,j}\)的无向边。给你一个点\(t\),你需要构造一棵以\(t\)为根的生成树,使得\(\sum\limits_{i=1}^{n}s(i,t)\)尽量小。\(s(i,t)\)为\(i\rightarrowt\)的树上路径上的最小权值。你需要对于......
  • luoguP7302 [NOI1998] 免费的馅饼
    题目描述SERKOI最新推出了一种叫做“免费馅饼”的游戏:游戏在一个舞台上进行。舞台的宽度为ww格(从左到右依次用11到ww编号),游戏者占一格。开始时游戏者可以站在舞台的任意位置,手里拿着一个托盘。下图为天幕的高度为44格时某一个时刻游戏者接馅饼的情景。游戏开始后,从舞......
  • 【题解】CF1891E - Brukhovich and Exams
    【题解】CF1891E-BrukhovichandExamshttps://www.luogu.com.cn/problem/CF1891E我们考虑把区间分段:若两个相邻的数不互素,中间分开;若两个相邻的数中有且仅有一个\(1\),中间分开。那么我们得到了两种区间:全\(1\)区间与无\(1\)区间。若两个相邻数在同一区间内,那么就在区间......
  • [题解] CFgym101623F Factor-Free Tree
    Factor-FreeTree当一棵二叉树中的每个节点的权值都与它所有祖先的权值互质时,我们称它为factor-freetree。给你一棵按照中序遍历的顺序的权值序列\(a\),求这个序列是否对应这一棵factor-freetree。如果是就输出每个节点的父亲。\(n\le10^5,a_i\le10^7\)。考虑怎么......
  • [题解] CF1156E Special Segments of Permutation
    SpecialSegmentsofPermutation给你一个排列\(p\),求有多少个区间\([l,r]\)满足\(p_l+p_r=\max_{i\in[l,r]}p_i\)。\(n\le2\times10^5\)。按最大值分治,记当前的分治中心为\(mid\),分治区间为\([l,r]\)。然后需要计算跨分治中心的贡献。如果\(mid-l......
  • [CF1895F] Fancy Arrays
    先把存在性容斥一下。变成\([0,\infty]\)减去\([0,x-1]\)和\([x+k,\infty]\)。\([0,x-1]\)的答案显然可以矩阵快速幂\(\mathcalO(x^3\logn)\)求。考虑剩下两个。注意到两个单拎出来都不好求,所以直接求这两个的差。注意到限制在于相邻项的差,于是我们去枚举差分数组,共有......
  • CF121E Lucky Array
    sqrttechnology,sqrtfaith.洛谷CF定义一个数为幸运数字,当且仅当其十进制数位中仅有\(4\)和\(7\)组成。给出长度为\(n\)的序列\(p_1\simp_n\),有\(q\)次操作,分为两种类型:\(\texttt{add}l\texttt{}r\texttt{}x\),将\(p_l\simp_r\)加上\(x\)。\(\te......
  • CF300B Coach 题解
    闲话调了好一会,甚至还重构了一次代码才对,但是还是很喜欢并查集,并查集可爱捏。题意省流$n$个学生分成$3$人一组,要满足$m$个条件,每个条件给出两个数$x,y$,要求$x$和$y$必须在一个组里。正文要使学生三人一组,一眼使用并查集。首先考虑无解(输出$-1$)的情况:给出的限......