
数据结构
hohotiger
这个作者很懒,什么都没留下…
展开
-
leetcode 42 接雨水 单调栈
接雨水给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。 感谢 Marcos 贡献此图。示例:输入: [0,1,0,2,1,0,1,3,2,1,2,1]输出: 6题解:暴力的话就是m*n复杂度 可能会超时 考虑一下其他方案要求的就是蓝色区域,也就是凹进去的部分。那么如何求解凹进去的部分,就是要对每一块.原创 2020-09-17 15:48:45 · 257 阅读 · 0 评论 -
力扣 两数相加 指针操作注意事项
两数相加给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您可以假设除了数字 0 之外,这两个数都不会以 0 开头。示例:输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)输出:7 -> 0 -> 8原因:342 + 465 = 807链表数学运算的问题:写递归函数要考虑好两个问题:1/什.原创 2020-09-11 21:58:08 · 233 阅读 · 0 评论 -
PAT 1114 Family Property 并查集
This time, you are supposed to help us collect the data for family-owned property. Given each person’s family members, and the estate(房产)info under his/her own name, we need to know the size of each f...原创 2018-03-15 21:37:47 · 186 阅读 · 0 评论 -
1143. Lowest Common Ancestor
1143. Lowest Common Ancestor (30)时间限制200 ms内存限制65536 kB代码长度限制16000 B判题程序Standard作者CHEN, YueThe lowest common ancestor (LCA) of two nodes U and V in a tree is the deepest node that has both U and V as ...原创 2018-03-24 22:38:37 · 232 阅读 · 0 评论 -
2018 蓝桥杯省赛 B 组模拟赛(一)H.封印之门 最短路
蒜头君被暗黑军团包围在一座岛上,所有通往近卫军团的路都有暗黑军团把手。幸运的是,小岛上有一扇上古之神打造的封印之门,可以通往近卫军团,传闻至今没有人能解除封印。封印之门上有一串文字,只包含小写字母,有 kk种操作规则,每个规则可以把一个字符变换成另外一个字符。经过任意多次操作以后,最后如果能把封印之门上的文字变换成解开封印之门的文字,封印之门将会开启。蒜头君战斗力超强,但是不擅计算,请你帮忙蒜头君...原创 2018-03-23 21:00:24 · 182 阅读 · 0 评论 -
2018蓝桥模拟赛·天上的星星 暴力|二维树状数组
在一个星光摧残的夜晚,蒜头君一颗一颗的数这天上的星星。蒜头君给在天上巧妙的画了一个直角坐标系,让所有的星星都分布在第一象。天上有 nn 颗星星,他能知道每一颗星星的坐标和亮度。现在,蒜头君问自己 qq 次,每次他问自己每个矩形区域的星星的亮度和是多少(包含边界上的星星)。输入格式第一行输入一个整数 n(1 \le n \le 50000)n(1≤n≤50000) 表示星星的数量。接下里 nn 行,...原创 2018-03-24 11:50:07 · 265 阅读 · 0 评论 -
2018蓝桥杯模拟赛·青出于蓝而胜于蓝 DFS序+树状数组
武当派一共有 nnn 人,门派内 nnn 人按照武功高低进行排名,武功最高的人排名第 111,次高的人排名第 222,... 武功最低的人排名第 nnn。现在我们用武功的排名来给每个人标号,除了祖师爷,每个人都有一个师父,每个人可能有多个徒弟。我们知道,武当派人才辈出,连祖师爷的武功都只能排行到 ppp。也就是说徒弟的武功是可能超过师父的,所谓的青出于蓝胜于蓝。请你帮忙计算每个人的所有子弟(包括徒...原创 2018-03-24 23:30:19 · 543 阅读 · 0 评论 -
洛谷3368 - 树状数组 区间更新 单点查询
import java.io.BufferedInputStream;import java.util.Scanner;public class Main{ final static int maxn = 500100; static long[] tre = new long[maxn+5]; static long[] a = new long[maxn+5]; static i...原创 2018-05-04 12:04:28 · 287 阅读 · 0 评论 -
树状数组的区间修改+查询
题意就是经典的两种操作 Q s e 表示查询s到e区间内的总和 C s e add 表示把s到e都加上一个add 区间内的元素大小1e9 区间长度和查询次数1e5分析: 这道题虽然是课裸的线段树区间修改+查询+延迟标记 但是繁杂的代码不如用实现简单的树状数组来做 首先看树状数组是用来求前缀和比较方便的一种数据结构 sum[i] = Sigma a[i] =Sum(bit[x])原创 2018-05-06 12:07:42 · 422 阅读 · 0 评论 -
线段树之扫描线思路
经典的求矩形面积交问题运用线段树+扫描线方式以本题的样例为例线段树和扫描线是这么结合的 线段树统计的是有效区间段的长度 也就是扫描线 当前扫描到的区间段是哪一个 什么意思 比如当前在哪一个段扫描 那么线段树中的t[1]中的len就是多长 线段树一般情况下是一个后序遍历先把孩子节点的信息 更新后 再拿孩子节点的信息回来更新自己 一旦取消这个线段 遇到了出边 那么就把这个点的覆...原创 2018-05-02 14:14:02 · 910 阅读 · 0 评论 -
2017蓝桥杯决赛-发现环 数据结构|搜索
问题描述 小明的实验室有N台电脑,编号1~N。原本这N台电脑之间有N-1条数据链接相连,恰好构成一个树形网络。在树形网络上,任意两台电脑之间有唯一的路径相连。 不过在最近一次维护网络时,管理员误操作使得某两台电脑之间增加了一条数据链接,于是网络中出现了环路。环路上的电脑由于两两之间不再是只有一条路径,使得这些电脑上的数据传输出现了BUG。 为了恢复正常传输。小明需要找到所有在环路上的电脑,你...原创 2018-05-22 20:47:17 · 1069 阅读 · 0 评论 -
关于递归函数,非递归函数中引用传参的问题
首先 我们来看这个函数typedef int Ele;typedef struct list{ Ele data; list *next; }List,*LNode;void dele2(LNode &l,Ele e){ if(l==NULL)return; printf("Hello!!\n"); printf("to %d\n",l); if(l->d...原创 2018-08-16 18:58:48 · 1169 阅读 · 0 评论 -
1115. Counting Nodes in a BST (30) 数据结构
给出一颗BST树 求这个数最后两层的节点数量用c1+c2 = n 的形式给出建树深度搜索即可#include<iostream>#include<cstdio>#include<algorithm>#include<string>using namespace std;struct node{ int l,r,x;}n[2010];...原创 2018-03-14 21:53:59 · 154 阅读 · 0 评论 -
PAT1130. Infix Expression (25) 中序遍历
题意给出一棵中缀树 然后输出他的表达式分析一开始还想随便在输入点中任找一个点然后不断深搜建树 后来才发现这道题输入数据就把树根据指向关系已经建立好了 只需要确定根节点然后中序遍历就好了code#include<bits/stdc++.h>using namespace std;bool bok[22];struct node{ string val; int l,r;}cas[原创 2018-03-08 13:36:21 · 178 阅读 · 0 评论 -
HDU1005
本题题意就是求第n项 符合 f(n) = ( A*f(n-1)+B*f(n-2) )MOD7 的值是多少这道题可以用规律求解 也可以用矩阵快速幂求解以下是快速幂的求解方法:#includeusing namespace std;struct m{ int a[2][2];}ori,res;int A,b,n,x,y;m mul(m x,m y){ m t;原创 2017-07-18 21:07:32 · 291 阅读 · 0 评论 -
Weak Pair HDU - 5877 树状数组+离散化+DFS遍历
题意给我们一颗有根有向树 以及每个点得权值a[1]~a[n] 需要我们求出在这颗树种有多少对满足以下两个条件的pair (1)u是v的祖先节点 (2)a[u]*a[v]<= k N<=1e5 a[i]<=1e9 k<=1e18分析由于需要在树中找符合要求的对数 一般的算法恐怕比较慢原创 2017-09-03 19:16:09 · 219 阅读 · 0 评论 -
Hihocoer 1336 - Matrix Sum 二维树状数组
题意给我们个n*n的矩阵 有m个操作让我们操作有两种 Add x y v对(x,y)上的元素加vSum x1 y1 x2 y2 对(x1,y1)为左上角(x2,y2)为右下角的矩阵求和并mod 1e9+7初始矩阵每个元素都是01 ≤ N ≤ 1000, 1 ≤ M ≤ 100000For each Add operation: 0 ≤ x < N, 0 ≤ y < N, -1000000原创 2017-10-20 17:16:02 · 239 阅读 · 0 评论 -
HDU - 5441 Travel 离线处理+并查集
题意给我们一个图 给出这个图的n个点 和m个边和权值 然后再分别给我们q个查询 每个查询给一个x让我们在这个图中找出多少个不同的有序对 使得从x到y的最大权值不超过xn≤20000,m≤100000,q≤5000. 分析20000个点 1000ms 暴力肯定不行看似这道题像是个图论的题 嘿嘿嘿 其实。。。我们看 如何找出符合题目条件所需要的对数呢我们如果对任意一个查询 我们对一条新的边原创 2017-10-23 20:44:45 · 229 阅读 · 0 评论 -
Codeforces Round #413 C-Fountains 树状数组
题意本题给我们给我们两种货币初始金额 每种货币分别对应能买不同种类的喷泉 每个喷泉有花费和价值 问我们如果单纯建造两个喷泉在限定金额内的最大值分析考虑一下 发现有三种情况 1 两个喷泉从coin中里建造 2 两个喷泉从diamond中建造 3 一边一个 4 输出0 表示找不出两个合法的可行解 第3,4种情况还好判断 就是在两边一遍选一个金额限度中价值最大的原创 2017-11-18 11:36:37 · 157 阅读 · 0 评论 -
CodeForces 799B (B) T-shirt buying
分析本题实质上就是对数据处理一下就可以了就是数据结构实现题 我们要求对应索引下按照某种排序规则的线性表时 取最优时 可以用堆每次拿出一个元素 堆内元素调整顺序然后用三个堆 就可以表示三张表 每次我们得到顾客的一个喜欢颜色 就可以利用这个颜色去查堆 找到就输出 找不到就输出-1本题在于把对应颜色作为下标 将元素存进来用的时候就查表就行了减少遍历次数 将一张大表分成不同颜色的小表 cod原创 2017-11-18 11:40:07 · 282 阅读 · 0 评论 -
三序遍历相互求法
给中序前序求后序遍历根据前序和中序求后序遍历序列根据前序和中序的特性分析 1 首先从前序序列确定当前子树的根节点 2 然后可以根据根节点到中序序列中找到左右子树的个数分析左右子树3 如果左右子树数量大于零相当于我们分别知道了左右子树在前序和中序的子序列4 通过确立根节点的过程 我们依次确立根的左孩子左子树 以及右孩子 右子树递归求解 回到1根据以上步骤 可以逐步以深搜递归树的方式原创 2017-12-09 10:44:36 · 275 阅读 · 0 评论 -
POJ 1703 Find them, Catch them 种类并查集
题意给出一堆点和关系 D为两点不同集合 A为查询两点是否不同集合 n<=1e5 code#include<cstdio>#include<iostream>#include<algorithm>using namespace std;const int maxn = 1e5+7;int f[maxn],rel[maxn];int find(int x){ int t;原创 2017-11-25 12:31:24 · 154 阅读 · 0 评论 -
POJ Star 树状数组
/*51 15 17 13 35 5*/#include<cstdio>#include<algorithm>using namespace std;typedef long long ll;int ans[15010];ll c[32005];void add(int x){ while(x<=32001){ c[x]++; x+=x原创 2018-01-21 23:18:56 · 227 阅读 · 0 评论 -
POJ 2299 - Ultra-QuickSort BIT
题意给我们一个序列 序列长度小于500000 每个元素 小于999999999 让我们只移动相邻的元素 最终使得他们移动到正好上升序的最小移动次数分析我们看 最小的移动次数其实是个幌子 因为你移动相邻的元素 大的元素你不论如何移动 就是要一个个移动到所有比他小的元素的后面 来看原序列 9 1 0 5 4 对于9由于它是最大的 那么他就要慢慢移动到最后一个 变成 1 0 5 4 9 那原创 2018-01-17 20:36:58 · 154 阅读 · 0 评论 -
HDU 1566 Count the Colors 树状树组 区间更新 单点求值
#includeusing namespace std;const int lim = 100010;int n,c[lim];// 记录差分变化 void update(int a,int val){ while(a<=n){ c[a]+=val; a+=a&(-a); }}int get(int x){ int sum=0;原创 2018-01-18 03:06:41 · 228 阅读 · 0 评论 -
天梯赛-是否完全二叉搜索树
将一系列给定数字顺序插入一个初始为空的二叉搜索树(定义为左子树键值大,右子树键值小),你需要判断最后的树是否一棵完全二叉树,并且给出其层序遍历的结果。输入格式:输入第一行给出一个不超过20的正整数N;第二行给出N个互不相同的正整数,其间以空格分隔。输出格式:将输入的N个正整数顺序插入一个初始为空的二叉搜索树。在第一行中输出结果树的层序遍历结果,数字间以1个空格分隔,行的首尾不得有多原创 2017-03-20 22:44:27 · 324 阅读 · 0 评论