首页 > TAG信息列表 > stk

CodeCraft-22 and Codeforces Round #795 D

D. Max GEQ Sum 我们考虑暴力枚举a[i]为最大值 通过单调栈可以求出a[i]左边右边第一个大于a[i]的 然后通过ST表查询前缀和数组(i,R[i]-1)的最大值 (L[i]+1,i)的最小值得到我们需要的区间和最大值 check即可 注意我们这里因为是前缀和 query_max(i, R[i] - 1) - query_min(L[i], i - 1)

98.validate-binary-search-tree 验证二叉搜索树

二叉搜索树定义: 节点左子树只包含小于当前节点的数; 节点右子树只包含大于当前节点的数; 所有左子树和右子树自身必须也是二叉搜索树。 实际上,若中序遍历二叉搜索树,所得序列是单调递增的,利用这一性质来判断是否是二叉搜索树。 递归法 创建一个指针pre,指向中序遍历过程中的当前节点

CF1702G2 Passable Paths (hard version)

Passable Paths (hard version) 给出一棵大小为 \(n\) 的树,\(q\) 次询问,每次给出一大小为 \(m\) 的点集,判断是否存在一条链覆盖这些点,注意这条链可以经过其他点。\(n,\sum m \leq 2\times 10^5\) ,\(q \leq 10^5\)。 SOLUTION1: 虚树 由于 \(q\) 次询问的 \(\sum m \le 2 \times 1

虚树

一种大树变小树的方法。大概就是只保留题目要求的关键点和其他一些统计答案必须的点,把剩余的所有点从树上砍掉。原理是维护一条最右链(就是我们扫到的最右边的一条链,它左边的虚树已经建好)。 具体的操作: 首先把所有的关键点按照dfs序排序。然后开始分讨: 如果栈空则节点入栈。 找到

768. 最多能完成排序的块 II

题目(链接) arr是一个可能包含重复元素的整数数组,我们将这个数组分割成几个“块”,并将这些块分别进行排序。之后再连接起来,使得连接的结果和按升序排序后的原数组相同。 我们最多能将数组分成多少块? 示例 1: 输入: arr = [5,4,3,2,1] 输出: 1 解释: 将数组分成2块或者更多块,都无法

求一个图的最打的半联通子集=求一个图的最长链方案和个数

拓扑图最长路 等于 背包问题求方案数 因为要求点不同 存在多条边同一情况 需要边判重(set) 拓扑求方案数 #include <iostream> #include <cstring> #include <algorithm> #include <unordered_set> using namespace std; typedef long long LL; const int N = 1e5+10,M=2e6+10;

CF1506G 题解

前言 题目传送门! 更好的阅读体验? 校内考试题目。写一篇题解。 思路 首先记录每个字符出现了多少次,然后创建单调栈。 看当前字符是否入栈,如果没有入栈,就不停 pop(),直到: 栈空了。 栈顶字典序大于当前字符。 栈顶元素已经被删掉了(因为栈外面用 cnt[i] 记录了每个数的次数)。 满足单

CF131D Subway

题目链接: 洛谷 Codeforces Solution Tarjan 板题。 很明显可以用 Tarjan 找到这一个环,由于这是一个无向图,所以需要多记录一个当前节点的父亲,防止其反复横跳。然后缩完点以后,找到一个强连通分量的大小大于 \(1\),也就是那一个环,以它为源点,跑 dijkstra,与此同时把那个环里的点打上标记

单调栈模板

力扣503 class Solution { public: vector<int> nextGreaterElements(vector<int>& nums) { int n = nums.size(); vector<int> ret(n, -1); stack<int> stk; for (int i = 0; i < n * 2 - 1; i++) {

leetcode42-接雨水

接雨水 dp 维护两个dp数组,分别记录左侧和右侧的最大值。当前位置的雨水就是左右两侧最大值的较小值减去当前位置的高度,将所有雨水累加即可得到结果。 class Solution { public int trap(int[] height) { int n = height.length, left[] = new int[n], right[] = new

leetcode85-最大矩形

最大矩形 dp+单调栈 对每一层维护本列中形成的最高值height,然后对每一层分别计算最大的矩形。 计算每一层最大矩形的时候,先用单调栈记录小于当前位置的左下标和右下标,矩形面积就是(right[i]-left[i]-1) * height[i] class Solution { public int maximalRectangle(char[][]

leetcode636-函数的独占时间

函数的独占时间 栈 使用栈记录调用过程。如果log为start,那么就加入堆栈。如果是end,则分两种情况: 栈不为空,意味着存在递归调用,那么说明当前的函数占用了上一个函数的使用时间,所以上一个函数要减去相应的时间,然后给当前函数增加时间 栈为空,则直接增加当前函数的时间 class Solut

Max Chunks To Make Sorted II

Max Chunks To Make Sorted II You are given an integer array  arr. We split  arr into some number of chunks (i.e., partitions), and individually sort each chunk. After concatenating them, the result should equal the sorted array. Return the largest number

1175. 最大半连通子图

题目链接 1175. 最大半连通子图 一个有向图 \(G = (V,E)\) 称为半连通的 (Semi-Connected),如果满足:\(\forall u,v \in V\),满足 \(u \to v\) 或 \(v \to u\),即对于图中任意两点 \(u,v\),存在一条 \(u\) 到 \(v\) 的有向路径或者从 \(v\) 到 \(u\) 的有向路径。 若 \(G’ = (V’,E’)

367. 学校网络

题目链接 367. 学校网络 一些学校连接在一个计算机网络上,学校之间存在软件支援协议,每个学校都有它应支援的学校名单(学校 \(A\) 支援学校 \(B\),并不表示学校 \(B\) 一定要支援学校 \(A\))。 当某校获得一个新软件时,无论是直接获得还是通过网络获得,该校都应立即将这个软件通过网络传

20220728

一道计算几何的模板题 点很多值域很小,考虑对每个横坐标求出最大/最小的纵坐标,只有这些点可能在凸包上 递推 \(O(p)\) 次后会进入循环节,前面的暴力。之后对于固定的 \(x_i\) 而言,只有前 \(py\) 个对应的 \(y\) 有用。把对应的 \(y\) 集合相同的 \(x_i\) 一起计算,相当于求 RMQ(这部分

2514. 消耗战

题目链接 2514. 消耗战 [SDOI2011] 消耗战 题目描述 在一场战争中,战场由 \(n\) 个岛屿和 \(n-1\) 个桥梁组成,保证每两个岛屿间有且仅有一条路径可达。现在,我军已经侦查到敌军的总部在编号为 \(1\) 的岛屿,而且他们已经没有足够多的能源维系战斗,我军胜利在望。已知在其他 \(k\) 个岛

[学习笔记] 析合树学习笔记

做 CF 的时候碰到了这个,于是就滚过来学了。本文全部参考 OI-wiki。所以你的学习笔记就是把原文抄一遍吗 其实是一个比较简单的东西,感觉 OI-wiki 上有些部分写得太繁杂了,所以就稍微做了一些简化。 引入 这个问题是这样的:给定一个长度为 \(n\) 的排列,我们称一个值域连续的区间为段,问

单调栈-6119. 元素值大于变化阈值的子数组

问题描述 给你一个整数数组 nums 和一个整数 threshold 。 找到长度为 k 的 nums 子数组,满足数组中 每个 元素都 大于 threshold / k 。 请你返回满足要求的 任意 子数组的 大小 。如果没有这样的子数组,返回 -1 。 子数组 是数组中一段连续非空的元素序列。 示例 1

非递归遍历二叉树Java

import java.util.*; public class Test { static class TreeNode { int val; TreeNode left; TreeNode right; public TreeNode(int val) { this.val = val; } } public static void main(String[] ar

2-SAT 浅谈

P4782 【模板】2-SAT 问题 2-SAT 问题,描述类似存在多组关系,求解当所有关系成立时的情况,因为描述关系之间只存在可以互相推导和不能互相推导两种关系,所以称作 2-SAT 。 我们针对一个 \((a \lor b)\)(表示 \(a\) 和 \(b\) 其中有一个为真即成立)的状态,我们可以推导出两个二元对立的式

LeetCode 907. Sum of Subarray Minimums

原题链接在这里:https://leetcode.com/problems/sum-of-subarray-minimums/ 题目: Given an array of integers arr, find the sum of min(b), where b ranges over every (contiguous) subarray of arr. Since the answer may be large, return the answer modulo 109 + 7.

LeetCode 2104. Sum of Subarray Ranges

原题链接在这里:https://leetcode.com/problems/sum-of-subarray-ranges/ 题目: You are given an integer array nums. The range of a subarray of nums is the difference between the largest and smallest element in the subarray. Return the sum of all subarray ra

768. 最多能完成排序的块 II ( 栈)

  难度困难126 这个问题和“最多能完成排序的块”相似,但给定数组中的元素可以重复,输入数组最大长度为2000,其中的元素最大为10**8。 arr是一个可能包含重复元素的整数数组,我们将这个数组分割成几个“块”,并将这些块分别进行排序。之后再连接起来,使得连接的结果和按升序排序后

剑指 Offer 30.包含 min 函数的栈

定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。 示例 MinStack minStack = new MinStack(); minStack.push(-2); minStack.push(0); minStack.push(-3); minStack.min(); --> 返回 -3. minStack