数据结构
宝宝睡醒了
这个作者很懒,什么都没留下…
展开
-
三分查找
找极值的算法,用于单峰函数,有一个极大值或者极小值的。通过l 和 r找到mid,再通过mid和r找到midr,以凸函数为例,要找极大值,如果y(mid) > y(midr),那么让r = midr,否则让l = mid,直到找到极大值为止。#include <bits/stdc++.h>using namespace std;const double eps = 1e-8;double y(double x){ }double sf(double l, doub原创 2021-02-24 17:01:49 · 88 阅读 · 0 评论 -
树状数组
树状数组单点修改,区间查询区间修改,单点查询#include <bits/stdc++.h>using namespace std;typedef long long ll;const int N = 100010;int n, m;//n是区间长度。m是操作个数int a[N];ll tr[N];int lowbit(int x){ return x & -x;}void add(int x, int c){ for(int i = x原创 2021-01-26 15:21:22 · 73 阅读 · 0 评论 -
C-Coloring Contention
Coloring Contention这道题大致意思是Alice和Bob在玩一个游戏,在一个图中,有n个点和m条边,Alice想要让Bob尽可能多的走颜色不同的边,所以她把相邻的边都涂成了,不同的颜色。而Bob要走最少颜色不同的边,问Bob走这个图,最少需要转换多少次颜色。这仔细一想,就是最短路 - 1,因为走哪条路,都是走一条路换一种颜色,所以Bob就走最短路咯~为什么要补这个题呢,因为比赛的时候没来得及看,一直在看万恶的E题,至于E题是什么:E题传送门一是比赛的时候没打,二是想复习一下最短路。原创 2021-01-25 00:52:56 · 263 阅读 · 0 评论 -
单调栈,单调队列
单调栈,单调队列单调栈常用题型:给定一个序列,在这个序列,每一个序列左边,离它最近的比它大或者比它小的数在什么地方。#include <iostream>#include <vector>using namespace std;const int N = 1e5 + 10;int n;int stk[N], tt;int main(){ cin >> n; for(int i = 0; i < n; i ++) {原创 2021-01-20 15:09:14 · 62 阅读 · 0 评论 -
字典树
字典树#include <iostream>#include <vector>using namespace std;const int N = 1e5 + 10;int son[N][26], cnt[N], idx;//下标是0的点,即是空节点,又是根节点char str[N];void insert(char str[])//存储操作{ int p = 0;//初始化p = 0 for(int i = 0; str[i]; i ++)原创 2021-01-20 10:07:10 · 65 阅读 · 0 评论 -
字符串哈希
字符串哈希字符串哈希的思想:将字符串转换成数字的形式,例如ABCD,将它看成1234,如果转换成p进制的数字,则可以这样计算:1 * p3 + 2 * p2 + 3 * p1+ 4 * p0。由于数字比较大经常会模一个值,可以是2的64次方。通常选择进制p为131或者13331。如果不想模2的64次方,可以直接用unsigned long long定义字符串哈希数组,溢出的时候就自动对2的64次方取模。例题:给出长度为n的字符串,再给出m次询问。问两段字符串是否相等。#include <b原创 2021-01-19 12:22:12 · 155 阅读 · 1 评论 -
线段树-区间最大值与最小值之差
#include <bits/stdc++.h>using namespace std;const int N = 1e6 + 10;const int INF = 0x3f3f3f3f;struct node{ int l, r; int Max, Min;}tr[N * 4];int a[N];void pushup(int u){ tr[u].Max = max(tr[u << 1].Max, tr[u << 1 | 1]原创 2020-10-11 00:18:21 · 614 阅读 · 0 评论 -
线段树(带懒标记)
线段树(带懒标记)区间和5个操作:pushup(),pushdown(),build(),modify(),query()#include <bits/stdc++.h>using namespace std;const int N = 1e6 + 10;int n, m;int w[N];typedef long long ll;struct node{ int l, r; int sum, add;}tr[N * 4];void pushup(int原创 2020-10-10 00:05:06 · 195 阅读 · 1 评论 -
下一较大值(二)
F - 数据结构实验之栈与队列六:下一较大值(二)Description对于包含n(1<=n<=100000)个整数的序列,对于序列中的每一元素,在序列中查找其位置之后第一个大于它的值,如果找到,输出所找到的值,否则,输出-1。Input输入有多组,第一行输入t(1<=t<=10),表示输入的组数;以后是 t 组输入:每组先输入n,表示本组序列的元素个数,之后依次输入本组的n个元素。Output输出有多组,每组之间输出一个空行(最后一组之后没有);每组输出按照本序列元原创 2020-10-02 23:58:41 · 65 阅读 · 0 评论 -
7-1 列出连通集 (25分)
7-1 列出连通集 (25分)给定一个有N个顶点和E条边的无向图,请用DFS和BFS分别列出其所有的连通集。假设顶点从0到N−1编号。进行搜索时,假设我们总是从编号最小的顶点出发,按编号递增的顺序访问邻接点。输入格式:输入第1行给出2个整数N(0<N≤10)和E,分别是图的顶点数和边数。随后E行,每行给出一条边的两个端点。每行中的数字之间用1空格分隔。输出格式:按照"{ v1 v2 … vk }"的格式,每行输出一个连通集。先输出DFS的结果,再输出BFS的结果。输入样例原创 2020-09-30 20:11:39 · 1169 阅读 · 0 评论 -
并查集
并查集init初始化操作:让每个结点成为一个集合。void init(int n) { for (int i = 1; i <= n; i++) { f[i] = i; }}getf得到一个结点所在集合的值:int getf(int v) { if (v == f[v]) return v; else { f[v] = getf(f[v]); return f[v]; }}合并两原创 2020-09-30 19:46:16 · 109 阅读 · 0 评论 -
7-8 愿天下有情人都是失散多年的兄妹 (25分)
7-8 愿天下有情人都是失散多年的兄妹 (25分)呵呵。大家都知道五服以内不得通婚,即两个人最近的共同祖先如果在五代以内(即本人、父母、祖父母、曾祖父母、高祖父母)则不可通婚。本题就请你帮助一对有情人判断一下,他们究竟是否可以成婚?输入格式:输入第一行给出一个正整数N(2 ≤ N ≤10 4 ),随后N行,每行按以下格式给出一个人的信息:本人ID 性别 父亲ID 母亲ID其中ID是5位数字,每人不同;性别M代表男性、F代表女性。如果某人的父亲或母亲已经不可考,则相应的ID位置上标记为-1。原创 2020-09-25 21:02:14 · 404 阅读 · 0 评论 -
Communication
Communication题意:如果A能够把信息传送给B,且B能够把信息传送给A,则A和B在一个集合中。它的逆命题也成立。(注意:A能够传送给B可以是直接传送也可以是间接传送,形成环路也是可以的)解题思路:用floyd将所有有关联的点更新,然后用一遍并查集。代码:#include <bits/stdc++.h>using namespace std;int n, e, a, b;int f[300];int g[210][210];int getf(int v)原创 2020-09-25 19:53:14 · 150 阅读 · 0 评论 -
7-12 拯救007 (25分)
7-12 拯救007 (25分)在老电影“007之生死关头”(Live and Let Die)中有一个情节,007被毒贩抓到一个鳄鱼池中心的小岛上,他用了一种极为大胆的方法逃脱 —— 直接踩着池子里一系列鳄鱼的大脑袋跳上岸去!(据说当年替身演员被最后一条鳄鱼咬住了脚,幸好穿的是特别加厚的靴子才逃过一劫。)设鳄鱼池是长宽为100米的方形,中心坐标为 (0, 0),且东北角坐标为 (50, 50)。池心岛是以 (0, 0) 为圆心、直径15米的圆。给定池中分布的鳄鱼的坐标、以及007一次能跳跃的最大距离,原创 2020-09-23 21:16:10 · 1024 阅读 · 0 评论 -
7-10 功夫传人 (25分)
7-10 功夫传人 (25分)一门武功能否传承久远并被发扬光大,是要看缘分的。一般来说,师傅传授给徒弟的武功总要打个折扣,于是越往后传,弟子们的功夫就越弱…… 直到某一支的某一代突然出现一个天分特别高的弟子(或者是吃到了灵丹、挖到了特别的秘笈),会将功夫的威力一下子放大N倍 —— 我们称这种弟子为“得道者”。这里我们来考察某一位祖师爷门下的徒子徒孙家谱:假设家谱中的每个人只有1位师傅(除了祖师爷没有师傅);每位师傅可以带很多徒弟;并且假设辈分严格有序,即祖师爷这门武功的每个第i代传人只能在第i-1代传人原创 2020-09-23 20:52:42 · 198 阅读 · 0 评论 -
2020-09-23
7-11 图着色问题 (25分)图着色问题是一个著名的NP完全问题。给定无向图G=(V,E),问可否用K种颜色为V中的每一个顶点分配一种颜色,使得不会有两个相邻顶点具有同一种颜色?但本题并不是要你解决这个着色问题,而是对给定的一种颜色分配,请你判断这是否是图着色问题的一个解。输入格式:输入在第一行给出3个整数V(0<V≤500)、E(≥0)和K(0<K≤V),分别是无向图的顶点数、边数、以及颜色数。顶点和颜色都从1到V编号。随后E行,每行给出一条边的两个端点的编号。在图的信息给出之后,给原创 2020-09-23 20:32:20 · 335 阅读 · 0 评论 -
2020-09-23
7-7 红色警报 (25分)战争中保持各个城市间的连通性非常重要。本题要求你编写一个报警程序,当失去一个城市导致国家被分裂为多个无法连通的区域时,就发出红色警报。注意:若该国本来就不完全连通,是分裂的k个区域,而失去一个城市并不改变其他城市之间的连通性,则不要发出警报。输入格式:输入在第一行给出两个整数N(0 < N ≤ 500)和M(≤ 5000),分别为城市个数(于是默认城市从0到N-1编号)和连接两城市的通路条数。随后M行,每行给出一条通路所连接的两个城市的编号,其间以1个空格分隔。在城市原创 2020-09-23 20:10:50 · 125 阅读 · 0 评论 -
2020-09-18
最短路路径存储PTA——城市间紧急救援代码#include <algorithm>#include <cstdio>#include <cstring>#include <iostream>#include <map>#include <queue>#include <set>#include <stack>#include <vector>//#include <tr1原创 2020-09-18 20:23:39 · 69 阅读 · 0 评论 -
2020-09-14
排序堆排序#include <algorithm>#include <cstdio>#include <cstring>#include <iostream>#include <map>#include <queue>#include <set>#include <stack>#include <vector>//#include <tr1/unordered_map>原创 2020-09-14 21:02:03 · 78 阅读 · 0 评论 -
最小生成树
最小生成树prim#include <algorithm>#include <cstdio>#include <cstring>#include <iostream>#include <map>#include <queue>#include <set>#include <stack>#include <vector>//#include <tr1/unordered_ma原创 2020-09-11 20:22:36 · 73 阅读 · 0 评论 -
最短路
最短路(一)dijkstra朴素版本#include <algorithm>#include <cstdio>#include <cstring>#include <iostream>#include <map>#include <queue>#include <set>#include <stack>#include <vector>//#include <tr1/un原创 2020-09-10 20:14:55 · 102 阅读 · 0 评论 -
二叉树(2)
二叉树(2)统计叶子数#include <algorithm>#include <cstdio>#include <cstring>#include <iostream>#include <map>#include <queue>#include <set>#include <stack>#include <vector>//#include <tr1/unordered_原创 2020-09-07 23:36:01 · 100 阅读 · 0 评论 -
二叉树(1)
二叉树(1)二叉树遍历中序遍历,后序遍历#include <algorithm>#include <cstdio>#include <cstring>#include <iostream>#include <map>#include <queue>#include <set>#include <stack>#include <vector>//#include <tr1/原创 2020-09-05 23:43:07 · 106 阅读 · 0 评论 -
图
图的基本储存方式邻接矩阵邻接矩阵储存图的方法,顾名思义,就是用二维数组来存数。下面看具体存储方法:(1)无向边这是一个无向图,由5个结点,6条边组成,1和2有边,1和3有边,1和5有边,3和4有边,4和5有边,2和4有边。好了,图的基本信息介绍完了,下面废话不多说直接上二维数组,解释邻接矩阵。这是以主对角线对称的二维数组,因为是无向边,所以顾名思义,很容易懂。这里就不细说了。把有边的地方变成1,没边的地方是0。(2)有向图,有向图和无向图类似,找对应关系即可,这里不多说。下面上代码。#in原创 2020-05-23 21:51:19 · 527 阅读 · 1 评论 -
2020/5/19总结
堆和哈夫曼树今天学习了一些关于堆和哈夫曼树相关知识,了解了C++里面的sort函数和优先队列。这是我的学习成果:sort函数使用方法:1.sort函数的三个参数void sort(random first,random second,compare comp)(1) 第一个参数 first:是要排序的数组的起始地址。(2) 第二个参数 second:是要排序的数组的结束地址。(3) 第三个参数 comp:是要排序的方法:可以升序也可以降序,如果第三个参数不写,则默认的排序方法是从小到大排序原创 2020-05-20 02:27:18 · 215 阅读 · 0 评论