[BZOJ5073][Lydsy1710月赛]小A的咒语】的更多相关文章

bzoj description 你有一个\(A\)串和\(B\)串,你需要判断是否可以在\(A\)串中拆出\(x\)个互不相交的子串,使它们按顺序拼在一起可以组成\(B\)串. \(|A|,|B|\le10^5,x\le100\) sol 设\(f_{i,j}\)表示已经使用了\(i\)个\(A\)的子串,\(A\)已经使用到了\(j\)位置时\(B\)串中的最长匹配的长度,每次转移的时候显然回取\(A\)串中的\(j+1\)位置和\(B\)串中的\(f_{i,j}+1\)位置的\(lcp\)…
题目链接 首先这种题一看就是dp. 设\(dp[i][j]\)表示\(A\)序列中到\(i\)位之前,取了\(j\)段,在\(B\)中的最长的长度. 转移也比较简单 \[ dp[i][j] \to dp[i+1][j] \quad \text{不选} \\ dp[i][j] \to dp[i+k][j+1] \quad a[i+1..i+k]=b[dp[i][j]..dp[i][j]+k] \] 但是这样做的复杂度肯定不行. 发现有一个贪心的思路,因为既然我这里已经占用了一次次数了,那么肯定要尽…
LINK:[Lydsy1710月赛]小A的咒语 每次给定两个串 要求从a串中选出x段拼成B串 能否做到.T组数据. \(n\leq 100000,m\leq 100000,T\leq 10,x\leq 100\) 首先考虑贪心的从前往后匹配 若果当前匹配位置比之前还要远覆盖之前的 但是这样做会出现问题. 可能当前匹配的是之前匹配的后面的一段 也可能是之前的一段. 所以需要dp来解决这个后效性问题 设g[i][j]表示前i段个字符选出了j段所能拼成B串的最大长度. 有g[i][j]=g[i-1][…
题目描述 给出 $A$ 串和 $B$ 串,从 $A$ 串中选出至多 $x$ 个互不重合的段,使得它们按照原顺序拼接后能够得到 $B$ 串.求是否可行.多组数据. $T\le 10$ ,$|A|,|B|\le 10^5$ ,$x\le 100$ . 题解 后缀数组+倍增RMQ+贪心+dp 设 $f[i][j]$ 表示从 $A$ 串的前 $i$ 个字符中选出 $j$ 段,能够拼出 $B$ 串的最大长度. 那么考虑转移,如果 $i+1$ 不用则 $f[i+1][j]\leftarrow f[i][j]…
[BZOJ5073][Lydsy十月月赛]小A的咒语 题解:沙茶DP,完全不用后缀数组. 用f[i][j]表示用了A的前i个字符,用了j段,最远能匹配到哪.因为显然我们能匹配到的地方越远越好,所以我们直接判断A[i]和B[f[i][j]]是否相等,如果相等则转移下去.还要记录g[i][j]表示第i个字符匹配成功时最远能匹配到哪,这样f数组可以求前缀最大值,但要从j转移到j+1,而g数组可以从j转移到j. P.S:贪心策略好像有bug...大家还是写后缀数组吧. #include <cstdio>…
传送门 \(\color{green}{solution}\) 嗯...其实我也不太会,所以大胆猜个结论吧(后来证了一下,然后放弃了...). 我们发现如果要使一个联通块的黑点数量为\(k\)的方案最少需要\(l\)个点,最多需要\(r\)个点 那么必然能找到一个点数在 \([l,r]\) 的连通块使得包含\(k\)个黑点. 如果我们知道了这个结论, 那么这题就很zz了 这里只讲最多需要多少个点(反之亦然). 我们定义这么一个状态\(f_{i,j}\) 表示以\(i\) 为根的子树有\(j\)…
Description BZOJ只是扔了个下载链接 Solution 设$f[x][i]$表示$x$点选中$i$个黑点的最小连通块. 设$g[x][i]$表示$x$点选中$i$个黑点的最大连通块. 转移非常明显.处理出每个情况的上下界之后差分一下$O(1)$回答询问即可. 卡空间所以要用$short$. 第二次$INF$开大了……应该多上点心了…… Code #include<iostream> #include<cstring> #include<cstdio> #d…
传送门 \(\color{green}{solution}\) 设 \[b_{i}=2^{w_{i}},sum= \sum_{i=1}^{n}{w_{i}}\] 则对于任意\(a_{i}\)都有 \[a_{i} \times w_{i} \ge sum\] \[\frac{w_{i}}{sum} \ge \frac{1}{a_{i}}\] 又因为\(w_{i}\)与\(a_{i}\)均为正整数,所以有 \[ \sum_{i=1}^{n} {\frac{w_{i}}{sum}} \ge \sum_…
神TM 又又又又是构造题..... 很简单的化简就是,把2^k[i]都换成k[i] ,然后就可以得出 对于任意的i,k[i] * a[i] >= ∑k[]. 最优的构造肯定是使  k[i] = 1 / a[i] ,为什么呢? 1.首先,∑ 1 / a[]   >   1的时候一定无解,考虑把原限制条件两边都加个∑,仍然成立(只不过条件放宽送了),化简之后就可以得到上面的那个式子. 2 ∑ 1 / a[]  <=  1 的时候我们就使   k[i] = 1 / a[i]  ,发现带入原始之…
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=5072 发现对于每个子树,黑点个数确定时,连通块的大小取值范围一定是一段区间:所以考虑只最小化最小值.最大化最大值,记 f 和 g 简单dp即可. 注意可能从当前子树里选0个点!此时会用自己更新自己!!所以要先复制一份原来的用来更新! 快速回答询问,本可以记差分数组,每个子树算完后给合法部分区间赋值:但空间开不下. 于是绞尽脑汁,终于想出可以开 bool 数组分块来赋值!!然而WA得不行.…