随笔分类 - 题解
摘要:传送门 解题思路 可以举例观察得到:131这种结构可以省去一次,而313不行。 所以就用单调栈维护一个自栈顶到栈底严格递减栈,每次若栈顶大于a[i],则栈顶出栈并且ans++,若相等则出栈并且ans不变。 可以把a[n+1]设置为0.(即最后让所有元素出栈) ##AC代码 #include<iost
阅读全文
摘要:传送门 加强版传送门 解题思路 首先很显然,对于同一种色调的客栈来说,从小到大枚举左端点 L,符合要求的客栈 R~N 一定是满足 R 单调递增的。 而且选择的咖啡店也是随着 L 的增加间断着递增。 所以就可以双指针(准确说是多指针)将时间复杂度降至O(n)。 双倍经验双倍快乐 AC代码 #inclu
阅读全文
摘要:传送门 解题思路 左右指针,每次 \(a[r]-a[l]=c\) 对答案贡献就是 \(相同的a[l]的数量\times相同的a[r]的数量\) 当然也可以用map水过去…… 记得ans要开long long。 AC代码 #include<iostream> #include<algorithm> #
阅读全文
摘要:传送门 解题思路 先把x和y分别离散化,然后求一下前缀和,枚举栅栏,求一下即可。 AC代码 #include<iostream> #include<algorithm> #include<cmath> #include<cstdio> #include<cstring> using namespac
阅读全文
摘要:传送门 解题思路 很巧妙的一个题。 朴素的dp方程肯定都能列出来,关键是离散化如何操作。 可以仿照NOIP2017D1T1小凯的疑惑,将两个石头之间距离>=(st-s-t)全部转化为(st-s-t)。 可以理解为若距离>=(st-s-t),则所有的点都能到达。 但是这题要求宽松,方便又保险起见,把距
阅读全文
摘要:传送门 解题思路 很简单的一道并查集,但是我自己却没做出来,关键点没想到,害,还是太菜了…… 直接放重点: 先构建相等关系,然后判断不相等关系成不成立,所以分开操作。 离散化。 AC代码 #include<iostream> #include<algorithm> #include<cmath> #
阅读全文
摘要:传送门 解题思路 简化一下问题,即为给你一个数组a,对于所有的i,将a[i]到fa[a[i+1]]路径上的点加一。 注意端点处理(可以理解为拐弯处只记一次)。 AC代码 #include<iostream> #include<cstring> #include<cstdio> #include<al
阅读全文
摘要:传送门 解题思路 首先明白题意: 能经过的点必须满足其所有连向的节点都能走到终点。 于是我们就可以建个反图,跑一遍dfs,求出有多少满足条件的点,最后bfs跑一遍即可。 如何判断? 用一个num数组表示节点i在原图的出度,即在反图的出度。 每当有一个点指向节点i时,num[i]--。 最后若num[
阅读全文
摘要:传送门 解题思路 用dp[i][j]表示没有消失时前i个物品组成装满容积为j的背包的方案数。 很显然, \(dp[i][j]+=dp[i-1][j-w[i]]\) 仿照背包,i这一维可以省去,j要逆序。 然后再设f[i][j]表示去掉第i个物品时装满容积为j的方案数。 那么在dp中减去用到i这个物品
阅读全文
摘要:传送门 解题思路 首先很显然的贪心是 在每个地方放置的士兵一定是某个敌人放置士兵的两倍加一。 这样每个地方就有s种放置方法,每种对应一个数量和一个权值,于是就成了很典型的分组背包。 AC代码 #include<iostream> #include<cstring> #include<algorith
阅读全文
摘要:传送门 解题思路 很妙的一道贪心题。 首先很显然的是,一定先把能回血的怪先干掉,然后再去干扣血的怪。 分类讨论: 对于回血的怪,显然按照d从小到大排序,以免你一开始就被干死。 对于扣血的怪,我们倒着考虑,从终止状态,每次减去a,然后加上d,就变成了回血怪的情况。 所以对于扣血的怪按照a从大到小排序。
阅读全文
摘要:传送门 ##解题思路 设 \(i,j\) 相邻,前面的重量和为 \(x\)。 若 \(i\) 在上面更优,则 \(max(x-s[i],x+w[i]-s[j])<max(x-s[j],x+w[j]-s[i])\) \(x-s[i]\) 一定小于 \(x+w[j]-s[i]\), \(x-s[j]\)
阅读全文
摘要:洛谷传送门 高维前缀和 一维二维前缀和 首先多维前缀和肯定可以像二维一样进行容斥求出,但是很显然复杂度爆炸。 所以我们使用另一种求法。 二维前缀和: for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ a[i][j]+=a[i-1][j]; } } for(i
阅读全文
摘要:传送门 解题思路 最小值最大————很显然先二分最终答案,然后贪心进行切割: 从头开始判断每一行能否切成b块大于二分的数的蛋糕,若不能就不断向下加行。 而判断过程可以用二维前缀和优化。 AC代码 #include<cstdio> #include<iostream> #include<cstring
阅读全文
摘要:##传送门 大难不死,必有后福 自从在空间里大骂后 十分钟过了两道调了两天的题…… ##解题思路 非常经典的一个对序列进行模拟退火的题。 求方差时直接用公式就行(平均数一开始可以预处理出来) 求分组后最小的方差需要用到dp。 dp[i][j]表示前i个数分j组的方差。 直接枚举k转移即可。 ##注意
阅读全文
摘要:##传送门 ##解题思路 先用Floyd求一遍最短路, 然后对m个点之外的序列模拟退火,取前k个设置城堡,O(N^2)求出当前对小距离,判断并更新ans。 没什么注意的但是我rand()写在while外面了所以调了一个小时把我心态搞崩了草 ##AC代码 #include<cstdio> #inclu
阅读全文
摘要:##传送门 ##解题思路 特别狗的一道题 根据重力势能最小时平衡(??),可以进行模拟退火。 其他的套板子行了。 然后我就写挂了~~(交了24次)~~ ##AC代码 #include<cstdio> #include<iostream> #include<cstring> #include<cmat
阅读全文
摘要:##洛谷传送门 ##模拟退火 推荐一篇感觉写得很好的洛谷日报 补充一点就是可以加个判断(这个题因为有多组T不适用): while ((double)clock()/CLOCKS_PER_SEC<MAX_TIME) SA(); 注意这个题的输出格式特别狗…… ##AC代码 #include<cstdi
阅读全文
摘要:##传送门1 ##传送门2 一维请出门右转。 ##二维前缀和 d[i][j]表示从 (1,1) 点到 (i,j) 点的和。 很显然: 求d数组:d[i][j]=d[i-1][j]+d[i][j-1]-d[i-1][j-1]+a[i][j] 求(a,b)到(c,d)的和:d[c][d]-d[a-1][
阅读全文
摘要:##传送门 ##解题思路 总体思路:二分W,对于每个W求得一个y,根据y-s的正负调整l和r,并且每次更新ans。 如何求y? 可以扫一遍矿石,用a数组记录下符合条件的数量的前缀和,b数组记录下符合条件的v的求点缀和;再枚举每个区间加起来即可。 ##AC代码 #include<iostream> #
阅读全文

浙公网安备 33010602011771号