数据结构
Pandauncle
写给自己的。
学好自己该学的,
什么都想学的,什么都学不好。
什么都不学的,神马都是浮云。
不要好高骛远。
脚踏实地,
想要的会来的。
展开
-
数据结构之单链表
首先单链表,又叫线性链表。单链表的特点是:用一组任意的存储单元存储线性表的数据元素(这组存储单元可以是连续的,也可以是不连续的)。因此,为了表示每个数据元素ai与后继ai+1的关系。用了两个域来储存,一个是数据域(存储数据元素),第二个是指针域(存储直接后继存储的位置的域)。这两个域被称为结点。 那就看看怎么定义线性表的把。typedef struct LNode{ int date;原创 2017-09-02 21:34:52 · 442 阅读 · 0 评论 -
HDU1394(权值线段树)
题目大意:给定一个0到n-1的数字组成的序列,它的逆序数,然后把第一个数字放到末尾,得到一个新的序列,再求逆序数,再把新序列的第一个数字放到末尾,一直这样做,求所有这些序列的逆序数的最小值。思路:首先用权值线段树(或树状数组)求出当前序列的逆序对数。然后把第一个数放到最后一个,计算他的贡献:即他当前能组成的逆序数对为后面比他小的数(a[i]个),把他放入最后时,他贡献的逆序对数为:(n-a[...原创 2018-11-30 20:45:57 · 411 阅读 · 0 评论 -
POJ2823Sliding Window(单调队列)
题意: 题意很简单,给出一个有n个元素的序列和一个k,让你求出从左到右每k个区间的最大值和最小值。 思路: 单调队列的入门题目。 若从左到右求出每个区间的最大值,则队列里的数值是递减的,下标是递增的。 若从左到右求出每个区间的最小值,则队列里的数值是递增的,下标是递增的。 只需要维护队列里的数值则就可以求出每个区间的最大最下值。#include<stdio.h>#...原创 2018-08-03 14:47:14 · 202 阅读 · 0 评论 -
POJ2481Cows(树状数组)
题意: 计算每个区间有多少个包含他的区间。 本题和POJ 2352的stras差不多,把区间看出二维坐标上的点,这可以看出在该点左上方的点数及为包含的区间数。 因此可以按照y从大到小的顺序排列,y相同的则按照x从小到大排列,就可以把二维的点变成用树状数组维护x就行了。#include<stdio.h>#include<iostream>#include...原创 2018-07-28 11:58:25 · 235 阅读 · 0 评论 -
POJ2352树状数组入门
题目大意: 在坐标上有n个星星,如果某个星星坐标为(x, y), 它的左下位置为:(x0,y0),x0<=x 且y0<=y。如果左下位置有a个星星,就表示这个星星属于level a。 按照y递增,如果y相同则x递增的顺序给出n个星星,求出所有level水平的数量。 因为题意给出y按照递增的顺序给出,所以只要依次判断小于等于x的数量有多少个及为level水平。 因此用树状数组来维...原创 2018-07-28 11:49:30 · 219 阅读 · 0 评论 -
HDU6319Problem A. Ascending Rating(单调队列)
题意: 给定一个序列a[1…n],对于每个长度为m的连续子区间,求出区间a的最大值以及从左往右扫描该区间时a的最大值的变化次数。 分析: 按照r从m到n的顺序很难解决这个问题。 考虑按照r从n到m的顺序倒着求出每个区间的答案。 按照滑动窗口最大值的经典方法维护a的单调队列,那么队列中的元素个数就是最大值的变化次数。#include<stdio.h>#include&...原创 2018-08-03 16:37:29 · 201 阅读 · 0 评论 -
POJ3067Japan(树状数组)
题意: 左边有N个点,右边有M个点,有K个连线,问相交点数有多少个。 思路: 左边的点从小到大排序,然后和右边的点如果相连的点在该点的下方有相连的线段则必与该线段相交。 就转换为求区间i—m连接点的个数和问题。 直接树状数组。#include <cstdio>#include <cstdlib>#include <cstring>#inc...原创 2018-07-29 19:42:58 · 237 阅读 · 0 评论 -
HDU6318Swaps and Inversions
注意交换次数等于逆序对数。#include<bits/stdc++.h>using namespace std;typedef long long int ll;const int N=100000+10;const int MAX=100000;int bit[N];int a[N];struct node{ int v,id; bool op...原创 2018-07-29 16:35:01 · 254 阅读 · 0 评论 -
POJ2299Ultra-QuickSort(树状数组求逆序对)
求逆序对,直接用树状数组求逆序对,注意离散化。#include<stdio.h>#include<istream>#include<algorithm>#include<string.h>#include<string>#include<cmath>#include<queue>using nam原创 2018-07-29 13:54:30 · 248 阅读 · 0 评论 -
POJ1990MooFest(树状数组)
题意: 一群牛参加完牛的节日后都有了不同程度的耳聋,第i头牛听见别的牛声音,别的牛音量必须大于v[i],当两头牛i,j交流的时候,交流的最小声音为max{v[i],v[j]}*他们之间的距离。现在有n头牛,求他们之间两两交流最少要的音量和。思路: 首先暴力肯定不是不行的O(n^2)。 树状数组的作用是能够快速求出某段区间的和O(logn),根据这点。我们可以根据牛可以听见声音的音量从...原创 2018-07-28 22:25:43 · 231 阅读 · 0 评论 -
最小函数值(minval)
有n个函数,分别为F1,F2,…,Fn。定义Fi(x)=Ai*x^2+Bi*x+Ci(x∈N*)。给定这些Ai、Bi和Ci,请求出所有函数的所有函数值中最小的m个(如有重复的要输出多个)。 【输入格式】 第一行输入两个正整数n和m。 以下n行每行三个正整数,其中第i行的三个数分别位Ai、Bi和Ci。输入数据保证Ai<=10,Bi<=100,Ci<=10 000。 【输出格式】 输原创 2018-01-19 17:06:22 · 2633 阅读 · 1 评论 -
合并果子(fruit)
合并果子(fruit)时间限制: 1000 ms 内存限制: 65536 KB 提交数: 311 通过数: 190 【题目描述】 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆。多多决定把所有的果子合成一堆。每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和。可以看出,所有的果子经过n-1次合并之后,就只剩下一堆了。原创 2018-01-18 22:17:01 · 1229 阅读 · 0 评论 -
FBI树(fbi)
FBI树(fbi)时间限制: 1000 ms 内存限制: 65536 KB 提交数: 87 通过数: 59 【题目描述】 我们可以把由“0”和“1”组成的字符串分为三类:全“0”串称为B串,全“1”串称为I串,既含“0”又含“1”的串则称为F串。FBI树是一种二叉树,它的结点类型也包括F结点,B结点和I结点三种。由一个长度为2N的“01”串S可以构造出一棵FBI树T,递归原创 2018-01-12 16:25:12 · 634 阅读 · 1 评论 -
数据结构之顺序线性表
首先先说下什么是线性表。线性表是最简单的一种数据结构。通俗的来讲,一个线性表就是以n个数据元素的有限序列(相当于数学中的“有限个元素的数列”)。当n=0时,线性表是空表。 线性结构的特点: <1>:除第一个数据元素以外,每个数据元素都有前驱。 <2>:除最后一个数据元素以外,每个数据元素都有后继。 <3>:除以上两点外,每个数据元素都只有一个前驱和后继。原创 2017-08-30 20:14:31 · 937 阅读 · 0 评论 -
2019山东省赛Median
题目和这个几乎一样:珍珠比大小加一个小判断就行了。#include<bits/stdc++.h>using namespace std;typedef long long int ll;const int N=100+30;int a[N][N],b[N][N],num1[N],num2[N];void init(){ memset(a,0,sizeof(a))...原创 2019-05-14 09:39:31 · 393 阅读 · 0 评论