Description 一个长度为n的记账单,+表示存¥1,-表示取¥1.现在发现记账单有问题.一开始本来已经存了¥p,并且知道最后账户上还有¥q.你要把记账单修改正确,使得 1:账户永远不会出现负数: 2:最后账户上还有¥q.你有2种操作: 1:对某一位取反,耗时x: 2:把最后一位移到第一位,耗时y. Input The first line contains 5 integers n, p, q, x and y (1 n 1000000, 0 p;q 1000000, 1 x;y 100…
题目大意:给定一个由+1和−1构成的长度为n的序列,提供两种操作: 1.将某一位取反,花销为x 2.将最后一位移动到前一位.花销为y 要求终于p+sumn=q.且p+sumi≥0(1≤i≤n),求最小花销 枚举终于的序列以哪个点開始.那么从这个点往后的最小前缀和能够用单调队列预处理出来 然后贪心地把左边的−1改成+1.右边的+1改成−1直到满足要求就可以 #include <cstdio> #include <cstring> #include <iostream> #…
1122: [POI2008]账本BBB Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 402  Solved: 202[Submit][Status][Discuss] Description 一个长度为n的记账单,+表示存¥1,-表示取¥1.现在发现记账单有问题.一开始本来已经存了¥p,并且知道最后账户上还有¥q.你要把记账单修改正确,使得 1:账户永远不会出现负数: 2:最后账户上还有¥q.你有2种操作: 1:对某一位取反,耗时x: 2:把…
[POI2008]账本BBB Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 524  Solved: 251[Submit][Status][Discuss] Description 一个长度为n的记账单,+表示存¥1,-表示取¥1.现在发现记账单有问题.一开始本来已经存了¥p,并且知道最后账户上还有¥q.你要把记账单修改正确,使得 1:账户永远不会出现负数: 2:最后账户上还有¥q.你有2种操作: 1:对某一位取反,耗时x: 2:把最后一位移到…
→传送门← 正解: 贪心加单调队列优化 先粘贴一张别人写的被老师发下来给我们的题解(就是看着这张题解才写出来的) 下面是自己的话(一些具体操作过程): 把环拆成一条2*n的链,然后用优先队列来求出每一个区间的最小前缀和(先不考虑p),存在了fM[]里面. 然后枚举起点(即 第二次操作的使用次数)算出此时的费用cost去更新ans. 要注意的是,如果此时我需要将几个加号改成减号,按贪心的思路就是将最后几个加号改掉,这样的话,是不会影响这个区间的最小前缀和的(为什么呢?这个应该很好想吧),因为最小前…
题目 BZOJ 做法 明确: \(~~~1.\)为了达到目标分数所取反的次数是固定的 \(~~~2.\)为了满足前缀非负,得增加取反和滚动次数 滚动的次数可以枚举,增加的取反可以通过最小前缀和得到 滚动的最小前缀和可以通过备份+单调队列得到…
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2806 只想着怎么用后缀数据结构做,其实应该考虑结合其他算法. 可以二分那个长度 L .设当前二分为 mid :令 dp[ i ] 表示到 i 位置“熟悉”的最大长度.那么 \( dp[i]=\max(dp[i-1],\max\limits_{j<=i-mid,s[j+1...i] \in S}(dp[j]+(i-j)) ) \) (其中 S 是模式串的所有子串集合). 关于那个判断,只要先…
题目链接 首先二分答案L.然后就是判断能否将原串划分出一些长度不小于L的子串,这些子串要是给定n个串中的某个串的子串,且满足它们的长度之和不小于原串长度的90%. 贪心多长选一段什么的显然不对.老老实实DP. 设\(f[i]\)为到\(i\)划分出的最长长度(不用想什么奇奇怪怪的状态啊→_→),则\(f[i]=\max\{f[i-1],\ f[j]+i-j\}\) (\(s[i\sim j]\)是\(n\)个串中某串的子串,且\(i-j\geq L\)). 求以某位置结尾的子串是否匹配,可以对\…
题意 有M篇标准作文组成了一个作文库(每篇作文都是一个01的字符串),然后给出N篇作文(自然也是01字符串).如果一个长度不小于L的串在作文库中出现过,那么它是熟悉的.对于某一篇作文,我们要把它分为若干段,使得熟悉过的字符串长度>=百分之90,我们要求满足这个条件的最小的L. 分析 这个L显然满足二分,然后我们要想怎么判断,对于当前L,这篇作文的熟悉过字符串的最长长度是什么.我们先把作文库建一个广义后缀自动机,然后对于每篇作文很容易可以求出一个len[i]指的是在i位置结束的子串在作文库中出现过…
[BZOJ2806]Cheat(后缀自动机,二分答案,动态规划,单调队列) 题面 BZOJ 洛谷 题解 很有趣的一道题啊 对于在所有的串上面进行匹配? 很明显的后缀自动机 所以先构建出广义后缀自动机 然后这个拆分很像一个\(dp\) 同时,要求的东西很像一个可以二分的样子 所以二分一个答案,考虑如何\(dp\) 设\(f[i]\)表示处理完前\(i\)个字符,能够匹配上的最多的字符个数 转移是\(f[i]=max(f[j]+i-j)\),满足\(i-j>mid\) 同时\(S[j+1..i]\)…
#1403 : 后缀数组一·重复旋律 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一个音乐旋律被表示为长度为 N 的数构成的数列. 小Hi在练习过很多曲子以后发现很多作品自身包含一样的旋律.旋律是一段连续的数列,相似的旋律在原数列可重叠.比如在1 2 3 2 3 2 1 中 2 3 2 出现了两次. 小Hi想知道一段旋律中出现次数至少为K次的旋律最长是多少? 解题方法提示 输入 第一行两个整数 N和K.1≤N≤2000…
题目 输入格式 第一行两个整数N,M表示待检查的作文数量,和小强的标准作文库 的行数 接下来M行的01串,表示标准作文库 接下来N行的01串,表示N篇作文 输出格式 N行,每行一个整数,表示这篇作文的Lo 值. 输入样例 1 2 10110 000001110 1011001100 输出样例 4 提示 输入文件不超过1100000字节 注意:题目有改动,可识别的长度不小于90%即可,而不是大于90% 题解 想来练练SAM,却跪在了单调队列DP上...QAQ 根据后缀数组进行多串匹配时,用一个未出…
先建出广义后缀自动机. 然后跑出文章中每一个位置的最大匹配距离. 然后定义$f[i]$表示匹配到以$i$结尾的串时,最长的匹配距离. 显然可以二分$L$的取值. 然后容易得到$DP$方程 $f[i]=max(f[i-1],f[j]+i-j)(j<=i-L)$ 然后就发现$j$属于一个区间,然后就可以单调队列优化了. #include <map> #include <ctime> #include <cmath> #include <queue> #in…
BZOJ_4698_Sdoi2008 Sandy的卡片_后缀数组 Description Sandy和Sue的热衷于收集干脆面中的卡片.然而,Sue收集卡片是因为卡片上漂亮的人物形象,而Sandy则是为了积 攒卡片兑换超炫的人物模型.每一张卡片都由一些数字进行标记,第i张卡片的序列长度为Mi,要想兑换人物模型 ,首先必须要集够N张卡片,对于这N张卡片,如果他们都有一个相同的子串长度为k,则可以兑换一个等级为k的人 物模型.相同的定义为:两个子串长度相同且一个串的全部元素加上一个数就会变成另一个串…
Sandy的卡片 bzoj-4698 Sdoi-2008 题目大意:题目链接. 注释:略. 想法: 这个题跟一个Usaco的题特别像.我们把这些串差分 现在我们要求的就是公共子串且出现次数不少于$k$的最长长度. 紧接着把这$n$新串拼一起建立后缀数组. 两种做法: 第一种是二分.我们直接二分答案然后暴力扫验证,复杂度为$O(nlogn)$. 第二种就是双指针保证当前指针中间是满足条件的最短区间,顺便用单调队列求区间$ht$最小值即可. Code: #include <iostream> #i…
题目链接: (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?id=2806 (luogu) https://www.luogu.org/problemnew/show/P4022 题解:对"作文库"中的串建广义SAM.(感觉加个#拼在一起直接SAM也行啊,只是常数大了点,但是大家都写的广义SAM我也就跟着写广义SAM了233333) 询问时二分\(L\), 变成求最少几个位置不匹配.然后DP方程是\(dp[i]=\min(dp[…
我们对作文库建出广义后缀自动机.考虑用\(SAM\)处理出来一个数组\(mx[i]\),表示从作文的第\(i\)个位置向左最远在作文库中出现的子串的长度.这个东西可以在\(SAM\)上跑\(trans\)边来实现(其实求出来的是作文前i位在作文库中出现的最长后缀). 处理出来这个东西,我们考虑用\(DP\)求答案.发现直接用\(DP\)求并不是很好求,所以要在外面套一个二分答案.\(DP\)还要用单调队列优化. #include<iostream> #include<cstring>…
题意 找出出现k次的可重叠的最长子串的长度 题解 用后缀数组. 然后求出heigth数组. 跑单调队列就行了.找出每k个数中最小的数的最大值.就是个滑动窗口啊 (不知道为什么有人写二分,其实写啥都差不多快,可能是因为二分是一个常见的模型吧) #include<iostream> #include<cstring> #include<cstdio> #include<cmath> #include<algorithm> using namespac…
Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 9414   Accepted: 3123 Description A substring of a string T is defined as: T(i, k)=TiTi+1...Ti+k-1, 1≤i≤i+k-1≤|T|. Given two strings A, B and one integer K, we define S, a set of triples (i…
2806: [Ctsc2012]Cheat 题意: 多个主串和多个询问串,每次询问将询问串分成多个连续子串,如果一个子串长度>=L且在主串中出现过就是熟悉的 如果熟悉的字符串长度>=询问串长的90%就是熟悉的文章:求成为熟悉的文章的最大的L 主串建广义SAM然后二分L判断可行性 使用DP判断L是否可行,一定要注意是长度不是数量,煞笔Candy?就看错题了 len[i]表示i位置之前最大公共长度,和spoj LCS一样... f[i]表示前i个字符最长熟悉长度,f[i]=max{f[i-1],f…
1717: [Usaco2006 Dec]Milk Patterns 产奶的模式 Description 农夫John发现他的奶牛产奶的质量一直在变动.经过细致的调查,他发现:虽然他不能预见明天产奶的质量,但连续的若干天的质量有很多重叠.我们称之为一个"模式". John的牛奶按质量可以被赋予一个0到1000000之间的数.并且John记录了N(1<=N<=20000)天的牛奶质量值.他想知道最长的出现了至少K(2<=K<=N)次的模式的长度.比如1 2 3 2…
[BZOJ2806][Ctsc2012]Cheat Description Input 第一行两个整数N,M表示待检查的作文数量,和小强的标准作文库的行数接下来M行的01串,表示标准作文库接下来N行的01串,表示N篇作文 Output N行,每行一个整数,表示这篇作文的Lo 值. Sample Input 1 2 10110 000001110 1011001100 Sample Output 4 HINT 输入文件不超过1100000字节 注意:题目有改动,可识别的长度不小于90%即可,而不是…
偷懒直接把bzoj的网页内容ctrlcv过来了 2806: [Ctsc2012]Cheat Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 1943  Solved: 1004[Submit][Status][Discuss] Description Input 第一行两个整数N,M表示待检查的作文数量,和小强的标准作文库的行数接下来M行的01串,表示标准作文库接下来N行的01串,表示N篇作文 Output N行,每行一个整数,表示这篇作文的Lo…
题意: Description Input 第一行两个整数N,M表示待检查的作文数量,和小强的标准作文库的行数 接下来M行的01串,表示标准作文库 接下来N行的01串,表示N篇作文 Output N行,每行一个整数,表示这篇作文的Lo 值. HINT 输入文件不超过1100000字节 注意:题目有改动,可识别的长度不小于90%即可,而不是大于90% 题解: 好题! 先对标准作文库建出广义SAM,把每个作文串在SAM上匹配,求出每一位之前最长出现过子串长度$s[i]$: 显然没有什么好办法直接求L…
题目大意: 给你一堆模式串和文本串 对于每个文本串,我们可以把它不可重叠地拆分成很多子串,如果拆分出的串作为子串出现在了任何一个模式串中,我们称它是“眼熟的”,我们必须保证“眼熟的”子串总长度不小于文本串的90%,现在定义一个数$L$,表示拆分出的子串的最小长度,求每个文本串的$L$的最大值 神题 考虑$L$的性质,发现$L$越大,“眼熟的子串”总长度越长 可以这样简单证明,长度越小的串,对于匹配越有利,因为如果一个大串出现在了模式串中,那么它的所有子串一定出现在了模式串中,反之,小串出现在模式…
没啥难的,主要是单调队列忘了咋求了QAQ... Code: #include <cstdio> #include <algorithm> #include <cstring> #include <deque> #define setIO(s) freopen(s".in","r",stdin) #define maxn 2200000+10 #define N 2 using namespace std; char s…
题意 给定k,n,和n*n的矩阵,求一个子矩形满足权值和在[k,2k]之间 , 题解 这里用到了极大化矩阵的思想.推荐论文<浅谈用极大化思想解决最大子矩阵问题>Orz 如果有一个元素在[k,2k]之间.直接输出就好. 否则.把所有大于2k的元素作为障碍点. 求每一个最大化矩阵.(用单调队列) 如果这个矩阵权值和大于等于k 那么这个矩阵一定有一个子矩阵满足条件.这个结论可以证明. 假设这个矩阵权值和小于等于2k则直接输出这个矩阵. 否则这个矩阵权值和一定大于2k 假设这个矩阵去掉第一行后权值和大…
Description Input 第一行两个整数N,M表示待检查的作文数量,和小强的标准作文库的行数接下来M行的01串,表示标准作文库接下来N行的01串,表示N篇作文 Output N行,每行一个整数,表示这篇作文的Lo 值. Sample Input 1 2 10110 000001110 1011001100 Sample Output 4 解题思路: L0值具有单调性. L0值为0时,一定有匹配,为1时只需要考虑字符集,为2时要考虑前后顺序,所以具有单调性,L0越小匹配长度越大,那么可以…
对作文库中的串建出广义SAM,然后显然可以二分答案,二分之后考虑暴力dp,设f[i]为前i位最长匹配长度,显然有f[i]=max(f[i-1],f[j]+i-j) (i-j>=l&&j+1~i能在作文库中匹配).在SAM上跑并记录匹配长度,单调队列优化dp即可. #include<bits/stdc++.h> using namespace std; #define ll long long #define N 2200010 char getc(){char c=get…
1531: [POI2005]Bank notes Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 559  Solved: 310[Submit][Status][Discuss] Description Byteotian Bit Bank (BBB) 拥有一套先进的货币系统,这个系统一共有n种面值的硬币,面值分别为b1, b2,..., bn. 但是每种硬币有数量限制,现在我们想要凑出面值k求最少要用多少个硬币. Input 第一行一个数 n,…