数据结构
文章平均质量分 59
NKWBTB
ACMer
展开
-
区间第K值带修改 分块
区间第K值带修改Q:给定一个序列 1、查询一个L到R的区间内的第K大(小)值。2、修改一个值。这道神题困扰了我很久,直到学了各种各样的算法才会会这道题。先比较一下流行的算法的效率吧对于一个长度为N的序列暴力:对于一段查询区间每次进行快排。时间复杂度:单次查询:O(NlogN)修改:O(1)空间复杂度:O(N)线段树套平衡树:单次查询:O(log^3 N)原创 2014-03-21 13:34:01 · 3440 阅读 · 1 评论 -
可并堆——左偏树 Leftist Heap
今天学习了左偏树,这是一个好理解而且好写的数据结构,和二叉堆一样可以在O(1)时间内取出优先级最高的值,O(logn)时间内删除优先级最高的值,不同的是如果要合并两个堆那么二叉堆就只能跪了。而左偏树能在O(logn)的时间内实现两个堆的合并。左偏树有两个重要的性质,1、树中每个元素小于或大于其父亲节点的值(堆性质)2、定义节点的距离为当前节点向下到叶子节点最少所需的边数,叶子节点的距离原创 2014-03-24 11:23:14 · 2810 阅读 · 3 评论 -
HDU 5412 区间第K值 带修改 树状数组套平衡树
题意:给定一个序列,两种操作:1、求修改第i个数为Vi;2、求区间[L,R]第K大的值。2015多校练习赛的一道题。因为是经典题所以很多人都直接把模板敲上去了,然而通过率却惨不忍睹。我也是直接套以前写的程序的SB之一。然而分块时间复杂度太高并不能通过本题(分块做法见:http://blog.csdn.net/nkwbtb/article/details/21639647)于是愉快的TLE了。考原创 2015-08-22 21:42:59 · 1016 阅读 · 0 评论 -
堆优化Dijkstra
非映射堆版:#include <bits/stdc++.h>using namespace std;const int maxn = 20000 + 5;long long d[maxn];int vis[maxn];int n , m;struct Pri{ int v;long long c; Pri(){} Pri(int _v , long long _c原创 2015-08-28 11:57:49 · 763 阅读 · 0 评论 -
Codeforces Gym 100342F Move to Front 平衡树
题目大意:有一个链表其中的元素为1->2->3->4->…….->INF,每次询问一个元素在链表中的位置,然后把该元素放到链表的首位置。做法:beta version如果输入数字不大,那么我们可以直接先把1到最大数字打上时间戳加到平衡树(按时间戳从新到老排序)里面去;每次询问,就询问时间戳在平衡树中的rank即可;在平衡树中删除该时间戳,将该数重新打上一个新的时间戳加入到平衡树中即可(相当于移原创 2015-09-06 11:53:38 · 1313 阅读 · 0 评论 -
Codeforces Gym 100971M Decomposition into Good Strings DP+数据结构
题目大意:定义有k个不同的字符的字符串为好字符串。现在给出一个字符串,求解对该字符串的每个前缀Si至少是多少个好字符串的连接,若不能由好字符串连接而成则输出-1。 例:k = 2 abac至少是ab和ac这两个好字符串的连接。 字符串长度<=2e5做法:一个比较直观的dp方程是这样的 f[i]表示Si的答案 f[i] = min(f[j] + 1) (j < i且Sj + 1…i是好字符串原创 2016-05-15 11:45:43 · 1136 阅读 · 0 评论 -
POJ 2010 Moo University - Financial Aid (优先队列/二分答案)
题目大意:从c个物品中选出n(奇数)个物品,使得这n个物品的价值中位数尽量高,且总价格不超过f。做法1:把物品按价值排序half表示n/2向下取整low[i]表示前i - 1个物品中价格最小的half个物品的价格和hei[i]表示i之后的物品中价格最小的half个物品的价格和low和hei可用优先队列维护枚举中间物品即可代码 NKWBTB Accepted 2592KB原创 2016-03-06 16:38:00 · 1369 阅读 · 0 评论