03 2019 档案
摘要:1 const int maxn = 4e4 + 5; 2 int T, n, m; 3 int f[maxn], vis[maxn], dis[maxn], ans[maxn]; 4 vector vc[maxn]; 5 vector query[maxn], id[maxn]; 6 7 inline int getf(int v) { return v == f[v] ? v...
阅读全文
摘要:结论是:按位置排序好以后,对于真正的答案,走法应该是:依次走向第0个等分点,第1个等分点……这样对于这种等分情况,是最优的调度。
阅读全文
摘要:1.答案要取连续的区间疯狂暗示线段树。 2.外层枚举r,内层枚举l显然过于暴力。 3.考虑内层的优化。dp[i]:以第i位为结尾的答案(长度大于1的)。dp[i] = max(第一种情况,第二种情况)。解释一下,首先我们可以做到求出i前面gap[j] > gap[i],j < i最大的j的位置pos
阅读全文
摘要:用solve(l, r, prefix)代表区间l开始r结束、带了prefix个前缀str[l](即l前面的串化简完压缩成prefix-1个str[l],加上str[l]共有prefix个)的最大值。 每层可以选择: 1.直接“提现”,把起始位和前面的“存款”直接提出来,再计算l+1~r区间的值;
阅读全文
摘要:最小生成树会多样的情况是:两个或多个边等长且连通同样的两个并查集块。 所以可以跑一遍克鲁斯卡尔,每次把当前等长的边数出来,注意不要边找边并查,因为有一部分边是正常跑生成树我们也不会要他的,这种直接跳了;还有一些,是因为你选择了第一个边,然后并在一起了,这时扫到后面的边时他自然会被抛弃。而这种比较委屈
阅读全文
摘要:提交传送门,密码:jwjtxdy(鸡尾酒天下第一) 官方题解 A.二分答案,里面用队列模拟。 1 #pragma comment(linker, "/STACK:1024000000,1024000000") 2 #include <cstdio> 3 #include <cstring> 4 #i
阅读全文
摘要:洛谷1387的进阶版,但很像。 1387要求是“全为1的正方形”,取dp[i][j] = min(dp[i-1][j-1], min(dp[i-1][j], dp[i][j-1]))吧?这个有“只有对角线可以有1”的要求,取的是dp[i][j] = min(dp[i-1][j-1], min(s1[
阅读全文
摘要:一看很像背包,然而值却是会随时间递减的(a - t*b),不能满足无后效性,于是考虑常用手段,先按照优先级排序。 这个优先级怎么定呢?列式子模拟一下。 洛谷题解说得很好了: 说来惭愧,其实这种“组合式”排序我也是第一次见,虽然很好理解: 最后记得各种longlong。
阅读全文
摘要:题目很简单,数据也很小,但是思路不妨借鉴:dp[i][j]代表以(i,j)为右下角的最长正方形边长。 类比一维里面设“以XX为结尾的最XXX(所求)”。 另外define不要乱用!尤其这种min套min,debug两行泪。 当然也可以无脑暴力乱搞了,二维前缀和+二分:
阅读全文
摘要:一眼看过去就x排序扫描一下,y是1e9的离散化一下,每层用树状数组维护一下,然后像dp倒着循环似的树状数组就用y倒着插就可行了。 类似题目练习:BZOJ4653、BZOJ1218
阅读全文
摘要:第一眼喜闻乐见的股票问题dp可以暴力,然鹅时间不允许。 于是考虑怎么贪。 这篇题解说得很生动了。 因为每支股票都有买入的潜力所以肯定都加在优先队列里。 然后考虑的是哪些需要加入两次。这是我第二次见到类似的手法。当它比优先队列队首要大,可以卖,但是因为后面的还没读所以不知道是不是最优。那就先卖着,钱拿
阅读全文
摘要:第一种方法:可以二分最大天数订单的答案然后通过差分求一下是否可行。 第二种方法:无脑插一棵残缺的线段树板子即可:
阅读全文
摘要:样例手写一写很容易发现规律(前后一样的串,则ans+=2),实现起来却忘了string的便捷性,其实根本用不到哈希。
阅读全文
摘要:1.涉及负数时同时维护最大和最小,互相转移。 2.考场上最大最小混搭转移WA,赛后发现如果是小的搭小的,大的搭大的就可过,类似这种: 于是猜测原因的话可能是:最大和最小的不一定是同一种方案,而P1、P2、P3这三种情况转移到现态必须是同一种方案转移过来?
阅读全文
摘要:写得很好的题解 一眼过去很像是:排序,然后从前向后扫,有这个区间时插到树里,过去以后再删除。然后事实也是这样做的…… 具体起来: 1.如果考虑暴力的话,一种想法是枚举左端和右端要选取的区间(如果我们按长度排序的话),那么只要发现当前选取的这些从左到右的区间可以得到m及以上就可以了,没必要特地考虑具体
阅读全文
摘要:输入给出了最小循环节长度,暗示next数组。 然后自己按照自己的kmp板子逆着来一遍就好。
阅读全文
摘要:对于某个位置i,i - Next[i]是循环节长度,i整除(i - Next[i])时是完整的几个循环元。
阅读全文
摘要:查了半天数组越界的RE,才发现自己把ch数组放结构体里是过大的……放全局就A了。 类似区间的dp比较显然,只是用trie树做了优化,使得可以在trie树里一边走一边往上加dp值,不必枚举以前的每个位置了,省去了很多不必要状态。复杂度就O(n*Trie)。 终于比刘汝佳的代码优雅了(弥天大雾)
阅读全文
摘要:题目传送 官方题解传送 1 #include <cstdio> 2 #include <iostream> 3 #include <algorithm> 4 using namespace std; 5 6 const int maxm = 1e5 + 5; 7 int n, m, ans; 8 p
阅读全文
摘要:题目传送 学习的这篇题解。 结论: 1.直观感受一下会发现找到LIS,LIS里的东西相对位置是不会变的,其他的移一移总会排序成功的,所以其他的就是最小集合了,第一问的答案就是n-LIS; 2.寻找字典序第k小的集合,相当于是寻找字典序第k大的LIS,然后把这个LIS删去,就是第二问的答案集合。 前置
阅读全文
摘要:题是水题,学习一下用树状数组求LIS。 先离散化一下,注意去重;然后就把a[i]作为下标,dp[i]作为值,max作为维护的运算插进树状数组即可。 如果是上升子序列,询问(a[i] - 1);如果是不下降子序列,询问(a[i])。
阅读全文
摘要:得到两个结论后为水题:1.进制一定是字母个数,否则这个表列不出来;2.对于某个字母,这行有几个两位数,这个字母的值就为多少。 判error直接暴力一遍即可。
阅读全文
摘要:题目传送 就像题解所说的,写几个可以发现有分成四段的性质:第一段是从n开始往下贪,第二段是个数字,第三段……卧槽好吧真难描述。 然后发现这个数据量可达1e9,所以考虑“二分确定序列+数学计算”的方式解题。 首先二分出第一段的长度,这里我写得丑了,又将某些情况特判了一下;不难发现有了第一段的长度、N、
阅读全文
摘要:题目很水了,但是原地打转的点……虽然不难想到这个坑,但是从数学的角度来讲期望不应该算正无穷嘛……为什么算0啊?
阅读全文
摘要:和ZOJ3329有些像,都是用期望列出来式子以后,为了解式子,设A[i],B[i],此题又多了C[i],然后用递推(此题是树形dp)去求得ABC,最后结果只跟ABC有关,跟列写的期望数组根本无关。 虽然式子很长很冗,但平心而论思维上并不难理解,关键是自信和耐心去带入。ABC的递推式出来了以后,代码就
阅读全文
摘要:传送门 思路:既然无法枚举每个情况,那就枚举每个出现过的权值,加和。那么每个权值出现了多少次呢?用总数减去一次都选不中这个数的次数即可,类似概率的方法。
阅读全文
摘要:传送门 b^ c >= b - c,这个结论应该记住,我还在这里证过…… 这个题就用到了这个结论,假如当前答案集合为S,和为a,异或和为b,当前答案为a+b了。这时又读入个c,该不该加进来?a + c + b^c >= a + c + b - c == a + b,所以一定会使答案不变或更优,所以最
阅读全文
摘要:传送门 结论是:一定是选取最长的那个AB连续子串。 把题面要求的a*b + a + b转化一下成(a + 1)*(b + 1) - 1,即可发现如果选取前缀后缀不连续的两段作为答案,则显然有更优解,即两段中较长的一段作为答案。
阅读全文
摘要:题解 要点: 1.转移方程分三段,这个……有点复杂但是还好吧……大概就是求啥设啥,然后只通过可行的状态过来。在纸上记一记。 2.每层里面必须先求dp[i][i],简直就是我求我自己……用类似进制数那种方式解个方程。 3.居然还有eps特判这事情。果然去掉标准同步以后就不能用puts了,会WA~
阅读全文
摘要:标准期望套路,很水。读题看好是到n就可以停止了。
阅读全文
摘要:要点: 1.期望的套路,要求n以上的期望,则设dp[i]为i分距离终点的期望步数,则终点dp值为0,答案是dp[0]。 2.此题主要在于数学推导,一方面是要写出dp[i] = 什么,虽然一大串但是思维上并不难;然后就是一种解方程的方法,因为都跟dp[0]有关,且dp[0]是个确定的常数,所以设dp[
阅读全文
摘要:排个序,从小到大扫,如果当前这个不能被前面那些小的表示,则加入货币系统。与bzoj某权限的一道POI题有点像,只是那题只能用一次。
阅读全文
摘要:总数是偶数并且其一半可得即可。 bitset的移位可替代原本的数组转移。
阅读全文
摘要:同POJ3744写法都是一样的。 距离太长无意义可以压缩,注意不是随便压的,想一想可以跟%T发生关系。
阅读全文
摘要:思路:一长段概率乘过去最后会趋于平稳,所以因为地雷只有10个,可以疯狂压缩其位置,这样就不需要矩阵乘优化了。另外初始化f[0] = 0, f[1] = 1,相当于从1开始走吧。双倍经验:洛谷1052. 这段代码j要倒着写否则先从i开始的话pos[i] - pos[i-1]就变了,我tm居然WA了一板
阅读全文
摘要:1.不要贪,缩小区间去dp就好。 2.预处理指数。 3.__int128可还行。
阅读全文
摘要:1.还是逆向。 2.状态是还剩红i黑j张时的期望,这样从0,0往R,B推。注意因为是逆着的,所以到了某一步发现期望为负时直接f[i][j]归零,意义是这之后(在递推中算是这之前)的都不摸了,到这就停(根据题意随时可以停手),所以相当于是从这个时候开始摸,所以为0. 3.滚动数组因为是无视j的,所以j
阅读全文
摘要:解法: 首先bfs预处理go数组:可可在j点时聪聪在点i是怎样贪心走的,这是为了之后O(1)获取转移线路。 然后dfs记忆化一下f[i][j],代表从i到j的期望,对于每层:将所有情况的期望值相加。边界值是聪聪与可可在同一个点期望为0、聪聪一步或两步可到可可处期望为1。
阅读全文
摘要:感觉书(Rosen的离散数学,机械工业的)上的做法有些逆向思维了,没有说明为什么要那样构造,以致大多数同学是背板子上的考场。然而其实用同样的思路我们完全可以使用一种让人可以理解的求解生成函数的方法。 听同学说期末考了两道,我就搞了搞,然鹅缓考时老师换题了一道都没考Orz……我个人的这种做法也就没能施
阅读全文
摘要:题目本质:只有能做到一路过关斩将的勇者才能冒泡过来救出女主。 主要代码: 代码解释:一开始输入完就形成一个勇者集合,然而并不是谁都可以坚挺到最后的。从后向前贪心枚举每个人,这个人要是在勇者集合里,说明他一路挺过来了,ok你把女主冒泡上来以后就可以休息了,就ans++;否则视为阻挠之一(因为别人还得能
阅读全文
摘要:起手式: 1.l = 1, r = 0;2.while循环里先用r往右试探,探到了或者到头了就停;3.然后用l往右探,不满足条件了就停;4.更新答案,然后如果发现指针没什么前途了就break出去输出答案。 主代码:
阅读全文
摘要:简单入门版:洛谷1280 时间交叉和倒序处理的思路是相同的,相较之下此题更多的条件是:1.每个任务可以在很多个时间点中选一个去做;2.会有捣乱。 解决方法:1.每个时间点选哪个根据规则的话是固定的可预处理,但这样会发现某一段时间都是选的那个最大的,然鹅实际上只能选一次对吧。但其实没问题,很难讲,总之
阅读全文
摘要:题目本质: 首先有如下结论: 而通过写一写可以发现: 举例来讲,36及其倍数的数,会被1的倍数加一遍,被4的倍数扣一遍,会被9的倍数扣一遍,而为了最终计数为0,需要再加回来一遍,所以在容斥里面是正号。 对于36有:6 = 2 * 3,mu[6] = 1;而同时对比16有:4 = 2 * 2,mu[4
阅读全文
摘要:莫比乌斯题目结(上) BZOJ3994 大佬们推公式的手段是怎么学到的……qwq完全想不到啊qwq 学习的是这篇博客的推公式。 要点节选: 1.结论:d(i*j)是i*j的约数个数,则 2.又用到莫比乌斯函数的性质 3.枚举项的更换。约数整除枚举的和搭配真值式往往可以替代为常数块,而直接枚举符合真值
阅读全文
摘要:1.扫描线扫描x轴,线段树维护y轴。 2.坐标+1,线段树是从1开始维护。然后让边长--,这样就能包含边上的点了。 3.为了保证点在正方形内:在x轴上利用差分的思想,在x出Add(val),在x+r(已经-1了)处Add(-val);在y轴上利用线段树维护1~5001这个区间,在y~y+r上Add(
阅读全文
摘要:随便写一下的搜索,别的OJ深搜就过了,强大的BZOJ成功栈溢出RE了我并使我屈服地用广搜过掉,第一行手动开栈惨遭无视。 广搜: 深搜:
阅读全文
摘要:题目本质:因为只能往南和往东走所以不管怎么组合方案结果都是一样的Orz……我太菜了想不到嘤嘤嘤
阅读全文
摘要:题目性质:1.当前节点空闲则必须做任务,而不是可选可不选;2.然而前面的如果能覆盖当前节点,就可以不选。 解决方法:倒着扫可以很好地解决这两个问题。dp[i]为时刻i可得的最大空闲时间。如果此刻没有任务,则空闲时间+1;否则最大空闲时间等于任务结束节点的最大空闲时间: 总代码main:
阅读全文
摘要:首先是喜闻乐见的几个入门基础题,连题面基本都是一样的,流程是预处理mu函数,得到输入数据后整除分块(如果时间复杂度需要的话),思路主要是套用下图第二个公式: (截图来自电科bilibili上的算法讲堂大家可以去看哦) 洛谷2257 题意:全部gcd(1~n,1~m)为质数的个数。 刚开始不用管他要求
阅读全文
摘要:题目本质:如果答案是i,那么从行和列两维都会满足:以i的倍数分块,矩阵值相同。 一种解决方法: 1.首先题目里说了要在n的约数里找orzorz…… 2.块中需要一整排都相同。用“与前一排相同否?”来判定,而每块的第一排允许与上一排不同。复杂度还是n^2。 行和列都弄一遍以上代码。
阅读全文