001 前置芝士 (1)动态开点线段树 (2)动态开点维护权值线段树 (3)可持久化数组(可持久化线段树) (4)掌握权值线段树以及查询全局第k大/小值 002 动态开点 我们知道,开一棵线段树数组所需空间为4*MAXN,当MAXN过大时,显然会MLE,那有没有什么优化空间的方法呢? 当然有(废话,要是没有我还写什么) 动态开点
https://atcoder.jp/contests/abc267/tasks/abc267_f 此题目首先有结论:距离树上任意一点距离最远的点,是直径的其中一个端点 https://www.cnblogs.com/ydUESTC/p/16664485.html 故对于一个查询u,k如果存在一个答案,则可以在u到端点L或R的路径中查找到(因为这两条路径已经包含最远路径
const int dx[4] = {1, 0, 0, -1}; const int dy[4] = {0, 1, -1, 0}; vector<vector<int>> floodFill(vector<vector<int>>& image, int sr, int sc, int color) { int currColor = image[sr][sc]; if (currColor == c
例题: https://www.acwing.com/problem/content/description/922/ 代码: #include<bits/stdc++.h> using namespace std; int m, n; bool A_M[510][510]; int dis[510]; int stop[510]; bool vis[510]; void BFS() { deque<int> que; que.push_back(1);
石老师,我知道我考不上大专,但是您能不能不让我妈知道我开学考又寄了。 Mr. Shi, I know I can't get into a college, but can you not let my mom know that I sent in the opening exam again. Härra Shih, ma tean, et ma ei saa kolledžisse sisse, aga kas te ei saa mu ema
攻防演练 小Q和小C在比特公司的系统中进行攻防演练,这个系统经过特殊设定,只能接收任何只含有前 \(m\) 个小写英文字母的非空字符串作为输入命令。 小Q事先准备了一个长为 \(n\) 的字符串 \(s = s_1 s_2 \ldots s_n\),为了能够在演练时输入到系统中,这个字符串只会包含前 \(m\) 个小写
题目大意是给定一棵树,每个节点有个权值。 之后在树上找到3个点,使他们两两之间相等,并且两两之间权值不同。 问三元组的个数 首先因为是一棵树,所以我们可以通过广搜得到两两节点之间的距离。时间复杂度是O(\(n^2\)) 接下来很容易想到直接找到两个权值不同的点(a, b),然后得出a b之间
栈与队列的转换 队列转换为栈 一个队列队列通过元素循环放置将前面的元素放在后面,将最后一个元素移到最前面弹出,循环往返,不断弹出元素。 #include<iostream> #include<queue> using namespace std; class MyStack { public : queue<int> que; myStack(){
【问题描述】 已知地图中的描述,是根据陆地和海水交错排布的,其中数字1表示陆地,0表示海水,被水围起来的区域称为"岛屿”。已知师徒四人处在(m, n)点,请你按照八戒的提示编写程序,计算所在岛屿的面积。(注: 地图使用二维数组存储,地图的大小不超过50*50)。 输入: 四个整数m,n,x,y
【问题描述】 唐僧师徒在取经路上再一次走失了,这一次狡猾的妖怪将唐僧藏入了形如迷宫的洞穴中。已知妖怪洞穴是一个n*m的矩形, 其中有一些假山堵路。请根据给出的搜索起点和师傅的位置,计算出以最快速度(经过的格子最少)救出师傅的方法。 输入: 第一行是两个正整数n,m(2<N<10)
题目: 使用优先队列。开优先队列:priority_queue<int,vector<int>,greater<int>> que;1.输入输入 n(<=10000),m(<=100)(m<=n)将输入的打水时间存入a数组中。2.处理数据2.1遍历a[i]数组,i<=m时,将a[i]推入que中。 i>m时,将a[i]加上que.front(),再que.pop(),最后将a[i]入队。3.输
题目大意 \(n(n\le2\cdot10^5)\) 个点, \(m(m\le4\cdot10^5)\) 条边的无向图,每条边有长度 \(l(l\le10^4)\) ,海拔 \(a(a\le10^9)\) , \(q(q\le 4\cdot10^5)\) 次询问,每次从节点 \(v\) 出发,可以乘车经过任意连续一段海拔 \(> p\) 的边,之后便只能步行,求到达节点 \(1\) 所需的最短步行里
来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/last-stone-weight 有一堆石头,每块石头的重量都是正整数。 每一回合,从中选出两块 最重的 石头,然后将它们一起粉碎。假设石头的重量分别为 x 和 y,且 x <= y。那么粉碎的可能结果如下: 如果 x == y,那么两块石头都会被完全粉碎
思路分析 : 在二维中的接雨水,对每一个位置可以接水的量是其左侧的最大值和右侧的最大值中取小值 而在三维的接雨水中,首先可以知道的是最外面一层是不能接水的,因此对内层某一个位置的可以接水量,即为其四周高度的最小值决定的 我们可以借助优先队列,上来先将四周放入
题目链接在这里:Problem - K - Codeforces 经过观察可以发现会见骑士结束的时间点可以表示成一个式子c_x=max(t_i+sigma(d_i+...d_x)) (i=1...x) 只需要把 t_i 离散化出来,这就是跟上一个一样的经典线段树模型。 码力要加强啊!写的时间太长了! 1 #include "bits/stdc++.h" 2 #defin
单调队列可以求出,区间内的最值。 对于二维的情况,可以先在每一行,用单调队列求出,行方向上的最值。 然后在行方向上的最值的基础上,在每一列,用单调队列求出列方向上的最值。 即可得到二维区间的最值。 例题: 1091. 理想的正方形 代码: #include<bits/stdc++.h> using namespac
原题链接在这里:https://leetcode.com/problems/jump-game-iv/ 题目: Given an array of integers arr, you are initially positioned at the first index of the array. In one step you can jump from index i to index: i + 1 where: i + 1 < arr.length. i - 1 where:
func main() { //按数组层序建立二叉树,之后层序输出二叉树 root:=createTree(0,[]int{1,2,3,4,5,6}) ans:=printTree(root) fmt.Println(ans) //先序建立二叉树,之后先序输出二叉树 var tmp *TreeNode for i:=0;i<6;i++{ tmp=insert(tmp
A - 2^N 签到 #include<bits/stdc++.h> using namespace std; int main() { int n; cin >> n; cout << ( 1 << n ) << endl; } B - Batters 按照要求模拟一下 n = int(input()) a = list(map(int, input().split())) now = [ 0 , 0 , 0, 0
这道题目是一道Dijkstrra的题目。 我们先来回顾一下加边函数 void add(int u,int v,int w) { edge[k].to=v; edge[k].w=w; edge[k].next=head[u]; head[u]=k++; } 这道题目可以用优先队列也可以用手写队列(我要用优先队列) 普通的大小根堆都要有三个参数但
4362: Gregory the Grasshopper 描述 Gregory is a grasshopper. His favourite food are clover leafs -- he can simply never have enoughof them. Whenever he spots such a leaf, he wants to eat it as quickly as possible. Gregory isalso lazy, so he wants
title: 合并二叉树
二叉树的层序遍历按字面意思就是一层一层的遍历二叉树 如图,使用二叉树的层序遍历结果应该为1234567 层序遍历一般用队列或者递归的框架,我主要学习队列的解法。为什么用队列,因为队列有先入先出的属性,非常符合层序遍历的特点。 102. 二叉树的层序遍历 给你二叉树的根节点 root
title: 层次遍历
692. 前K个高频单词 给定一个单词列表 words 和一个整数 k ,返回前 k 个出现次数最多的单词。 返回的答案应该按单词出现频率由高到低排序。如果不同的单词有相同出现频率, 按字典顺序 排序。 示例 1: 输入: words = ["i", "love", "leetcode", "i", "love", "coding"], k = 2输出