02 2016 档案
摘要:神奇的莫队算法,用来解决可离线无修改的区间查询问题: 首先对原序列进行分块,√n块每块√n个; 然后对所有查询的区间[l,r]进行排序,首先按l所在的块序号升序排序,如果一样就按r升序排序; 最后就按顺序一个一个求出各个查询的结果:知道[l,r]的答案,并且在此基础上能在比较快地在O(x)得到相邻区
阅读全文
摘要:题目给一个由几个相连接的矩形组成的多边形,计算多边形包含的最大的矩形的面积。 要求的矩形的高一定是某一个用来组合的矩形的高;如果枚举每个矩形作为高的话,那样长就是这个矩形能向左向右继续延伸矩形的长度了。 所以这题本质也是用单调栈在O(n)计算出每个数作为最小数向左和向右能延伸的最长距离。 1 #in
阅读全文
摘要:题意:给一个非负整数序列,求哪一段区间的权值最大,区间的权值=区间所有数的和×区间最小的数。 用单调非递减栈在O(n)计算出序列每个数作为最小值能向左和向右延伸到的位置,然后O(n)枚举每个数利用前缀和O(1)计算出以这个数为最小值能得到的最大的区间权。 以前写的单调栈,三个if分支,写得繁繁杂杂的
阅读全文
摘要:题意:给n个字符串,求最长的子串,满足它或它的逆置出现在所有的n个字符串中。 把n个字符串及其它们的逆置拼接,中间用不同字符隔开,并记录suffix(i)是属于哪个字符串的; 跑后缀数组计算height; 二分答案,height分组,看组里面是否都包含了n个字符串的后缀; 注意n=1的情况。。 1
阅读全文
摘要:题意:有n个国家,贿赂它们都需要一定的代价,一个国家被贿赂了从属这个国家的国家也相当于被贿赂了,问贿赂至少k个国家的最少代价。 这些国家的从属关系形成一个森林,加个超级根连接,就是一棵树了,考虑用DP: dp[u][m]表示以u国家为根的子树贿赂m个国家的最少代价 单单这样的话转移是指数级的,其实这
阅读全文
摘要:给n个字符串,求最长的多于n/2个字符串的公共子串。 依然是二分判定+height分组。 把这n个字符串连接,中间用不同字符隔开,跑后缀数组计算出height; 二分要求的子串长度,判断是否满足:height分组,统计一个组不同的字符串个数是否大于n/2; 最后输出方案,根据二分得出的子串长度的结果
阅读全文
摘要:给一张有向无环图,边都有花费,从某点到某点走的那条路径上的那一条花费最多的边可以省掉,问从起点到终点的最少花费的多少, 往DP想的话,就可以写出这个状态dp[u][mx],表示到达u点已经省掉的花费为mx的最少花费。 用SPFA更新转移方程。。或者理解成队列+我为人人的转移。。其实这题这样子也能解有
阅读全文
摘要:给一个括号序列,求有几个括号是匹配的。 dp[i][j]表示序列[i,j]的匹配数 dp[i][j]=dp[i+1][j-1]+2(括号i和括号j匹配) dp[i][j]=max(dp[i][k]+dp[k+1][j])(i<=k<j) 1 #include<cstdio> 2 #include<c
阅读全文
摘要:树的重心即树上某结点,删除该结点后形成的森林中包含结点最多的树的结点数最少。 一个DFS就OK了。。 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 #define MAXN
阅读全文
摘要:求两个字符串的最长公共子串。 拼接两个字符串中间用特殊字符隔开,max(height[i])(2<=i<=len,suffix(sa[i])与suffix(sa[i-1])分别属于两个字符串的后缀)就是答案! 1 #include<cstdio> 2 #include<cstring> 3 #inc
阅读全文
摘要:求一个串的最大回文字串。 可以用后缀数组解决。 分别考虑奇数和偶数回文子串的情况,枚举原串S的每个位置i作为中间位置看其能向左右两边同时拓展都哪儿:把原串S反转成S',拼接SaS'(a为一个特殊字符),最远拓展的地方便可以通过LCP(suffix[i],suffix[i'])求得,i'为i对应在S‘
阅读全文
摘要:给一个字符串求有多少个不相同子串。 每一个子串一定都是某一个后缀的前缀。由此可以推断出总共有(1+n)*n/2个子串,那么下面的任务就是找这些子串中重复的子串。 在后缀数组中后缀都是排完序的,从sa[1]到sa[n],这么思考以某个串为前缀的子串有几个,那么容易想到重复子串的个数其实就是∑heigh
阅读全文
摘要:题目求最长的重复k次可重叠子串。 与POJ1743同理。 二分枚举ans判定是否成立 height分组,如果大于等于ans的组里的个数大于等于k-1,这个ans就可行 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 usi
阅读全文
摘要:题目大概是给n个数组成的串,求是否有多个“相似”且不重叠的子串的长度大于等于5,两个子串相似当且仅当长度相等且每一位的数字差都相等。 这题是传说中楼教主男人八题之一,虽然已经是用后缀数组解决不可重叠最长重复子串的经典题了。。但其实没那么简单,题目数据不强,网上一些代码都是不正确的。 首先把问题转化成
阅读全文
摘要:题目给个n×m的地图,1可以放玉米0不可以,现在要放玉米,玉米上下左右不能相邻,问放法有几种。 当前一行的决策只会影响下一行,所以状压DP之: dp[i][S]表示前i行放完且第i行放玉米的列的集合是S的方案数 先预处理出每一行合法的放法的集合,合法的放法其实是很少的,通过枚举合法的集合来转移。 1
阅读全文
摘要:题目是平面上n个点,要用若干个矩形盖住它们,每个矩形上至少要包含2个点,问要用的矩形的面积和最少是多少。 容易反证得出每个矩形上四个角必定至少覆盖了两个点。然后就状压DP: dp[S]表示覆盖的点集为S要用的最少矩形面积 转移我一开始是未覆盖的点和已覆盖的点构成一个矩形来转移,这是错的,因为这样子的
阅读全文
摘要:题目给几个字符串,可以给它们添加前导空格,然后排列,计算每一个字符串和前一个字符串相同非空格字符相等的个数,求可能的最大个数。 状态DP: d[S][i][j]表示已经用的字符串集合S且排列的最后一个是前面带j个空格的字符串i 转移就枚举从什么字符串几个前导0结尾转移过来的。还可以预处理一下各个情况
阅读全文
摘要:题目是,有n头牛,每头牛都喜爱某几个草地,要把这n头牛分配给m个不同的它们喜爱的草地,问有几种分配方式。 dp[n][S]表示前n头牛分配完毕后占用的草地集合是S的方案数 dp[0][0]=1 dp[n][S]+=dp[n-1][S-x](x∈S且n喜爱x) 不过的状态这样空间开销太大了,事实上n这
阅读全文
摘要:题目给一张n×n的格子,每个格子都有数字,要从格子中取若干个数字,八个方向相邻的数字不能一起取,问取的数字最大和是多少。 从第一行一行一行看下去,可以发现第1行取哪几列只会影响到第2行,第3行后面的一点影响都没有。即第i行的决策只受i-1行决策的影响。 那么自然想到状态DP—— dp[i][S]前i
阅读全文
摘要:题目是有n个存有宝藏的城堡,攻克任何一个城堡都需要先攻克0个或其他1个城堡,问攻克m个城堡最多能得到多少宝藏。 题目给的城堡形成一个森林,添加一个超级根把森林连在一起就是树了,那么就考虑用树型DP: dp[u][m]表示以u结点为根的子树攻克m个结点的最大价值 但是这样转移太难了,根是从每个孩子通过
阅读全文
摘要:题目求一棵树的最小支配数。 支配集,即把图的点分成两个集合,所有非支配集内的点都和支配集内的某一点相邻。 听说即使是二分图,最小支配集的求解也是还没多项式算法的。而树上求最小支配集树型DP就OK了。 树上的每个结点作为其子树的根可以有三个状态: 不属于支配集且还没被支配 不属于支配集但被其孩子支配
阅读全文
摘要:题目给一张有向图,问从起点1到终点2沿着合法的路走有种走法,合法的路指从u到v的路,v到终点的距离严格小于u到终点的距离。 先SPFA预处理出所有合法的路,然后这些路肯定形成一个DAG,然后DP一下就OK了,d[u]表示u到终点2的方案数。 1 #include<cstdio> 2 #include
阅读全文
摘要:题目给一张有向图G,要在其传递闭包T(G)上删除若干点,使得留下来的所有点具有单连通性,问最多能留下几个点。 其实这道题在T(G)上的连通性等同于在G上的连通性,所以考虑G就行了。 那么问题就简单了,强连通分量缩点,强连通分量必定要一起留下,从入度0到出度0的强连通分量找到一条包含最多点的通路即可。
阅读全文
摘要:题目给张R×C的地图,地图上*表示泥地、.表示草地,问最少要几块宽1长任意木板才能盖住所有泥地,木板可以重合但不能盖住草地。 把所有行和列连续的泥地(可以放一块木板铺满的)看作点且行和列连续泥地分别作为XY部,每一块泥地看作边。这样就构造出了一个二分图。 那么,问题就是在这个二分图中就是选出最少的点
阅读全文
摘要:给两个长n的01串s1和s2,要对s1进行k次修改,每次修改m个不同位置,问有几种方式修改成s2。 想偏了,只想到原始的01数值是不重要的,因为每个位置修改次数的奇偶性是确定的这一层。。 其实,这题只要关心从起点到终点有几个位置是不同的,一个数值足矣。 然后具体的状态就是:dp[i][j]表示,进行
阅读全文
摘要:题目给一张有向图,要把点分组,问最少要几个组使得同组内的任意两点不连通。 首先考虑找出强连通分量缩点后形成DAG,强连通分量内的点肯定各自一组,两个强连通分量的拓扑序能确定的也得各自一组。 能在同一组的就是两个强连通分量在不同的从入度0到出度0的强连通分量的路径上。 那么算法很直观就能想到了,用记忆
阅读全文
摘要:题目大概问小于等于m个的物品放到n个地方有几种方法。 即解这个n元一次方程的非负整数解的个数$x_1+x_2+x_3+\dots+x_n=y$,其中0<=y<=m。 这个方程的非负整数解个数是个经典问题,可以+1转化正整数解的个数用插板法解决:$C_{y+n-1}^{n-1}=C_{y+n-1}^y
阅读全文
摘要:题目问[1,n]中与n的gcd大于等于m的数的个数。 好难想。。。 假设x满足条件,那么gcd(x,n)=d>=m,而x/d与n/d一定互质。 又x<=n,所以x/d<=n/d。 于是gcd(x,n)=d的x个数就等于小于n/d且与n/d互质的个数,即phi(n/d)。 不同的d对应的x肯定会不重复
阅读全文
摘要:与HDU2841大同小异。 设左下角的点为(1,1),如果(1,1)->(x,y)和(1,1)->(x',y')向量平行,那只有在前面的能被看见。然后就是求x-1、y-1不互质的数对个数。 而x或y等于1可以另外讨论一下,就是当n不等于1时就有两个,n等于1就特判一下。 那么就用欧拉函数计数了:枚举
阅读全文
摘要:题目求φ(a)+φ(a+1)+...+φ(b-1)+φ(b)。 用欧拉筛选法O(n)计算出n以内的φ值,存个前缀和即可。 φ(p)=p-1(p是质数),小于这个质数且与其互质的个数就是p-1; φ(p*a)=(p-1)*φ(a)(p是质数且p不能整除a),因为欧拉函数是积性函数,φ(p*a)=φ(p
阅读全文
摘要:题目求小于n不与n互质的正整数的和。 一个结论是小于n与n互质的正整数和=φ(n)*n/2。 因为如果a与n互质,那么n-a也与n互质,即若gcd(a,n)=1则gcd(n-a,n)=1,反证法即可证明。 也就是说小于n与n互质的数是成对的,且它们的和是n,共有φ(n)/2对。 所以小于n与n互质的
阅读全文
摘要:题目问有多少个小于n的正整数与n互质。 这个可以用容斥原理来解HDU4135。事实上这道题就是求欧拉函数$φ(n)$。 $$φ(n)=n(1-1/p_1)(1-1/p_2)\dots(1-1/p_m)\tag{p为n的质因子}$$ 这个通项公式可以通过容斥原理的解法来验证。那么利用这个通项就能在$O
阅读全文
摘要:题目问[1,n]有几个数是$m^k (k>1)$形式。 如果这样考虑,m已知k未知,对于每一个m统计其k的数量即$\lfloor log_mn \rfloor$个,再容斥,然而m太多了,完全不可行。 而k远远比m还少,应该反过来考虑,m未知k已知,对于每一个k统计其m的数量,即$\lfloor \s
阅读全文
摘要:题目。。大概就是有个m*n个点的矩形从(1,1)到(m,n),问从(0,0)出发直线看过去最多能看到几个点。 如果(0,0)->(x,y)和(0,0)->(x',y')两个向量平行,那后面的那个点就看不到了。 因此给出一个点(x,y),判断它能否被看到,就是是否能找到一个大于1的k,使k|x且k|y
阅读全文
摘要:题目求[A,B]区间内与N互质数的个数。 可以通过求出区间内与N互质数的个数的前缀和,即[1,X],来得出[A,B]。 那么现在问题是求出[1,X]区间内与N互质数的个数,考虑这个问题的逆问题:[1,X]区间内与N不互质数的个数。 于是就可以先处理出N的所有质因数{p0,p1,p2,...,pn}。
阅读全文
摘要:题目给一个数字集合,问有多少个小于n的正整数能被集合里至少一个元素整除。 当然是容斥原理来计数了,计算1个元素组合的有几个减去2个元素组合的LCM有几个加上3个元素组合的LCM有几个。注意是LCM。 而[1,n]中能被x整除的数字有$ \lfloor \frac nx \rfloor$个,因为设有$
阅读全文
摘要:题目的代数系统可以看作整数模9973乘法群?然后存在乘法逆元。 于是题目要求$A \div B \pmod {9973} $其实就相当于求$A \times B^{-1}\pmod {9973} $。 只要求出B的逆元就OK了。 计算模n下的乘法逆元可以用用扩展欧几里得算法求解,即解下面的线性同余方
阅读全文
摘要:无符号k位数溢出就相当于mod 2k,然后设循环x次A等于B,就可以列出方程: $$ Cx+A \equiv B \pmod {2^k} $$ $$ Cx \equiv B-A \pmod {2^k} $$ 最后就用扩展欧几里得算法求出这个线性同余方程的最小非负整数解。 1 #include<cst
阅读全文
摘要:线性同余方程$ ax \equiv b \pmod n$可以用扩展欧几里得算法求解。 这一题假设青蛙们跳t次后相遇,则可列方程: $$ Mt+X \equiv Nt+Y \pmod L$$ $$ (M-N)t \equiv Y-X \pmod L$$ 于是就构造出一个线性同余方程,即可对t求解,解出
阅读全文
摘要:题目问$A^B$的所有因数和。 根据唯一分解定理将A进行因式分解可得:A = p1^a1 * p2^a2 * p3^a3 * pn^an.A^B=p1^(a1*B)*p2^(a2*B)*...*pn^(an*B);A^B的所有约数之和sum=[1+p1+p1^2+...+p1^(a1*B)]*[1+
阅读全文
摘要:题目大概是抢劫银行,每家银行都有一个收益和一个被抓的概率,求在被抓概率小于P的条件下能获得的最大收益。 dp[i][j]表示抢劫前i家银行收益为j被抓的最小概率 dp[0][0]=0 dp[i][j]=min(dp[i-1][j],dp[i-1][j-m[i]]+(1-dp[i-1][j-m[i]]
阅读全文
摘要:题目问一个数字字符串的不重复全排列有几个能被d整除。 dp[S][m]表示用字符集合S构成的%d为m的数字字符串个数 dp[0][0]=0 我为人人转移,dp[S+{x}][(m*10+str[x]-'0')%d]+=dp[S][m](x∉S) 最后的结果再除以各字符出现次数的阶乘就是答案了,即dp
阅读全文
摘要:题目是在n*n的棋盘上放k个车使其不互相攻击的方案数。 首先可以明确的是n*n最多只能合法地放n个车,即每一行都指派一个列去放车。 dp[i][j]表示棋盘前i行总共放了j个车的方案数 dp[0][0]=1 转移就是从第i-1行转移到第i行,对于第i行要嘛放上一个车要嘛不放,放的话有n-j-1种方法
阅读全文
摘要:题目问一个合法字符串的字典序是第几个,合法的字符串是指里面的字符严格递增。 先判断合不合法,然后用类似康托展开的过程去求。大概过程就是用组合数算出某长度某前缀有几个,累加起来。 真难一遍写对。。 1 #include<cstdio> 2 #include<cstring> 3 using names
阅读全文
摘要:题目问区间有多少个数字的二进制0的个数大于等于1的个数。 用数学方法求出0到n区间的合法个数,然后用类似数位DP的统计思想。 我大概是这么求的,确定前缀的0和1,然后后面就是若干个0和若干个1的不重复全排列数。。 写得挺痛苦的。。另外A[i][j]表示i个0和j个1的不重复全排列数,即A[i][j]
阅读全文