上一页 1 ··· 7 8 9 10 11 12 13 14 15 ··· 27 下一页
摘要: 传送门 解题思路 \(n^2\) 遍历每个点,判断两个空洞之间是否能联通,若联通,则在两个点之间建一条边。 然后在能抵达上表面的点和能抵达下表面的点分别建边连向上表面/下表面,最后dfs判断上下表面是否联通即可。 总复杂度 \(O(n^2)\) AC代码 #include<iostream> #in 阅读全文
posted @ 2021-08-21 14:07 尹昱钦 阅读(75) 评论(0) 推荐(0) 编辑
摘要: 传送门 解题思路 用二维单调队列求出每个 \(n\times n\) 矩形的最大值和最小值。 其实就是先在每一行上做原数组单调队列,再维护每一个行上最大值/最小值所组成的数组的单调队列。 AC代码 (代码写复杂了) #include<iostream> #include<algorithm> #in 阅读全文
posted @ 2021-08-14 17:13 尹昱钦 阅读(52) 评论(0) 推荐(0) 编辑
摘要: 传送门 解题思路 单调栈的一道好题。 枚举矩阵右下角的端点。 首先可以发现,对于一个确定的右下角,对矩阵有限制的*的位置的行数是从左到右严格递增的。 也就是这个样子: 所有就可以用单调栈储存一下这个对答案有影响的1的位置。 于是我们就有了状态转移方程: \(dp[i][j]=dp[i][s.top( 阅读全文
posted @ 2021-08-13 10:47 尹昱钦 阅读(139) 评论(0) 推荐(0) 编辑
摘要: 传送门 解题思路 可以举例观察得到:131这种结构可以省去一次,而313不行。 所以就用单调栈维护一个自栈顶到栈底严格递减栈,每次若栈顶大于a[i],则栈顶出栈并且ans++,若相等则出栈并且ans不变。 可以把a[n+1]设置为0.(即最后让所有元素出栈) ##AC代码 #include<iost 阅读全文
posted @ 2021-08-11 19:06 尹昱钦 阅读(68) 评论(0) 推荐(0) 编辑
摘要: 洛谷传送门 解题思路 考虑异或性质,发现对于每一二进制位单独来看,两个数相加和异或结果一样,而要想最终结果相等,则要保证加法每一位都不进位。 所以这道题就转化为要求每个二进制位只有一个1。 AC代码 #include<iostream> #include<algorithm> #include<cm 阅读全文
posted @ 2021-08-08 10:14 尹昱钦 阅读(26) 评论(0) 推荐(0) 编辑
摘要: 传送门 加强版传送门 解题思路 首先很显然,对于同一种色调的客栈来说,从小到大枚举左端点 L,符合要求的客栈 R~N 一定是满足 R 单调递增的。 而且选择的咖啡店也是随着 L 的增加间断着递增。 所以就可以双指针(准确说是多指针)将时间复杂度降至O(n)。 双倍经验双倍快乐 AC代码 #inclu 阅读全文
posted @ 2021-08-07 11:50 尹昱钦 阅读(62) 评论(1) 推荐(0) 编辑
摘要: 传送门 解题思路 左右指针,每次 \(a[r]-a[l]=c\) 对答案贡献就是 \(相同的a[l]的数量\times相同的a[r]的数量\) 当然也可以用map水过去…… 记得ans要开long long。 AC代码 #include<iostream> #include<algorithm> # 阅读全文
posted @ 2021-08-07 00:14 尹昱钦 阅读(106) 评论(0) 推荐(0) 编辑
摘要: 传送门 解题思路 先把x和y分别离散化,然后求一下前缀和,枚举栅栏,求一下即可。 AC代码 #include<iostream> #include<algorithm> #include<cmath> #include<cstdio> #include<cstring> using namespac 阅读全文
posted @ 2021-08-06 23:48 尹昱钦 阅读(79) 评论(0) 推荐(0) 编辑
摘要: 传送门 解题思路 很巧妙的一个题。 朴素的dp方程肯定都能列出来,关键是离散化如何操作。 可以仿照NOIP2017D1T1小凯的疑惑,将两个石头之间距离>=(st-s-t)全部转化为(st-s-t)。 可以理解为若距离>=(st-s-t),则所有的点都能到达。 但是这题要求宽松,方便又保险起见,把距 阅读全文
posted @ 2021-08-01 10:57 尹昱钦 阅读(138) 评论(0) 推荐(0) 编辑
摘要: 传送门 解题思路 很简单的一道并查集,但是我自己却没做出来,关键点没想到,害,还是太菜了…… 直接放重点: 先构建相等关系,然后判断不相等关系成不成立,所以分开操作。 离散化。 AC代码 #include<iostream> #include<algorithm> #include<cmath> # 阅读全文
posted @ 2021-08-01 01:07 尹昱钦 阅读(40) 评论(0) 推荐(0) 编辑
摘要: 传送门 解题思路 简化一下问题,即为给你一个数组a,对于所有的i,将a[i]到fa[a[i+1]]路径上的点加一。 注意端点处理(可以理解为拐弯处只记一次)。 AC代码 #include<iostream> #include<cstring> #include<cstdio> #include<al 阅读全文
posted @ 2021-07-31 23:33 尹昱钦 阅读(29) 评论(0) 推荐(0) 编辑
摘要: 传送门 解题思路 首先明白题意: 能经过的点必须满足其所有连向的节点都能走到终点。 于是我们就可以建个反图,跑一遍dfs,求出有多少满足条件的点,最后bfs跑一遍即可。 如何判断? 用一个num数组表示节点i在原图的出度,即在反图的出度。 每当有一个点指向节点i时,num[i]--。 最后若num[ 阅读全文
posted @ 2021-07-27 23:55 尹昱钦 阅读(41) 评论(0) 推荐(0) 编辑
摘要: 传送门 解题思路 用dp[i][j]表示没有消失时前i个物品组成装满容积为j的背包的方案数。 很显然, \(dp[i][j]+=dp[i-1][j-w[i]]\) 仿照背包,i这一维可以省去,j要逆序。 然后再设f[i][j]表示去掉第i个物品时装满容积为j的方案数。 那么在dp中减去用到i这个物品 阅读全文
posted @ 2021-07-26 14:37 尹昱钦 阅读(63) 评论(0) 推荐(0) 编辑
摘要: 传送门 解题思路 首先很显然的贪心是 在每个地方放置的士兵一定是某个敌人放置士兵的两倍加一。 这样每个地方就有s种放置方法,每种对应一个数量和一个权值,于是就成了很典型的分组背包。 AC代码 #include<iostream> #include<cstring> #include<algorith 阅读全文
posted @ 2021-07-26 14:09 尹昱钦 阅读(53) 评论(0) 推荐(0) 编辑
摘要: 传送门 解题思路 很妙的一道贪心题。 首先很显然的是,一定先把能回血的怪先干掉,然后再去干扣血的怪。 分类讨论: 对于回血的怪,显然按照d从小到大排序,以免你一开始就被干死。 对于扣血的怪,我们倒着考虑,从终止状态,每次减去a,然后加上d,就变成了回血怪的情况。 所以对于扣血的怪按照a从大到小排序。 阅读全文
posted @ 2021-07-25 11:19 尹昱钦 阅读(47) 评论(0) 推荐(0) 编辑
上一页 1 ··· 7 8 9 10 11 12 13 14 15 ··· 27 下一页