07 2021 档案
摘要:传送门 解题思路 简化一下问题,即为给你一个数组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的背包的方案数。 很显然, 仿照背包,i这一维可以省去,j要逆序。 然后再设f[i][j]表示去掉第i个物品时装满容积为j的方案数。 那么在dp中减去用到i这个物品
阅读全文
摘要:传送门 解题思路 首先很显然的贪心是 在每个地方放置的士兵一定是某个敌人放置士兵的两倍加一。 这样每个地方就有s种放置方法,每种对应一个数量和一个权值,于是就成了很典型的分组背包。 AC代码 #include<iostream> #include<cstring> #include<algorith
阅读全文
摘要:传送门 解题思路 很妙的一道贪心题。 首先很显然的是,一定先把能回血的怪先干掉,然后再去干扣血的怪。 分类讨论: 对于回血的怪,显然按照d从小到大排序,以免你一开始就被干死。 对于扣血的怪,我们倒着考虑,从终止状态,每次减去a,然后加上d,就变成了回血怪的情况。 所以对于扣血的怪按照a从大到小排序。
阅读全文
摘要:洛谷传送门 高维前缀和 一维二维前缀和 首先多维前缀和肯定可以像二维一样进行容斥求出,但是很显然复杂度爆炸。 所以我们使用另一种求法。 二维前缀和: 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> #
阅读全文
摘要:##传送门 ##解题思路 比较巧的一道题。 把化简一下得,这要求x和z一定要同为奇数或偶数。 所以很明显我们首先要对他们分类: 按照奇数偶数点 按照颜色 这样就化成了若干个集合,而我们需要快速求出每个集合对答案的贡献。 把数学式子列一下: \(\sum_{i=1}^
阅读全文
摘要:##传送门 ##解题思路 仔细阅读题目,发现按照顺序插入每一个节点,且按照二叉搜索树的规则。 于是满足这两个条件其实就是笛卡尔树。 但是注意这里的x是读入的数,y是读入的数的下标。 构建完笛卡尔树后,其先序遍历的x值就是最终的ans。 (按照样例画个图就很显然了) ##AC代码 #include<i
阅读全文
摘要:##传送门 ##前置知识 单调栈 ##笛卡尔树 ###定义 每个节点都由一个键值二元组构成(x,y)。 要求构建一棵树,满足: x上是一个二叉搜索树(左儿子<根<右儿子) y上是一个小根堆 ###构建过程 于是我们可以按照x值从小到大将节点加入笛卡尔树中。 新加入的点now一定要放在某个节点的右儿子
阅读全文
摘要:##传送门 ##解题思路 发现某谷有单调栈板子了,就在这里贴一份代码吧。 单调栈讲解 ##AC代码 #include<cstdio> #include<iostream> #include<cstring> #include<iomanip> #include<cmath> #include<alg
阅读全文
摘要:##CF传送门 ##洛谷传送门 ##解题思路 注意每个叶子节点的修改是独立的,不会对后面造成影响。 所以我们先从根遍历一边,O(n)求出不改变之前根节点的取值。 然后再从根遍历一遍,求出每个儿子变化会不会对根节点造成影响: AND:若另一个儿子是0,则无影响,否则有影响 OR:若另一个儿子是1,则无
阅读全文