【HDOJ6583】Typewriter(SAM,DP)】的更多相关文章

题意:给定一个由小写字母组成的字符串,每次可以花费p在串后加上任意一个字母,花费q在串后复制一个当前串的子串,问生成字符串的最小花费 n<=2e5,1<=p,q<2^31 思路: SAM上每个结点表示的串长度为[st[F[p]]+1,st[p]],如果长度不符合当前i,j的要求,比如复制的时候长度小于当前的一半或者长度大于[j+1,i]就暴力往上跳parent #include<bits/stdc++.h> using namespace std; typedef long…
题意:有n个a[i]和b[i],调整顺序使abs(a[i]-b[i])之和最小,但a[i]<>b[i].保证所有 Ai各不相同,Bi也各不相同. 30%的数据满足:n <= 104 100%的数据满足:1 <= n <= 105,Ai和Bi均为1到106之间的整数. 思路:可以证明调整范围一定在三个数以内 ..]of int64; a,b,c:..]of longint; n,i:longint; function clac(x,y:longint):int64; begin…
[CF981D]Bookshelves(贪心,动态规划) 题面 洛谷 Codeforces 给定一个长度为\(n\)的数列,把他们划分成\(k\)段,使得每段的和的结构按位与起来最大. 题解 从高位往低位贪心,然后暴力\(dp\)就行了吧... #include<iostream> #include<cstdio> using namespace std; #define MAX 55 #define ll long long inline ll read() { ll x=0;b…
[BZOJ3160]万径人踪灭(FFT,Manacher) 题面 BZOJ 题解 很容易想到就是满足条件的子序列个数减去回文子串的个数吧... 至于满足条件的子序列 我们可以依次枚举对称轴 如果知道关于这个位置对称的位置的组数 就很容易算了(直接\(2^k-1\)) 而关于这个位置对称是什么东西? \(s[x-i]=s[x+i]\) 也就是说,如果两个位置关于\(x\)位置对称,那么 \((x-i)+(x+i)=2x\) 也就是两个位置的坐标的和等于\(2x\) 这个玩意不就像一个卷积卷积了?…
[BZOJ1216]操作系统(堆,模拟) 题面 题目描述 写一个程序来模拟操作系统的进程调度.假设该系统只有一个CPU,每一个进程的到达时间,执行时间和运行优先级都是已知的.其中运行优先级用自然数表示,数字越大,则优先级越高. 如果一个进程到达的时候CPU是空闲的,则它会一直占用CPU直到该进程结束.除非在这个过程中,有一个比它优先级高的进程要运行.在这种情况下,这个新的(优先级更高的)进程会占用CPU,而老的只有等待. 如果一个进程到达时,CPU正在处理一个比它优先级高或优先级相同的进程,则这…
[CF183D]T-shirt(动态规划,贪心) 题面 洛谷 CodeForces 题解 \(O(n^2m)\)的暴力懒得写了,比较容易,可以自己想想. 做法是这样的,首先我们发现一个结论: 对于某个颜色(我们就把尺寸当成染色问题好了),如果你拿的个数越多,那么它对于答案的贡献就越来越少.这个东西是显然的,所以这个函数是一个凸函数. 那么这样子就可以贪心,每次选择对于答案贡献最多的一个颜色,然后同时更新一下它下一次再拿的时候对于答案的贡献就好了. 时间复杂度\(O(n^2+nm)\) #incl…
[NOI2017]游戏(搜索,2-sat) 题面 BZOJ的SPJ是假的 兹磁洛谷 题解 如果没有\(x\)地图的影响 这就是一个裸的\(2-sat\)问题 但是现在有不超过\(8\)个\(x\)地图的影响 我们不难想到枚举\(x\)地图的状态再来\(2-sat\)判断剩余是否可行. 这样的复杂度是\(O(3^dn)\),稍微算一下发现这个复杂度有点假 考虑如何优化,我们枚举\(x\)地图不连什么 表面上看起来还是\(O(3^dn)\) 但是,当他等价于\(a,b\)两种地图时,\(2^d\)种…
题意: Kiana最近沉迷于一款神奇的游戏无法自拔. 简单来说,这款游戏是在一个平面上进行的. 有一架弹弓位于(0,0)处,每次Kiana可以用它向第一象限发射一只红色的小鸟,小鸟们的飞行轨迹均为形如y=ax^2+bx的曲线,其中a,b是Kiana指定的参数,且必须满足a<0. 当小鸟落回地面(即x轴)时,它就会瞬间消失. 在游戏的某个关卡里,平面的第一象限中有n只绿色的小猪,其中第i只小猪所在的坐标为(xi,yi). 如果某只小鸟的飞行轨迹经过了(xi,yi),那么第i只小猪就会被消灭掉,同时…
[旋转] 平衡树中的旋转是指在不改变中序遍历的前提下改变树的形态的方式.(中序遍历=排名顺序) 右旋将当前点的左节点旋上来,左旋反之.(图侵删) void rturn(int &k){ int o=t[k].l; t[k].l=t[o].r; t[o].r=k; up(k);up(o); k=o; } 原根k,新根o. 1.把k的左节点o解放出来并更新为o的右节点. 2.解放出来的o成为新根,其右孩子赋为k. [Treap]树堆 功能:维护支持单点插入和单点删除的排名树. 特点:给每个节点随机堆…
题意: 考虑一张无限大的方格棋盘.我们有一个“骑士”,它必须从(0,0)格开始,按照如下规则,移动至(X,Y)格:每一步,它只能从(u,v)格移动至(u+Ax,v+Ay)或者(u+Bx,v+By).注意,该规则可能不同于国际象棋中骑士的移动规则. 此外,棋盘上有K个障碍格,骑士不能进入这些格子. 你的任务是计算骑士有多少种到达指定位置的方案.我们认为两种方案不同,当且仅当它们的步数不同,或者存在某个i使得两种方案中,骑士在第i步到达的格子不同.注意,骑士在到达(X,Y)格后还可能继续移动. 对每…
题目不再重复叙述 请参考: 洛谷 CJOJ 题解 先来说说非完美解法,也是我去年考场上的做法 考虑一下每一只蚯蚓增加的长度, 这个值并不需要每一次依次增加, 用一个变量维护即可,每次取出蚯蚓就加上这个值,切断蚯蚓就减去这个值. 接下来如何维护最大的蚯蚓,考虑使用一个堆来进行维护 时间复杂度O(mlogm)显然超时(其实也就是常数巨大) 现在,来考虑正解 我们先来脑补几个显然成立的结论 第一个:如果蚯蚓A长于蚯蚓B,一定是优先切蚯蚓A 第二个:一只蚯蚓被切断后,两部分长度一定不会超过原长度 第三个…
题意: 思路:n<=12,考虑状压DP 生成树中深度相同的点可以一次性转移完毕 设dp[sta,i]为已转移完sta状态的点,当前深度为i的最小花费 dp[sta or v,i+1]=min(dp[sta,i]+f[sta,v]*(i+1)),其中v是sta关于全集(1<<n)-1的补集v1的一个子集,这一步需要枚举子集 考场上写的O(3^n*n^2),没有预处理f[sta,v]而是每次都算了一遍,有进一步优化的空间 ; ..,..]of int64; f:..,..]of int64;…
题面戳我 题解 我原来也觉得是一道不可做的难题.. 其实,,,很简单的啦... 对于当前状态 我们出牌的方式大致分为两类 一类是不用考虑点数的,包括单张,对子,三带一等 另一类就是需要考虑点数的,包括顺子等 因此,每种状态下,首先考虑不用考虑点数的出牌方法 尝试打完,更新打完. 搜索的作用是考虑要考虑点数的出牌方法 每次搜索去掉若干张牌,然后递归,继续考虑不考虑点数的出牌方法. 然后就发现这道题目特别简单啦... (还没懂就看代码吧...) #include<iostream> #includ…
前言 多项式真的很难♂啊qwq Solution 考虑求的是一个有间隔的回文串,相当于是: 总的答案-没有间隔的答案 考虑总的答案怎么计算?FFT卷一下就好了. 对于每一位字符,有两种取值,然后随便卷起来,卷起来就是当前这一位之前与它相同的字符个数(这一位不能是'0',也就是被排斥的那一位) 然后就可以轻松解决? 是的. #include<stdio.h> #include<stdlib.h> #include<string.h> #include<math.h&…
蒟蒻的第二道树形DP,话说看了这个题的正常做法之后一脸蒙,森林转二叉树??什么诡异的操作,蒟蒻完全没明白那个原理是啥...可能是当初没好好学吧..不管了,索性直接DP. 不难看出,这个题的DP方程和刚才那个大差不离,就是刚才那个题可以直接知晓应该留多少条边而这个需要计算一下罢了,考虑搜索中进行儿子数量的计算..然后方程上略有一丝不同,一开始傻傻的把边权加进去,后来突然发现不对这个题给的是点权,于是就在前面把所有点都打进了DP数组,然后剩下的就没什么很大的不同了. #include<iostrea…
这个题,题目很长,然而亲爱的翻译已经帮你读完题了,一句话题意. 要求不下降的最长,那么这一段肯定满足队首的左区间不大于队尾的右区间,单调队列容易求解. #include<iostream> #include<cstdio> #include<cmath> #include<cstring> #include<algorithm> #define re register #define wc 0.0000000001 using namespace…
题意: 思路: C++ #include<map> #include<set> #include<cmath> #include<cstdio> #include<vector> #include<cstring> #include<cstdlib> #include<iostream> #include<algorithm> #define M 1000000 #define MAXN 21000…
[BZOJ1004]Cards(组合数学,Burnside引理) 题面 Description 小春现在很清闲,面对书桌上的N张牌,他决定给每张染色,目前小春只有3种颜色:红色,蓝色,绿色.他询问Sun有 多少种染色方案,Sun很快就给出了答案.进一步,小春要求染出Sr张红色,Sb张蓝色,Sg张绝色.他又询问有多少种方 案,Sun想了一下,又给出了正确答案. 最后小春发明了M种不同的洗牌法,这里他又问Sun有多少种不同的染色方案. 两种染色方法相同当且仅当其中一种可以通过任意的洗牌法(即可以使用…
[BZOJ4455]小星星(动态规划,容斥) 题面 BZOJ 洛谷 Uoj 题解 题意说简单点就是给定一张\(n\)个点的图和一棵\(n\)个点的树,现在要让图和树之间的点一一对应,并且如果树上存在一条边,那么图上对应的点对之间也要存在边. 我们直接求解显然很麻烦,一一对应是一个很不好算的东西. 那么我们先要求并不需要一一对应,随意对应即可,最后再减掉不合法的方案,这样就可以用容斥来解决. 怎么容斥呢?无非是考虑没有一一对应的关系,那么我们先暴力枚举一下哪些点在图上可以和树上的点进行对应,其他的…
[BZOJ1492][NOI2007]货币兑换(动态规划,CDQ分治,Splay) 题面 BZOJ 洛谷 Description 小Y最近在一家金券交易所工作.该金券交易所只发行交易两种金券:A纪念券(以下简称A券)和 B纪念券(以下 简称B券).每个持有金券的顾客都有一个自己的帐户.金券的数目可以是一个实数.每天随着市场的起伏波动, 两种金券都有自己当时的价值,即每一单位金券当天可以兑换的人民币数目.我们记录第 K 天中 A券 和 B券 的 价值分别为 AK 和 BK(元/单位金券).为了方便…
[BZOJ1855]股票交易(动态规划,单调队列) 题面 BZOJ 题解 很显然,状态之和天数以及当天剩余的股票数有关 设\(f[i][j]\)表示第\(i\)天进行了交易,剩余股票数为\(j\)的最大获利 每次枚举可以转移过来的天数以及股票数 再枚举买入或者卖出的数量, 时间复杂度\(O(T^2Mp^2)\),30pts(但是有40pts...) #include<iostream> #include<cstdio> #include<cstdlib> #includ…
[Luogu2711]小行星(网络流,最大流) 题面 题目描述 星云中有n颗行星,每颗行星的位置是(x,y,z).每次可以消除一个面(即x,y或z坐标相等)的行星,但是由于时间有限,求消除这些行星的最少次数. 输入输出格式 输入格式: 第1行为小行星个数n,第2行至第n+1行为xi, yi, zi,描述第i个小行星所在的位置. 输出格式: 共1行,为消除所有行星的最少次数. 输入输出样例 输入样例#1: 3 1 2 3 2 3 1 1 3 2 输出样例#1: 2 说明 1≤n≤50000 1≤x…
[BZOJ2242]计算器(BSGS,快速幂) 题面 BZOJ 洛谷 1.给定y.z.p,计算y^z mod p 的值: 2.给定y.z.p,计算满足xy ≡z(mod p)的最小非负整数x: 3.给定y.z.p,计算满足y^x ≡z(mod p)的最小非负整数x. 题解 第一问是裸的快速幂 第二问,因为\(P\)是质数,所以求一下乘法逆元再乘\(z\)就行了,特判\(y\)是\(p\)的倍数时无解 第三问,\(bsgs\)模板 洛谷上的时间: \(map:652ms\) \(Hash:48ms…
[BZOJ1299]巧克力棒(博弈论,线性基) 题面 BZOJ 题解 \(Nim\)博弈的变形形式. 显然,如果我们不考虑拿巧克力棒出来的话,这就是一个裸的\(Nim\)博弈. 但是现在可以加入巧克力棒.加入巧克力棒的意义是修改当前的异或和. 如果不能够改变当前先后手赢的状态的话,那么必定不能够拿出一个巧克力棒的集合满足异或和为\(0\). 初始情况下是先手必败的情况,因为先后不改变当前的必胜/必败情况,所以先手必须要拿出一个异或和为\(0\)的集合,并且使得剩下的部分不能够存在异或和为\(0\…
[BZOJ3456]城市规划(生成函数,多项式运算) 题面 求\(n\)个点的无向连通图个数. \(n<=130000\) 题解 \(n\)个点的无向图的个数\(g(n)=2^{C_n^2}\).设\(n\)个点的无向连通图个数为\(f(n)\).有等式: \[g(n)=\sum_{i=1}^{n}C_{n-1}^{i-1}f(i)g(n-i)\] 即考虑枚举\(1\)号点所在联通块的点. 将\(g(n)\)带入式子 \[2^{C_n^2}=\sum_{i=1}^{n}C_{n-1}^{i-1}…
[BZOJ4826][HNOI2017]影魔(扫描线,单调栈) 题面 BZOJ 洛谷 Description 影魔,奈文摩尔,据说有着一个诗人的灵魂.事实上,他吞噬的诗人灵魂早已成千上万.千百年来,他收集了各式各样 的灵魂,包括诗人.牧师.帝王.乞丐.奴隶.罪人,当然,还有英雄.每一个灵魂,都有着自己的战斗力,而影魔,靠 这些战斗力提升自己的攻击.奈文摩尔有 n 个灵魂,他们在影魔宽广的体内可以排成一排,从左至右标号 1 到 n. 第 i个灵魂的战斗力为 k[i],灵魂们以点对的形式为影魔提供攻…
[BZOJ2067]SZN(二分,动态规划,贪心) 题面 权限题额 Description String-Toys joint-stock 公司需要你帮他们解决一个问题. 他们想制造一个没有环的连通图模型. 每个图都是由一些顶点和特定数量的边构成. 每个顶点都可以连向许多的其他顶点.一个图是连通且无环的. 图是由许多的线做成的.一条线是一条连接图中两个顶点之间的路径.由于一些技术原因,两条线之间不能有重叠的部分,要保证图中任意一条边都被且仅被一条线所覆盖.由于一些技术原因,做一个这样的图的模型的…
[BZOJ4774]修路(动态规划,斯坦纳树) 题面 BZOJ 题解 先讲怎么求解最小斯坦纳树. 先明白什么是斯坦纳树. 斯坦纳树可以认为是最小生成树的一般情况.最小生成树是把所有给定点都要加入到联通块中.而斯坦纳树不一样,斯坦纳树只需要把指定点集中的所有点全部加入到联通块中,并且允许使用点集以外的点. 然而求解最小斯坦纳树是一个\(NP\)问题,所以只能状压解决. 设\(f[S][i]\)表示指定点的联通情况为\(S\),并且当且的斯坦纳树以\(i\)为根,\(i\)可以是图上任意一个点. 考…
[BZOJ2024]舞会(动态规划,容斥,高精度) 题面 BZOJ 洛谷 题解 这种关系显然要先排序才不会不想影响. 设\(f[i][j]\)表示前\(i\)个女生中,选了\(j\)个女生配对,并且女生比男生高,剩余的随意匹配的方案数. 转移: \(f[i][j]=f[i-1][j]+f[i-1][j-1]*(p-(j-1)\) 然后容斥一下即可,高精度常数巨大. \(BZOJ\)似乎过不了??? #include<iostream> #include<cstdio> #inclu…
[CF888G]Xor-MST(最小生成树,Trie树) 题面 CF 洛谷 题解 利用\(Kruskal\)或者\(Prim\)算法都很不好计算. 然而我们还有一个叫啥来着?\(B\)啥啥的算法,就叫\(B\)算法吧. 思想是对于每个点找到一条最小边,并且将这条边连上,不难证明每次至少连上了\(n/2\)个点. 再将这些联通块看做一个点继续重复这个过程,时间复杂度是\(log\)级别的. 我们从高位往低位看,如果我们按照\(01\)分类,根据上述的过程,不难得到,如果\(01\)两个集合都存在的…