摘要:
缩点 stack<int>q; void tarjan(int u) { pre[u]=low[u]=++cnt; q.push(u); vis[u]=1; for(int i=head[u];i;i=nxt[i]) { int y=to[i]; if(!pre[y]) { tarjan(y); l 阅读全文
摘要:
题目描述 样例 4 1 1 5 1 6 5 15 15 32 分析 虽然这题正解是tarjan,但我决定不用tarjan(实际上是我没想出来),很容易想到,对于每一个炸弹,我们看它是否能波及到下一 个炸弹,然后从下一个炸弹找它能波及到的炸弹,想一想实际上不是很复杂,用线性递推可以搞,每一个炸弹对每一 阅读全文
摘要:
题目描述 样例 6 7 1 2 2 3 3 5 2 4 4 1 2 6 6 5 10 12 8 16 1 5 1 4 4 3 5 6 47 解析 题目明显是最长路,可以用spfa求最长路,但数据范围5e5明显不允许,所以我们可以用tarjan优化一下,然后这就变成了一道 tarjan板子题,先用ta 阅读全文
摘要:
题目描述 解析 对于这道题,他要求大于k的数进行操作,所以直接让每个数减k,然后用前缀和维护一下与0比较就可以了,因为一段区间和的平 均值大于k的话,那么这就是一个合法区间,即为操作后的这个区间和大于0,我们可以用一个单调递减栈去维护,先把比0小的 推入栈中,因为这个区间肯定不是答案,但这个区间外的 阅读全文
摘要:
题目描述 分析 题目意思就是找子区间的和乘区间最小值的最小值; 1.纯暴力。。。肯定TLE. 2.枚举最小值,找两边第一个比它小的,求区间和。 (肯定第二种)。。。 实现 纯循环的话肯定不行,这时候需要一点小优化——单调栈; 既然枚举最小值的话,复杂度只要 O(n),可以用前缀和求区间和,接下来就是 阅读全文
摘要:
树状数组 ——高效求前缀和 (直接放板子了。。) 下标 点击查看代码 int lowbit(int x){ return x&(-x); } 单点修改 点击查看代码 void add(int i,int k){ while(i<=n){ c[i]+=k; i+=lowbit(i); } } 求和 点 阅读全文
摘要:
题目描述 一看正方形,得,二维数组,单调队列。 单调队列可以将一个区间最大值存储,所以只需要根据给定的正方形长度先横着推一遍,再竖着推一遍,将正方形中的最大值和最小值都储存在正方形右下角方格,最后遍历即可。 先以行储存以k为长度的最大/小值; 再以剩下k-m横向长度的最值向下扩展k个长度,储存在长k 阅读全文
摘要:
题目描述 直接求解会导致不同贝壳在上个区间算过但这个区间没标记的情况,所以在求解时要把上个区间的标记转移到这个区间 转移前先右边界由小到大排序,然后转移上个右边界到这个右边界的标记,同时记录上个标记出现的地方,方便转移 下面附代码 solution #include<bits/stdc++.h> u 阅读全文
摘要:
区间最大子区间和 规定: ls:区间靠左部分子区间最大和 rs:区间靠右部分子区间最大和 ms:区间子区间最大和 s:区间和 方程与数量关系如图所示,可以用动态规划解决 山海经题解 这题是上述方法在线段树中的应用 solution #include<bits/stdc++.h> using name 阅读全文