随笔分类 - 题解
摘要:洛谷传送门 解题思路 把有馅的面包的数量看做ai/ci,就转化成了多重背包的板子。 为了练习熟练度,于是使用单调队列优化多重背包。 本以为肯定是最优解,没想到竟被一个直接暴力拆成01背包的干翻了。。 不能放弃,于是就手写双端队列,再交了一遍,把它干翻了,拿到了最优解。 AC代码 #include<c
阅读全文
摘要:传送门 解题思路 首先可以发现,无论怎么变,字母的和是不变的。 而且每个位置是多少都行(只要和别超)。 用dp[i][j]表示前i位的和为j的方案数。 然后枚举第j位可能情况(0~25),从dp[i-1][j-k]转移过来即可。 一种思路是先预处理这个dp数组,然后回答询问。 另一种思路是离线处理,
阅读全文
摘要:洛谷传送门 解题思路 先用类似dp预处理出is[l][r]表示l到r这个区间是不是回文串。 然后在把is数组放到二维平面上,每次询问l,r实际上就是询问(l,l)到(r,r)这样一个矩阵的点的数量。 可以用二维前缀和处理出来,O(1)查询。 AC代码 #include<cstdio> #includ
阅读全文
摘要:洛谷传送门 解题思路 最朴素的 dp 为:\(dp_{i,j}\) 为前 \(i\) 个数选 \(j\) 个方案数。 \(O(n^2)\) 的时空复杂度,很显然会炸,所以需要优化。 先考虑空间,第一维可以滚动数组滚掉,因为选的第 \(j\) 个数与上一个数是什么没关系。 再考虑时间上,尝试对于每个
阅读全文
摘要:传送门 解题思路 不得不说,这题恶心到我了,调了一个多小时。 第一次高精度把运算等写在struct里面,感觉良好。但是一定要注意初始化。 再就是高精乘高精最后的位数是两个位数相加,而不是相乘。 AC代码 #include<iostream> #include<cstdio> #include<cst
阅读全文
摘要:传送门 解题思路 我们发现若一个原数i经过若干次op操作后能变成另一个原数j,则i没有存在的必要了(因为j更优)。 于是对于每一个ai,就能找到最小的一个原数(这个也是“性价比”最高的原数)。 因为原数数量很少,所以可以用二进制位来表示,假设消灭一个数字用到的是第i个原数,则将这个数字的值赋为2^i
阅读全文
摘要://第300篇博客祭QAQ 传送门 解题思路 挺好的一道题。 首先可以观察到,若按照水流方向建边,则整张图是个DAG。 第一步:建图。 令水池(0号店)为根。先用单调递减栈求出每个圆盘下面第一个比他大的圆盘,很显然水就往那里流,将这两个点之间连边,最后0号店向栈中剩下元素连边。 第二步:预处理ST表
阅读全文
摘要:传送门 解题思路 从前往后维护一个严格单调递减栈,在弹出元素和入栈的时候更新答案。 但是要注意两人身高相等的情况,所以要记下某元素的个数。 细节还是蛮多的。 AC代码 #include<iostream> #include<cstdio> #include<cstring> #include<cma
阅读全文
摘要:传送门 解题思路 和上一道题基本相同。 但是这个题题面是真的复杂,读了好久才读懂。 关键在于如何建图。 将在第0列可以看做第0个点,第n列可以看做第m+1个点。 这两个特殊的点到其他点的距离为点线垂直距离,其他的点之间的距离为点点距。 还有不同的地方就是两个信号塔之间的距离是两个半径,而0点和m+1
阅读全文
摘要:传送门 解题思路 两种方法: 方法一: 直接按照Kruskal的方法求最小生成树,求的过程中s和t刚刚联通时加的边的大小即为答案。 方法二: 先二分答案,然后跑一遍最短路,要求只能走边权小于二分值的边。 AC代码 #include<cstdio> #include<iostream> #includ
阅读全文
摘要:传送门 解题思路 其实很简单的一个单调栈就可以解决的题,题解里的做法都写的很麻烦。 建立一个强制不为空的单调递减栈,然后运用扫描线的思想可以快速求出面积。 强制不为空是为了保证最左端一定要有柱子。单调递减是因为受到影响某个区域能否存储水的是左面和右面最高的柱子中的最小值。 可以借助下图进行理解: 分
阅读全文
摘要:洛谷传送门 解题思路 方法一: 发现l和r特别大,但是a特别小。 于是令 \(l=0,r=10^{100}-1\),算出一个sum。 然后发现若l和r同时加上一个数x,最后的sum也加上了x。 所以只要我们算出原来的sum与a的差,然后l和r同时加上这个差就完成了。 sum怎么算? 0~9每个数字出
阅读全文
摘要:洛谷传送门 解题思路 按mask二进制位,把物品分类。 设sum[i]为mask共有i位的物品的val的和。 因为若答案的第i位为1,对mask小于i位的物品是没有影响的。 于是我们从低位向高位枚举,这样就保证了后面的决策不会影响前面已经决定了的状态。 因为只要求答案变成相反数,所以只要每一个sum
阅读全文
摘要:##传送门 //别问我为什么现在才发,刚刚翻存库发现了这坑还留着E题没填,懒得填了所以就改成A到D题发上了。。。 ##总结 感觉还好,赛场上A了ABCD题,E题想出来了思路但没来得及实现。 ABCD感觉全是思维题,用不到什么高级算法。 ##A. Contest Start(数学) 洛谷传送门 模拟一
阅读全文
摘要:洛谷传送门 解题思路 在图上很难做这种构造题,所以一种常用的方法是求出其生成树。 在生成树上做就容易很多。 于是这个题就按照 dfs 序建立一颗生成树,记录下每个节点的返祖边。 于是第一问可以根据树的深度判断是否符合要求,符合的话直接输出。 若没有,则易证第二问一定成立: 因为第一问不成立,所以叶子
阅读全文
摘要:洛谷传送门 解题思路 很经典的一个构造题。 从异或的性质入手:a^a^b=b。 于是我们就有了将其变成同一个数的一个策略: 若原来能化成aabbccc这样的一个数列,则可以在345、123位置依次进行一次操作,将其全部变为c。 而这个数列的形式也很容易达到。 从前往后以此在123、345、567进行
阅读全文
摘要:洛谷传送门 解题思路 \(3\) 这个数字很特殊,因为有一个特殊的性质: 走三步一定不会到达深度奇偶性相同的点。 也就是假设原来深度为偶数,与之距离为3的点深度一定为奇数。 于是整张图就按照深度奇偶性划分成了两部分。 第一反应就是相当于二分图染色,把两部分分别染上%3余数为1和2的颜色。 因为余数为
阅读全文
摘要:传送门 解题思路 不合法的情况只有中间有个地方相等而后面不相等。 换句话说就是中间凭空出现了Z。 其他的随便设数字就行。 AC代码 #include<cstdio> #include<iostream> #include<cstring> #include<iomanip> #include<cma
阅读全文
摘要:传送门 解题思路 对于一个数x,以在第一个排列中的位置作为关键值x,以在第二个排列中的位置作为关键值y,以值本身作为第三个关键值z。 将每个数都用一个三元组(x,y,z)表示出来。 最后答案就是满足 \(x_i<x_j,y_i>y_j,\left\vert {z_i-z_j} \right\vert
阅读全文
摘要:传送门 解题思路 数据范围很小,可以直接暴力,但是为了练习而练习,将数据范围自动扩大十倍处理。 公式不好直接求,想办法将其化作可以直接求的公式。 首先把每头奶牛按照v从小到大排序,这样保证了v这一维是有序的,从前向后枚举时,\(max(v_i,v_j)=v_j (i<j)\)。 再去掉x这一维就需要
阅读全文

浙公网安备 33010602011771号