10 2018 档案
摘要:嘟嘟嘟 我真不信这题在洛谷上是一道黄题,起码绿题也行啊…… dp方程不难,dp[i][j]表示前 i 位用了 j 个乘号时的答案。然后转移方程我竟然没想出来(菜的过分)……其实就是枚举第 j 个乘号在哪儿,然后转移方程就是dp[i][j] = max(dp[i][j], dp[k][j] * num
阅读全文
摘要:自己写了一个封装在结构体里的高精度模板,支持的操作有限,但是NOIP应该够用了。 支持一下操作: 1.读入,输出,将字符串转换成对应的高精度数 2.不支持负数 3.高精加、减、乘、高精除以低精。 4.高精取模低精。 5.比较大小 6.取最大值。 1 #include<cstdio> 2 #inclu
阅读全文
摘要:嘟嘟嘟 这虽然是一道水题,然而我Debug了快一个点儿,于是决定在A了之后发篇博客。 这显然是一个有依赖性的背包问题,但是因为这道题一个主件最多只有两个附件,所以只有4种情况: 1.只选主件 2.主件+附件1 3.主件+附件2 4.主件+附件1+附件2 (5.都不选) 而且这四种情况是互斥的,那么这
阅读全文
摘要:嘟嘟嘟 一道非常好的构造题。 我反正是一点思路都没有,最后还是看了题解。 假如n = 2,那么树的重量就是di,j。 然后n = 3,画一个图:,则重量=(d1,3 + d2,3 - d1,2) / 2。 n = 4同理:,加上的应该是(d1,4 + dj,4 - d1,j) / 2 (j < 4)
阅读全文
摘要:嘟嘟嘟 一道人人皆知的dp基础题。我听人讲了无数遍,就是没写。 问题可以转化为找到两条从(1, 1)到(n, m)不相交的路径,使路径上的好感度之和最大。 这道题的关键在于dp的顺序,观察会发现,只要保持这两条路径枚举到同一条对角线上,顺序就对了。于是令dp[k][i][j]表示到第k条对角线,靠右
阅读全文
摘要:嘟嘟嘟 题面挺绕的,“翻译”一下: 1.牧区是一个点,牧场是所有直接相连的点构成的联通块。 2.两个牧区之间的距离是这两个距离之间的最短路,只有直接相连的两个牧区之间的距离是欧几里得距离。 3.牧场的直径:这个牧场中两个相隔最远的两个牧区之间的距离。 4.求添加一条边合并两个牧场之后,使这个新的牧场
阅读全文
摘要:嘟嘟嘟 看n那么小,刚开始我就想暴力dijkstra,结果O(Qnlogn)光荣TLE,竟得了80分…… 正解是floyd。 考虑朴素的floyd,dis[i][j]表示 i 到 j 的最短路,然而最原始的是dis[k][i][j],以前k个点为中继点时 i 到 j 的最短路,于是有dis[k][i
阅读全文
摘要:嘟嘟嘟 这道题的题面相当的迷,我看了半天都没懂。最后看了题解的解释才懂。 他是这么个意思:对于所有能活着走到终点的路径,输出每一条路径中过路费最多的城市的最小值。 那么自然想到二分过路费,然后用dijkstra或spfa判断是否存在一条路径,该路径上的每一个城市的过路费都小于当前二分值mid。用di
阅读全文
摘要:嘟嘟嘟 又刷了一道水题…… 很显然只要判断这个图是否是二分图就行了,判断方法就是染色。如果对于边(u->v),两个点颜色相同,那么就说明图中存在奇环,不是二分图。 统计答案的时候输出两种颜色较小的就行了。 需要注意的是,图可能不连通,或者有些点不存在。 1 #include<cstdio> 2 #i
阅读全文
摘要:嘟嘟嘟 题面很清楚,就是让求最小环。 有两种做法: F1:用带权并查集。将每一条边连接的两个点所在集合合并,如果已经在一个集合,说明形成了环,用dis[x] + dis[y] + 1更新ans。因为图中的边是有向的,所以并查集也必须又向,对于边(x->y),可以规定x所在集合向y和并,那么同时dis
阅读全文
摘要:嘟嘟嘟 打表不难发现,序列的长度以及序列中1的个数都是斐波那契数列。因为第 i 秒1的个数由 i - 1的1和 i - 2的0变换而来,那么f[i] = f[i - 1] + f[i - 2]。序列的长度同理,第 i 秒的序列长度由 i - 1秒的长度加上 i - 1 秒的1变换而来,而i - 1秒
阅读全文
摘要:嘟嘟嘟 应该算一道结论题吧。 首先很明显的一点,就是对于ai,j,我们只用求出ai,1就行了,剩下的就是斐波那契和矩阵快速幂的事。 至于如何求ai,1,用两种方法,但是哪一个我都不懂为啥,网上也没有解释。 F1:斐波那契最小拆分。对于 i,拆分 i - 1:每一次选择小于i - 1且最大的斐波那契数
阅读全文
摘要:嘟嘟嘟 这道题我觉得跟最大子矩阵那道题非常像,都是O(n4)二维前缀和暴力很好想,O(n3)正解需要点转化。 O(n4)暴力就不说啦,二维前缀和,枚举所有矩形,应该能得55分。 O(n3)需要用到降维的思想。先考虑这么个问题:对于一个序列,求区间和是k的倍数的区间个数。有点想法的暴力就是前缀和预处理
阅读全文
摘要:嘟嘟嘟 一道很水的爆搜题,然后我调了近40分钟…… 错误:输入数据最好用cin,因为数字可能不止一位,所以用scanf后,单纯的c[0]为字母,c[1]数字………………………… 1 #include<cstdio> 2 #include<iostream> 3 #include<cmath> 4 #
阅读全文
摘要:嘟嘟嘟 带修改区间第k大。 然而某谷把数据扩大到了1e5,所以用分块现在只能得50分。 分块怎么做呢?很暴力的。 基本思想还是块内有序,块外暴力统计。 对于修改,直接重排修改的数所在块,时间复杂度O(√nlogn√n)。 对于询问,二分答案,然后在每个块内再二分统计小于mid的数有几个,块外暴力统计
阅读全文
摘要:嘟嘟嘟 郑重声明:我的前几到分块题写法上都有点小毛病,以这篇为主! 这道题感觉也是分块的基本套路,只不过卡常,得开氧气。 维护俩:sum[i][j]表示前 i 块中,数字 j 出现了多少次,ans[i][j]表示块 i 到块 j 的答案。这两者都可以在O(n√n)内预处理。方法也比较套路,具体看代码
阅读全文
摘要:嘟嘟嘟 分块好题。 想法其实特别暴力,对于每一个块,都在块内排一个序,这样查询整块的时候二分找大于等于k - add[i]的数有多少。然后块外零散的数就暴力判断好啦。 所以有两个数组b[i][……]:代表第 i 块有哪些数;add[i]是整块加标记。 然后修改的时候,对于零散的数所在块,暴力重构b数
阅读全文
摘要:嘟嘟嘟 分块经典题竟然是一道黑题…… 分块求区间众数的大体思想是对于询问区间[L, R],预处理出这中间的整块的众数,然后统计两边零散的数在[L, R]中出现的次数,最后取出现次数最多且最小的数。 因此需要一个sum[i][j]表示前 i 块中数字 j 出现的次数,ans[i][j]表示块 i 到
阅读全文
摘要:例题地址:嘟嘟嘟 分块其实我早都听说过,而且怎么回事差不多都清楚了,只是一直没有写。现在离NOIP2018也挺近了,考虑到分块有时候确实能水到不少的分,决定这几天写一写。 众所周知,分块就是对于一个询问区间[L, R],属于刚好一个块中的部分就整块处理,多出来的散的部分就暴力处理。令块大小为S,则共
阅读全文
摘要:嘟嘟嘟 自底向上贪心,优先删除每一个儿子中代价最小的一个。 正确性我也不是十分明白,画图的时候发现贪心删边都对,于是试一试竟然AC了…… 1 #include<cstdio> 2 #include<iostream> 3 #include<cmath> 4 #include<algorithm> 5
阅读全文
摘要:嘟嘟嘟 一道很水的黑题~~ 边双缩点后用lca求树上两点间路径即可。 但是比较坑的是这道题是忽略重边的,结果我还特意考虑了重边,然后WA了几发。 还有两个点TLE了,原因是建新图的时候出现了重边。这个重边不是算法的问题,因为边双缩点后不可能有重边,而是写法上的问题:在建无向边的时候,习惯addEdg
阅读全文
摘要:嘟嘟嘟 这道题一看就知道是tarjan。 刚开始我是建无向图,然后边双缩点,判断夫妻是否在一个边双连通分量中。但是这个算法是错的,我也不知道为啥,求助各路大佬。 正确的做法是给每一条边规定方向:夫妻边女->男,情侣边男->女。这样就保证了每一条路径一定是男->女->男->女。最后只用判断每一对夫妻是
阅读全文
摘要:嘟嘟嘟 01分数规划思维题。 题中要求交通总量不减少,那么如果总量增加的话,总费用就会增加,所以一定不是更优的解。那么总量守恒。 这是不是就想到了网络流?对于每一个节点流入量等于流出量。然后就是很有思维的一个转化了:把压缩看成退流,把扩容看成增广。 边(x, y)一次压缩,就建一条y -> x,容量
阅读全文
摘要:嘟嘟嘟 floyd + 01分数规划. 题中要求的是比率最大,那么自然就想到01分数规划。对于在哪几个城镇买卖商品,可以用O(n2 * k)贪心预处理。路程并不是两点间的距离,而是最短路,所以floyd先跑一遍。 因为答案下取整,所以整数二分就行。 此题卡dfs版spfa,只能用bfs版过…… 1
阅读全文
摘要:嘟嘟嘟 一道说难也难说简单也简单的dp题。 我觉得我的(有篇题解)做法就属于特别简单的。 平时遇到环的问题都是断环为链,但这道题给了一种新的思路。 观察一下,最后的答案无非就这两种:xxx--xx xxxx xxx xx 对于第二种,有一个特别好的做法:正着求一遍最大子串和,再倒着求一遍,然后枚举断
阅读全文
摘要:嘟嘟嘟 这竟然是一道贪心题,然而我在不看题解之前一直以为是dp。 首先最优的配对一定是相邻两个建筑物配对,所以我们求出差分数组,就变成了在n - 1个数中选出不相邻的k个数,使这k个数的和最小。 贪心是在回事呢?首先把所有点放在一个小根堆中,然后如果取出一个点ai,就把ai-1 + ai+1 - a
阅读全文
摘要:嘟嘟嘟 这其实是一道贪心题,而不是dp。 首先我们贪心的取有优惠券中价值最小的,并把这些东西都放在优先队列里,然后看[k + 1, n]中,有些东西使用了优惠券减的价钱是否比[1, k]中用了优惠券的物品更划算,是的话就更新。 1 #include<cstdio> 2 #include<iostre
阅读全文
摘要:嘟嘟嘟 一道最短路好题。 首先明确一点,把一条边的边权变成2,等于删去这条边。因为变成2后最短路肯定不会经过这条边,就相当于删去这条边了。 所以题目变成了依次删去Q条边,求每一次删完边后有几个点的最短路变大了。 多做做题就会有这么个思维:删边不好办,然而逆向加边方便多了。所以30做法就是离线逆向加边
阅读全文
摘要:嘟嘟嘟 首先数据范围那么小,那么算法也是相当暴力的。 对于一个点(x, y)所属的联通块,预处理出从这个点出发到这个块外的所有点的曼哈顿距离。复杂度O(n4)。 然后求答案:最少答案不一定是三个联通块两两相连,可能是两个联通块之间搭了个桥,然后第三个联通块连接在这个桥上。因此我们像floyd一样,枚
阅读全文
摘要:嘟嘟嘟 首先看到k只有50,那么就可以开一个数组预处理出来。 sum[u][k]表示节点u到根节点所有节点深度的k次方和,dfs一遍就都搞出来了,预处理复杂度O(n * 50)(快速幂复杂度不计了)。 查询就是lca复杂度,对于路径(x, y),令z = lca(x, y),则ans(x, y) =
阅读全文
摘要:嘟嘟嘟 好题,好题…… 看这个修改和询问,就知道要么是求完dfs序后线段树维护,要么是树剖。又因为这道题都是子树的操作,没有链上的,所以线段树就够了。 然而重点不是这个。这道题最麻烦的是线段树pushdown时对于每一个节点打的标记都不一样,因为每一条边上的能力值不一样。这也是这道题最巧妙的一点:我
阅读全文
摘要:题面好难找:嘟嘟嘟 贪心 + dp。 首先要按bi的降序排序,让每一次减少大的数尽量靠前。为啥咧?于是我们就需要证明:令sum = a1 - (1 - 1) * b1 + a2 - (2 - 1) * b2 + a3 - (3 - 1) * b3 + ……+ an - (n - 1) * bn,整理
阅读全文
摘要:嘟嘟嘟 水贪心。 当经过一个加油站的时候,记下这个加油站能加的油,然后没油的时候从经过的加油站中选择加油最多的加。 1 #include<cstdio> 2 #include<iostream> 3 #include<cmath> 4 #include<algorithm> 5 #include<c
阅读全文
摘要:嘟嘟嘟 这道题其实挺显然的。 首先dijkstra跑出最短路图,然后在最短路图上求最小割。 正确性显然。 需要注意的是,在新图中添加最短路图的边的时候,一定是跑完dijkstra再加边,如果边跑dijkstra边加边,得到的是最短路树,而不是图。我因为这个WA了好几发。 1 #include<cst
阅读全文
摘要:嘟嘟嘟 线段树好题。 其实挺水的,想暴力怎么做:每一次从这个点开始向两边扩,直到遇到第一个摧毁的房屋。 那么把暴力改成倍增,然后线段树查询区间和是否为0。时间复杂度O(nlog2n)。 题解好像有线段树的O(nlogn)的做法,但是特别麻烦,也没怎么看懂。 1 #include<cstdio> 2
阅读全文
摘要:嘟嘟嘟 二分好题。 怎么二分呢?反正我是没想出来。 看了题解。 因为只有一个为奇数的点,所以对于一个位置x,求出区间[0, x]的教总和,如果为奇数,说明x取大了;否则x取小了(妙啊)。 虽然答案在int内,但是L + R可能会爆int,导致有几个点TLE了,所以还是都开long long 吧。 1
阅读全文
摘要:嘟嘟嘟 一道不错的题,解法不少。 最易于理解的是最小生成树的做法: 首先每两个点之间都连一条长度为这两个点的距离的边,形成完全图。 然后跑最小生成树,直到剩k个联通块,这时候合并成k - 1个联通块的边的长度就是答案(注意,是连接两个联通块的边,否则就不是部落间的距离了)。 正确性很显然。因为这保证
阅读全文
摘要:嘟嘟嘟 首先看到这种序列的问题,我就想到了逆序对,然后就想如何把这道题转化。 首先要满足这个条件:ai <bi。那么我们把所有数按第一次出现的顺序重新赋值,那么对于新的数列,一定满足了ai < bi。 因为要转换成逆序对,所以先出现的数赋成更大的值,得到了ai > bi。 接下来的操作都是在新的序列
阅读全文
摘要:嘟嘟嘟 考虑dp。 对于ai,和他能匹配的bj只有9个,所以我们考虑从这9个状态转移。 对于ai 能匹配的一个bj,当前最大的匹配数一定是[1, j - 1]中的最大匹配数 + 1。然后用树状数组维护前缀匹配数最大值就行了。 1 #include<cstdio> 2 #include<iostrea
阅读全文
摘要:嘟嘟嘟 题面很迷,看这个吧。 首先暴力很简单,从每一个叶子节点开始爬,直到那条特殊的边。 正解稍微想想就能搞出来:(x, y)这条特殊的边把整棵树分成了两部分,然后我们分别从x, y开始在他的那部分子树dfs,求出到达节点v时满足条件的一个区间。因为从v到u是向下取整,那么反过来合法的区间就是[k
阅读全文
摘要:嘟嘟嘟 刚开始我以为如果这头牛撞开一个干草堆的话,获得的冲刺距离只有新增的部分,但实际上是加上原来的部分的。 暴力很好写,区间排完序后一次判断每一个区间是否能逃脱,复杂度O(n2)。 优化想起来也不难:如果一个区间 i 能逃脱,区间 j 能到达 i,则 j 也能逃脱。所以对于每个区间开一个标记数组,
阅读全文
摘要:嘟嘟嘟 01分数规划之最优比率环。 主要是发一下基于dfs的spfa。跑的贼快,原来总用时2000多ms还TLE了两个点,改成dfs后总用时直降43ms! 1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include
阅读全文
摘要:嘟嘟嘟 这道题很多题解说是二分图染色+模拟,然而其实一个贪心就够了。 如果s1或s2当前栈顶的元素刚好是排好序后的第k个数,那么自然要弹出栈;否则贪心的放入s1栈,同时要判断合法性;如果不行,再看看能否放入s2;如果还不行就输出0。 判断能否放入s1就是看看这个数之后如果有超过两个比s2栈顶元素还大
阅读全文
摘要:其实就是怕忘了……这里发一下线性求逆元以及阶乘的逆元的板子。 线性求逆元 逆元是啥我就不说了,但是线性递推式怎么来的我还是可以证明一下的。 求 i 的逆元,假设[1, i - 1]的逆元已知。 设 p = k * i + b,则 b = p % i, k = ⌊p / i⌋ 。 则k * i + b
阅读全文
摘要:嘟嘟嘟 刚开始我以为是kmp+dp,后来发现其实没那么复杂。 令dp[i][j][h][0/1]表示A串到第 i 位,B串到第 j 位,其中A串取了k个子串时,Ai 取/不取的方案数。那么转移方程就很容易的写出来了: dp[i][j][h][0] = dp[i - 1][j][h][0] + dp[
阅读全文
摘要:嘟嘟嘟 这题刚开始是什么思路也没有,关键是不知道怎么解决序列反转的问题。 然后我就想到如果暴力反转一个序列的话,实际上就是不断交换数组中的两个数ai和aj,同时要满足交换的数不能交叉。 然后又看了一眼(岂止一眼)题解,因为ai <= 50,所以令dp[i][j][L][R]表示区间[i, j],mi
阅读全文
摘要:嘟嘟嘟 看到绝对值最小这种逼近的问题,应该能想到二分。 容易发现,随着W的变大,符合条件的矿石越来越少,即满足单调关系。因此我们二分W,然后在W确定时求出x = ΣYi,如果x >= S,说明W取小了,向右二分;否则向左二分。每一次都更新答案。 求x用前缀和就解决了。 时间复杂度:二分O(logn)
阅读全文
摘要:嘟嘟嘟 一道最小割的题。 所有跟源点连边的点代表被解雇了,跟汇点连边的代表没被解雇。 因为割掉每一条边代表付出一定的代价,所以应该先把正收益加起来,然后再减去最小割。 那么对于所有解雇收益为正的点,从汇点连一条容量为该收益的边,割掉这条边代表不解雇这个人了,付出的代价就是这个收益;对于收益为负的点,
阅读全文
摘要:离NOIP2018越来越近了,然而我仍有一些没有彻底弄懂的地方,有点慌,所以准备从这周开搞搞基础。 不说别的了,先把这篇总结写完。 Day1的题感觉不是很难,每一道题的暴力也都可写,总的来说难度跟noip差不多吧。 有一个想吐槽的地方,就是为啥题目把算法都告诉了…… T1 backpack 期望得分
阅读全文
摘要:嘟嘟嘟 一道最小割典型题。 对于一个模块x,我们把他拆成两个点x1, x2:从源点向x1连一条ai的边,割掉他代表x在A机器上的花费;同理x2向汇点连一条bi的边,割掉他代表在B机器上的花费。因为每一个模块必须完成,所以x1和x2连一条INF的边,割掉他的代价是无穷的。 题中还说如果x和y不在同一机
阅读全文
摘要:luogu:嘟嘟嘟 poj:嘟嘟嘟 这是一道简化模型好题,这篇论文讲的太好了:网络流建模汇总,感觉我已经无需多讲。 但我这个代码没有合并相同边的容量,不过节点数是最少的。 1 #include<cstdio> 2 #include<iostream> 3 #include<cmath> 4 #inc
阅读全文
摘要:嘟嘟嘟 最小覆盖数板子题。 每一行看成一个点,每一列也看成一个点,如果(x, y)有障碍,就从点x向y连一条边,这样就构成了一个二分图。然后求最小覆盖数,跑最大匹配。 求最小覆盖数是因为对于这条边连接的连个点,选择任意一个就行,所以求最小覆盖数。 1 #include<cstdio> 2 #incl
阅读全文
摘要:嘟嘟嘟 最小路径覆盖板子题。 建二分图,然后跑Dinic(因为我不会匈牙利),然后ans = n - maxflow()。 主要是发一下用链前存图的写法。(好像比vector短一点) 1 #include<cstdio> 2 #include<iostream> 3 #include<cmath>
阅读全文
摘要:嘟嘟嘟 规定第 i 个人只给第 i - 1个人糖果,为xi个,因为若xi < 0,说明第 i - 1个人给第 i 个人|xi|个。那么ans = |x1| + |x2| + |x3| + …… +|xn| 那么就可以列出:a1 - x1 + x2 = ave, a2 - x2 + x3 = ave,
阅读全文
摘要:嘟嘟嘟 首先令E点表示在E点离开传送带AB,F点表示在F点上传送带CD,则总用时为:dis(A, E) / p + dis(E, F) / r + dis(F, D) / q。然而这是一个有两个变量的函数。于是有一个不错的方法:把E成参数,然后就变成了一个形如f(x) = √(t2 + x2) -
阅读全文
摘要:嘟嘟嘟 题面:给一个序列中的,每一个数都减去一个实数x,使得到的新序列的max(最大连续和,|最小连续和|)最小。(|ai| <= 10000) 感性的想想,会发现最大连续和随x变大而变小,最小连续和随x变大而变大。 严格的证明:首先对于任意区间[L, R],|∑ai - x|一定是一个绝对值函数,
阅读全文
摘要:嘟嘟嘟 中序遍历有一个特点:序列[1, n]是一个中序遍历,i 是根节点,则[1, i - 1]是他的左子树的中序遍历,[i + 1, n]为右子树的中序遍历。所以就想到了区间dp,对于[i, j]枚举根节点k,则dp[i][j] = max(dp[i][k - 1] * dp[k + 1][j]
阅读全文
摘要:嘟嘟嘟 一道三分入门题。 参考二分,三分就是每一次把区间分成三段,然后舍弃一段,不断缩小范围直到一个点。 一般用于求单峰函数的最值问题。 这道题发现V和r成一次函数的关系,因此三分r。 下面给出三分板子。其实三分的m1, m2没必要把区间分成均等的三份,只不过这样写的方便。 1 #include<c
阅读全文
摘要:嘟嘟嘟 一道树形dp题。 令dp[u]表示以u为根时所有点的深度之和。考虑u到他的一个子节点v时答案的变化,v子树以外的点的深度都加1,v子树以内的点的深度都减1,所以dp[v] = dp[u] + (n - siz[v]) - siz[v]。于是dp式就搞出来了。 所以两边dfs,第一遍求siz和
阅读全文
摘要:嘟嘟嘟 总算把几个月前WA的题A了。 看到树上路径的操作,就能想到树剖。 不过要是给每一个宗教都开一个线段树的话肯定会MLE,所以我们动态开点就行啦。 然后debug了一小会儿,全是因为一些zz小错误,什么连接表遍历出边写错了,查询最大值从查询区间和复制下来却没改完……对了,这两个最好分开写,虽然代
阅读全文
摘要:嘟嘟嘟 暴力不难想:一种是以每一个骑士为主,一步步向上爬直到死了;一种是以每一个城池为主,统计哪些骑士在这座城池中死了,然后剩下的骑士再转移到他的父亲节点。 考虑优化:因为城池构成了一个树形结构,相对于骑士来说结构比较固定。因此我们想办法优化第二个暴力:每一个节点建一个小根堆,一直弹出堆顶直到堆顶骑
阅读全文
摘要:嘟嘟嘟 这道题要是直接想正解实在太难了,还得从一些特殊的情况一点点入手。 1.如果ai本身就是递增的,那么令bi = ai即最优解。 2.如果ai严格递减,则b1 = b2 = b3 = ……= bn = 中位数为最优解。这个可以用初中的几何证明:把 |bi - ai| 想象成数轴上两点间距离,那么
阅读全文
摘要:嘟嘟嘟 人生A了的第一道左偏树题。 题面太长了,概括一下:给定一棵 n 个点的有根树,每个点有两个属性 Ci 与 Li,现在你要指定一个点 R,并在 R的子树内选取若干点(可以选取 R 自己),使得这些点的 Ci 的和不超过 M,而一个选取方案的价值为选取人数 * LR,求选取方案的最大价值。 假设
阅读全文
摘要:嘟嘟嘟 题目大意:一群牛参加完牛的节日后都有了不同程度的耳聋(汗……),第i头牛听见别人的讲话,别人的音量必须大于v[i],当两头牛i,j交流的时候,交流的最小声音为max{v[i],v[j]}*他们之间的距离。现在有n头牛,求他们之间两两交流最少要的音量和。 首先我们把v[i]从小到大排序,这样扫
阅读全文
摘要:嘟嘟嘟 二维偏序。 按y排序,在x方向上用树状数组维护前缀和。 因为输入保证排好序了,所以y没什么用。 x可以等于0,所以最好在输入的时候加1,否则会TLE…… 1 #include<cstdio> 2 #include<iostream> 3 #include<cmath> 4 #include<
阅读全文
摘要:嘟嘟嘟 看到回文串,就想到了manacher。而且这道题只用求长度为奇数的回文串,所以不用添加字符,在原回文串上跑一边即可。 需要注意的是,如果一个回文串的半径是r,那么这个回文串同时也包含了r - 1, r - 2,……1的回文串,因为r表示的是以 i 为回文中心的最长的回文串。于是我们开一个桶,
阅读全文
摘要:嘟嘟嘟 因为只有三个字符串,所以就有一个比较暴力的做法:枚举这三个串所有排列,然后对于每一个排列,减去这三个串两两的公共部分的长度,更新答案。 求公共部分自然想到kmp:比如s[1]接在s[0]后面,那么我们只用把s[0]和s[1]匹配,把s[1]当做模式串,s[0]当做文本串,当s[0]匹配到头的
阅读全文
摘要:嘟嘟嘟 题目翻译:有n个数,m个限制条件。每一个限制条件形如:1.x y gt c:表示ax + ax+1 + … +ay > c。2.x y It c:表示ax + ax+1 + …… +ay < c。有解输出“lamentable kingdom”,否则输出“successful conspir
阅读全文
摘要:嘟嘟嘟 题面:有n条公路一次连接着n + 1个城市,每一条公路有一个堵塞时刻a[i],如果当前时间能被a[i]整除,那么通过这条公路需要2分钟;否则需要1分钟。 现给出n条公路的a[i],以及m次操作。每一次操作:1.C x d:将第x条的堵塞时刻改为d。2.A x y:询问从城市x到城市y的所需时
阅读全文
摘要:扫描线算是线段树的一个比较特殊的用法,虽然NOIP不一定会考,但是学学还是有用的,况且也不是很难理解。 以前学过一点,不是很透,今天算是搞懂了。 就以这道题为例吧:嘟嘟嘟 题目的意思是在一个二维坐标系中给了很多矩形,然后求这些矩形的总覆盖面积,也就是面积并。 我就不讲暴力,直接切入正题吧。 扫描线,
阅读全文
摘要:嘟嘟嘟 题目大意:n个人排队,每一个人有一个pos和一个val,表示这个人要插到第pos这个位置,pos以及pos之后的人就都往后挪一位,最后输出整个序列的val。 后面的人可能会对前面的人造成影响,因此可以想到离线逆序插入。然后用线段树维护当前区间的空位数量,那么每一个人的pos就变成了要插入第p
阅读全文
摘要:嘟嘟嘟 这道题正解是怎么对的其实我也不清楚,总之靠感性理解吧。 首先当然要把1到n / 2的素数都筛出来,因为两两能配对的数一定都是这些素数的倍数。这也就说明对于(n / 2, n]的素数,他们一定不能配对,所以就不用筛他们了。 筛完后我们考虑怎么配对,对于一个素数的所有倍数xi,他们任意两个都可以
阅读全文
摘要:嘟嘟嘟 题面就是说,解方程 a + c * x Ξ b (mod 2k) 然后变个型:a + c * x - 2k * y = b - a。用exgcd求解即可。 刚开始我以为b - a还要正负讨论,但其实不用,因为正负数取摸结果不一样。 然后我调了半天是因为当a = b = c = k = 0的时
阅读全文
摘要:嘟嘟嘟 我一眼就知道是exgcd,但是还是想的不太周全。 应该分两种情况:1.a在左边,b在右边。那么得出方程ax - by = d。然后就是正常的exgcd求解了: 解得ax + by = (a, b)的解x', y'。 算出ax + by = d的解x = x' * d / (a, b) 算出x
阅读全文
摘要:嘟嘟嘟 题目大意:给一个数x,让你求这样一个最长的序列,以及最长的序列的种数: 1.第0项为1,最后一项为x(序列长度不算这两项)。 2.每一项都是x的因子。 3.对于任意的ai和ai+1,ai < ai+1且ai | ai+1。 每一项都是x的因子,那么先把x分解质因数,用这些数凑成的数一定都是x
阅读全文
摘要:嘟嘟嘟 题中让求相交的回文串的对数,不太好求。不过求不相交的回文串对数就简单多了。 因为对于一位 i,在这一位不相交的回文串对数numi = 以这一位结束的回文串个数 ×在这一位后面开始的回文串个数。用manacher跑一遍 + 差分,然后维护一个开始的回文串的后缀和就好了。 然后统计回文串个数su
阅读全文
摘要:嘟嘟嘟 这道题,我的大致思想是先用manacher求出所有回文串,然后用刚好拼接在一起的两个回文串的总长的最大值更新答案。 manacher是O(n)的,但是暴力的枚举回文中心能达到O(n2),所以得想办法优化枚举。 令pre[i]表示离 i最远且左半部分包含 i 的回文串的回文中心的位置,suf[
阅读全文
摘要:嘟嘟嘟 manacher算法能在O(n)时间内解决有关回文串的问题,而且算法本身也不长,noip前学学也无妨(虽然不太感觉能考)。 算法流程: 首先为了避免奇偶讨论我们在整个串前面添加一个字符‘@’,再整个串后面添加一个和 ‘@’不一样的字符(比如‘%’),然后每两个字符之间添加一个‘#’,比如aa
阅读全文
摘要:嘟嘟嘟 首先这就是一道AC自动机板儿题。 可能有重复的模板串情况,所以我每一个节点开一个vector,记录是第几个模板串的结尾。 对于主串,如果不是大写字母,就都默认是第26条出边('A' ~ 'Z' : 0 ~ 25)。 最后也是最重要的:题面不告诉你有多组数据。 1 #include<cstdi
阅读全文
摘要:嘟嘟嘟 翻译洛谷有,但输入格式好像不太一样,注意一下。 这题我看了5分钟才把题看懂,知道是有关AC自动机的,然而就是想不出来。 我一直觉得应该把这张图建一个trie树,毕竟图作为主串,然后看模式串是否出现在主串里。 然而实际上是模式串建trie树。 然后题中说要判断8个方向是否有模式串出现,那么就把
阅读全文
摘要:嘟嘟嘟 这个和某谷的AC自动机模板简单版差不多。 但还是要注意几点的: 1.这个是统计出现次数,而不是是否出现,所以在查询的时候加上这个节点的val后,不能把val标记为-1。那么也就可以说查询的时间复杂度能比简单版的稍微第一慢一点。 2.考虑k个一样的模式串:刚开始我想的是每一个节点开一个vect
阅读全文
摘要:对于已经学了3,4遍kmp的我,竟然感觉AC自动机不太难。 kmp是解决单模式串匹配的问题,就是只能判断一个字符串是否为另一个字符串的子串。AC自动机是解决多模式串匹配的问题,能判断多个字符串是否同是为一个字符串的子串。 先从最暴力的想法入手:首先肯定要把所有模式串建成一棵trie树,然后枚举查询字
阅读全文
摘要:嘟嘟嘟 题面:把一句话加密:1.所有字母变成小写。2.翻转所有单词。3.去掉空格。然后给你一句加密后的字符串以及一些出现在原句和没有出现在原句的单词,让你还原原句。注意,每一个单词可以使用多次,如果有多个答案,输出其中任意一个。 trie树好题…… 首先都能想到的是把所有单词建成一棵trie树,然后
阅读全文
摘要:嘟嘟嘟 刚开始我以为要用模板串建trie树,发现m只有100,而n有100000,所以应该用带符号的串建树。 然后模板串的长度很小,所以在trie树上dfs即可。 这道题串可能有重,比如有一个t?k和t?k,应该输出2和3。而且因为*可以是空字符,所以,对于每一个询问的答案也应该去重。 1 #inc
阅读全文
摘要:嘟嘟嘟 我们可以把AB看成S,则要找的串可以写成SSSSA或者SSSSS。假设S出现了Q次,那么A出现了Q % k次,则B出现了 Q / k - Q % k次. 当ABABA是SSS的形式时,B可以为空字符,判断Q / k - Q % k>=0。 当ABABA是SSA的形式时,判断Q / k - Q
阅读全文
摘要:嘟嘟嘟 用kmp求最短循环节出现的次数,失配数组的妙用。 不想画图了~~ 举个栗子,s = "ababab",则f[6] = 4,即s[1~4] == s[3~6],全写出来就是s[1] = s[3]. s[2] = s[4], s[3] = s[5], s[4] = s[6],然后就发现这些等式有
阅读全文
摘要:嘟嘟嘟 今天又学了一遍kmp,总算是理解了。虽然这就是一道板子题,但我还想叨叨一会儿。 kmp匹配的大致过程就是对于主串A,我们总想让A[i - j + 1 ~ i]和模式串B的最长前缀B[j]相等。匹配的时候如果A[i]和B[j + 1]不等,就把j = f[j],因为f[j]是保证了A[j -
阅读全文
摘要:嘟嘟嘟 一道比较经典的欧拉回路的题。 首先n最大为C(2, 52),所以用邻接矩阵存图最好,这样还能保证得到的欧拉路径字典序最小。 对于每个字母对,就连一条无向边。然后跑欧拉路径或回路即可。 刚开始我只判了欧拉回路,忘记还可能存在欧拉路径,于是WA了几发。 1 #include<cstdio> 2
阅读全文
摘要:嘟嘟嘟 正如题目所述,这就是一道板子题。 不过身为一道板子题,数据还是非常负(du)责(liu)的。 一点点讲。 1.判断欧拉图 判断无向图是欧拉图就是所有点的度数都是偶数;判断有向图是欧拉图就是所有点的入度等于出度。 但是仅这样是不行的,还有判断图是否连通。这个可以用并查集实现。或者是看dfs经过
阅读全文
摘要:嘟嘟嘟 今天学了个欧拉回路~ 理解起来感觉不是很难,证明竟然也看懂了。 首先,得认识这么几个名词: 1.欧拉路径:图中存在一条从s到t的路径,使这条路径经过了所有的边,且每条边之经过一次。简单来说就是这张图可以一笔画出来. 2.欧拉回路:就是欧拉回路中s == t。 3.欧拉图:存在欧拉回路的图。
阅读全文
摘要:嘟嘟嘟 一个比较经典的的2-SAT问题。 因为c只有0或1,所以每个数的取值只有0或1. 把每一个点拆点:x0表示x取0,x1表示x取1. 然后分情况连边: 1.x AND y == 0:连(x1, y0), (y1, x0) 2.x AND y == 1:连(x0, x1), (y0, y1)。这
阅读全文
摘要:嘟嘟嘟 大佬们都说这是2-SAT入门题,然而对于刚学2_SAT的本菜鸡来说半天才理解…… 题面:新娘和新郎不能坐在同一侧,妻子和丈夫不能坐在同一侧,有**关系的两个人必须至少一个坐在新娘一侧,问方案。 对于有**关系的两个人x, y,如果x坐在新郎一侧,那么y必须坐在新娘一侧,从而得出y的妻子(丈夫
阅读全文
摘要:嘟嘟嘟 SAT以及2-SAT问题是啥以及定义我就不叨叨了,直接讲怎么求。 比如有一个条件:a || b,就是说a,b必须至少有一个为真。这个可以转化为(!a => b && !b => a),那么就可以连边建图了:首先把每一个点x拆成x和!x,那么对于上述条件,连两条边(!a -> b)和(!b -
阅读全文
摘要:嘟嘟嘟 首先强连通分量缩点。 然后A就是求有多少个如度为0的点,B就是求如度为0的点和出度为0的点的最大值。 特判强连通图的情况。 1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cmath> 5 #i
阅读全文
摘要:嘟嘟嘟 求出[L, R]中每一个数的约数再相加必定会超时,所以换一种思路:枚举约数d。 对于一个约数d,能整除他的数可以写成k * d, (1 <= k <= ⌊n / d⌋),因此约数d对答案的贡献是⌊n / d⌋ * d,f(i)表示[1, i]的约数和,那么f(n) = ∑⌊n / i⌋ *
阅读全文
摘要:嘟嘟嘟 L, R很大,所以哪怕用线性筛也会T飞的,但是看到R - L不太大,因此我们可以先筛出[1, √R]所有素数,然后用这些数筛出[L, R]的所有合数。具体做法是对于每一个pi,筛去所有的 i * pi (⌈L / i⌉ <= i <= ⌊R / i⌋)。然后遍历[L, R]的所有素数更新答案
阅读全文
摘要:嘟嘟嘟 做这道题得自己推出这么几个结论…… 1.最大的反素数一定是约数个数最多的的数中最小的那个。 这个其实很好想:根据定义,$g(x)$要大于任意的$g(i)$,而不是大于等于。 2.1~n中任意一个数的不同的质因子不会超过10个,且所有质因子的指数之和不会大于30. 最小的10个质数的乘积刚好大
阅读全文
摘要:嘟嘟嘟 这题竟然暴力就过了…… 在[1, sqrt(b1)]中枚举x,判断x | b1,如果成立,再判断lcm(x, b0) == b1 && gcd(x, a0) == a1,并计数。 复杂度O(n * sqrt(b1) * logb1)。 1 #include<cstdio> 2 #includ
阅读全文
摘要:嘟嘟嘟 偶然看到的这道题,觉得有点意思,就做了。 首先题里说修改后的数列只能出现修改前的数,那么状态之间的转移也就之可能在这些数之间。 令f[i][j]表示第 i 个数改成原序列第 j 小的数时的最小步数。容易得出:f[i][j] = min(f[i - 1][k]) + abs(a[i] - b[
阅读全文
摘要:嘟嘟嘟 【欧拉函数】 大致题意:如果知道f(a, b),就可以求出f(a * k, b * k)。现给出一个n,求至少需要知道几个二元组(a, b),使所有的f(x, y)都能求出来。(1 <= x, y <= n) 首先能确定的是gcd(a, b) = 1。不妨假设b >= a,那么如果b一定,至
阅读全文
摘要:嘟嘟嘟 树剖板子题。 1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cmath> 5 #include<cstring> 6 #include<cstdlib> 7 #include<cctype>
阅读全文
摘要:嘟嘟嘟 枚举a, 求出b,然后代入看a和b是否是对的。 具体方法:通过x1和x3可以求出b : x2 = (a * x1 + b) % mod (1) x3 = (a * x2 + b) % mod (2) 把(2)代入(1)得 x3 = (a2 * x1 + a * b + b) % mod 整理
阅读全文
摘要:嘟嘟嘟 令dp[i]表示在n个人中,有 i 个人获得第一名的方案数,转移方程为dp[i] = C(i, n) * dp[n - i]。C(i, n)就是从n个人中选 i 个第一,那么剩下的n - i 个人必须都不是第一,所以就从dp[n - i]转移过来。 因为模数不是质数,所以O(n2)杨辉三角递
阅读全文
摘要:嘟嘟嘟 看到最后让求一个比值,应该得往01规划上去想。令x = ∑v[i] / ∑c[i],则x * ∑c[i] = ∑v[i], ∑(v[i] - x * c[i]) = 0. 于是可以二分x(注意是实数二分),每一个点得到新的权值v[i] - mid * c[i],然后树上背包求最大值。如果最大
阅读全文
摘要:最近想刷一刷数论的题,就先找了道简单的入手。 这一看就是exgcd求不定方程。 首先可以列出来:x + m * k ≡ y + n * k (mod L) 化简:x + m * k - y - n * k = p * L (m - n) * k - p * L = y - x 令a = m - n,
阅读全文
摘要:国庆5天乐在今天终于结束了,怀着明天又得上学的心情,我开始写这篇题解。 T1 wzoi 期望得分:100 实际得分:100 首先题面非常的迷,我看了十分钟都没懂,看完T2,T3后再回来看T1,总共看题看了20分钟才懂…… 我发现最优的答案一定是回文串,那么ans = 10 * (len / 2),于
阅读全文
摘要:Day 1 今天终于见到了膜拜已久的雪舞喵巨佬,一直以为他是一个高冷的人,没想到他又萌又可爱,还是个段子手!嗯……他说从某位大佬那里得知我们什么都学了(然而仍是啥也不会),于是就要讲一讲跟竞赛无关的…… 然后我们听了一上午【语言基础】。什么输入输出,文件操作,常数优化,gdb调试……不过都是一些特别
阅读全文
摘要:一道NOIP2018模拟的DayT3 原本没打算做,结果Dukelv秒了(强的过分),就来看看。 状压dp。令dp[i][j]表示在状态 i ,最后选了第 j 个数是的最大分值。 所以我们枚举状态 i,在枚举最后一个选的 j,再枚举下一个要选的k,容易得出: dp[i | (1 << (k - 1)
阅读全文
摘要:看是老家的中学出的题目,会不会可爱一点呢? 嗯,真可爱,可爱的我两道题文件都错了。 因为最近我把文件输入输出改成#ifndef和#endif的形式了,然后放在了一个函数里,结果敲板子的时候忘调用了…… 鬼知道为啥我T1敲了上去。 T1 rps 期望得分:20 实际得分:40 看了看题,发现这其实构成
阅读全文
摘要:今天的题自认为比Day1简单一些,而且出的质量很高(虽然数据有点水)。 T1 a 期望得分:30 实际得分:30 首先不得不吐槽一下:这题名字起的真糊弄。 说下题吧,一拿到题发现O(n2)暴力就是送的,枚举起始点,再O(n)扫一遍。15分钟敲完后开始打表想想正解,发现对于一个数s[i],他对旋转k次
阅读全文
摘要:嘟嘟嘟 这道题就是区间加一个等差数列,然后最后求每一个数的值。 O(n)做法:二阶差分。 其实就是差分两遍。举个例子 0 0 0 0 0 0 0,变成了 0 2 4 6 8 0 0。第一遍差分:0 2 2 2 2 -8 0,然后在这个差分数组上在进行差分,得到 0 2 0 0 0 10 8,完事。
阅读全文
摘要:T1,T3我就不说啦,反正也不会。主要想讲的是T2. T2用了一个神奇的算法:折半搜索。 因为这个坑爹的数据范围告诉我们暴搜或是状压会TLE,而一半刚好能卡过去。 折半搜索其实跟暴搜没什么区别,就是折了半(废话)。拿这道题为例,暴搜就是在长度为2n的序列中找出所有长度为n的序列不妨设为s1, 那么剩
阅读全文
摘要:今天的模拟也太毒瘤了…… T1 permutation 期望得分:20 实际得分:20 我刚开始是这么想的:T1嘛,应该不会太难,想想正解吧。本来想求出所有不合法的情况,然后用n!减一下。于是用dp,但发现这玩意是有后效性的,硬推了将近一个点儿,最终还是放弃了。只能20分全排列暴力了…… 正解完全没
阅读全文
摘要:在十一国庆期间,我们给祖国过生日,祖国妈妈可高兴了,让gg特意为我们准备了一场模拟! 其实这一次的模拟不算太毒瘤,部分分还是可以拿到的,不过考完调正解的时候调到崩溃…… T1 matrix 这道题起手就是30。 然后我憋了一会儿:这题有一个特别的地方,就是所有询问都在修改之后,那也就应当把所有修改做
阅读全文
摘要:嘟嘟嘟 a / b % p = a * b-1 % p,又因为p是质数,根据费马小定理=> a * b-1 % p = a * bp-2 % p。 看数据范围,不想写高精,就改了一下快读。 1 #include<cstdio> 2 #include<iostream> 3 #include<cmat
阅读全文

浙公网安备 33010602011771号