
数据结构
文章平均质量分 68
hao_zong_yin
有问题可以加QQ讨论2987048728,备注一下优快云
展开
-
POJ 1769 Minimizing maximizer——线段树+dp
思路比较简单,然而线段树多写了一个else改了半天,感觉自己真TM的棒#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;const int maxn = 5e4 + 10;const int maxm ...原创 2018-02-16 22:15:29 · 283 阅读 · 0 评论 -
UVA 11235 Frequent values——RMQ
蓝书P198原题#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;typedef long long ll;const int maxn = 100005;int num[maxn], cnt[max...原创 2018-03-07 21:11:16 · 205 阅读 · 0 评论 -
POJ 2932 Coneology——扫描线
乍一看还以为线段树+扫描线,仔细想想虽然不是一个东西但是相似性很高,只要维护一下与扫描线相交的最外层圆就可以了,这里用了set,第一次写写得则乱,后来看了挑战程序设计才简化了代码,骚操作学到了#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#i...原创 2018-02-20 16:14:17 · 296 阅读 · 0 评论 -
UVA 11136 Hoax or what——multiset
#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#include <set>using namespace std;int main() { int n, k, x; while (~scanf("%d", &a..原创 2018-03-09 15:14:08 · 240 阅读 · 0 评论 -
POJ 2104 K-th Number——主席树
一开始分块搞过了,但后来ac代码交上去TLE,怀疑是加强数据或者当时是运气过的,于是学了主席树,推荐这篇博客http://blog.youkuaiyun.com/creatorx/article/details/75446472#include <cstdio>#include <cstring>#include <iostream>#include <algo...原创 2018-03-10 15:46:35 · 195 阅读 · 0 评论 -
HDU 2665 Kth number——主席树
这题和POJ 2104有着不可描述的关系,切完2104后顺便把这个切了#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;const int maxn = 1e5 + 10;int n, m, cnt;...原创 2018-03-10 15:49:22 · 153 阅读 · 0 评论 -
PTA 最小生成树的唯一性——次小生成树
先dfs一遍求一下连通块的个数,连通块为1的情况下求出最小生成树和次小生成树,判断两者是否相等#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#include <vector>using namespace std;const ...原创 2018-03-20 10:50:55 · 1312 阅读 · 1 评论 -
POJ 1182 食物链——并查集
挑战程序设计88页原题#include #include #include #include using namespace std;const int maxn = 150000 + 10;int par[maxn], ran[maxn];void init(int n) { for (int i = 0; i <= n; i++) { par[原创 2017-05-17 09:20:44 · 298 阅读 · 0 评论 -
POJ 2513 Colored Sticks——字典树+并查集+欧拉回路
比较综合的一道题,套用字典树以及并查集模板。注意:1.字典树应该有提供单词编号的功能,这也是解题必须的要素2.输入为空返回0,这个跟写法有关,我的写法不用特殊判断3注意各种细节,本题综合性较强,代码量较大,稍不留神就会出现细节错误,注意及时调试#include #include #include #include #include #define ID(x) x -原创 2017-05-17 22:40:55 · 343 阅读 · 0 评论 -
Uva 673 平衡的括号——栈的操作
#include #include #include #include #include using namespace std;int main(){ int T; scanf("%d", &T); getchar(); while (T--) { char s[200]; gets(s); int i, len原创 2017-05-24 18:01:55 · 354 阅读 · 0 评论 -
UVa 1149 Bin Packing——优先队列
#include #include #include #include #include #include using namespace std;int main(){ int T, n, k, temp, flag = 0; scanf("%d", &T); while (T--) { priority_queue q1; p原创 2017-05-30 08:57:51 · 288 阅读 · 0 评论 -
UVa 10954 Add All ——优先队列
用优先队列实现Huffman算法#include #include #include #include #include using namespace std;int main(){ int n, x; while (scanf("%d", &n) == 1 && n) { priority_queue, greater > q;原创 2017-06-01 21:20:34 · 293 阅读 · 0 评论 -
UVa 536 Tree Recovery——树的遍历
#include #include #include #include #include using namespace std;string a, b;void dfs(int p1, int p2, int q1, int q2, int root) { if (p1 > p2) return; for (root = q1; a[p1] != b[root原创 2017-06-10 15:41:04 · 239 阅读 · 0 评论 -
线段树详解
线段树详解By 岩之痕目录:一:综述二:原理三:递归实现四:非递归原理五:非递归实现六:线段树解题模型七:扫描线八:可持久化 (主席树)九:练习题一:综述假设有编号从1到n的n个点,每个点都存了一些信息,用[L,R]表示下标从L到R的这些点。线段树的用处就是,对编号连续的一些点进行修改或者统计操作,修改转载 2017-06-20 22:12:05 · 390 阅读 · 0 评论 -
HDU 1166 敌兵布阵——单节点更新的线段树
C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了。A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视这些工兵营地的活动情况。由于采取了某种先进的监测手段,所以每个工兵营地的人数C国都掌握的一清二楚,每个工兵营地的人数都有可能发生变动,可能增加或减少若干人手,但这些都逃不过C国的监视。中央情报局要研究敌人究竟演习什么战术原创 2017-06-21 15:44:14 · 332 阅读 · 0 评论 -
HDU 1754 I Hate It——单点更新的线段树
很多学校流行一种比较的习惯。老师们很喜欢询问,从某某到某某当中,分数最高的是多少。 这让很多学生很反感。 不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问。当然,老师有时候需要更新某位同学的成绩。 Input 本题目包含多组测试,请处理到文件结束。 在每个测试的第一行,有两个正整数 N 和 M ( 0学生ID编号分别从1编到N。 第二原创 2017-06-21 21:43:00 · 284 阅读 · 0 评论 -
HDU 5542 The Battle of Chibi——树状数组 + dp
题目大意:给定一个长度为n的序列,问其共有多少个长度为m的子序列思路:用dp【i】【j】表示包含i个元素、第j个元素结尾的上升子序列的数量刚开始三重循环会超时:#include #include #include #include using namespace std;const int mod = 1000000007;int a[1010], dp[1010]原创 2017-06-29 10:42:54 · 338 阅读 · 0 评论 -
CodeForces - 566D Restructuring Company——并查集
#include using namespace std;const int maxn = 200000 + 10;int n, q, par[maxn], next[maxn];int seek(int x) { return par[x] == x ? x : par[x] = seek(par[x]); }int main() { scanf("%d %d", &n, &q原创 2017-07-14 09:36:12 · 532 阅读 · 0 评论 -
KMP详解
原文地址:http://www.cnblogs.com/zhangtianq/p/5839909.html1. 引言 本KMP原文最初写于2年多前的2011年12月,因当时初次接触KMP,思路混乱导致写也写得混乱。所以一直想找机会重新写下KMP,但苦于一直以来对KMP的理解始终不够,故才迟迟没有修改本文。 然近期因开了个算法班,班上专门讲解数据结构、面试、算法,转载 2017-07-15 14:57:17 · 406 阅读 · 0 评论 -
POJ - 3461 Oulipo——kmp
求模式串在字符串中出现的次数。统计次数时,要注意当完成一组匹配之后令j = next【j】,以便开启另一组匹配#include #include #include using namespace std;const int maxn = 1000000 + 10;int next[maxn], leno, lenp;char o[maxn], p[maxn];void NEX原创 2017-07-15 15:03:02 · 293 阅读 · 0 评论 -
POJ 2406 Power Strings——kmp求最短循环子串
题意:给你一个字符串,如果这个字符串可以由某个子串重复多次构成,那么输出最大重复次数。如abcd 输出 1; aaaa 输出 4; ababab 输出 3;定理:假设S的长度为len,则S存在循环子串,当且仅当,len可以被len - next[len]整除,最短循环子串为S[len - next[len]]例子证明:设S=q1q2q3q4q5q6q原创 2017-07-15 15:32:57 · 4338 阅读 · 0 评论 -
HDU 4424 Conquer a New Region——并查集
题意:给定n个城市和n-1条边,使得n个城市连通,规定任意两个城市之间的权值等于这两个城市间的所有道路权值的最小值,比如1--2--3--4,1--2的权值为1,2--3的权值为2,3--4的权值为3,则1--4的权值为1,要求选择一个城市,使得这个城市到其他所有城市的权值总和最大。思路:一条路径如果包含一个权值小的边的话,这条路径的总权值就会变小, 基于这一点,我们应该从权值最大的边开始操作原创 2017-07-24 21:56:53 · 374 阅读 · 0 评论 -
线段树题目整合
1.hdu1166 敌兵布阵更新节点,区间求和。2.hdu1754 I Hate It更新节点,区间最值..3.hdu1698 Just a Hook成段更新,总区间求和..4.hdu1394 Minimum Inversion Number更新节点,区间求和.5.hdu1779 9-Problem C暂不公开成段更新,区间最值转载 2017-07-25 14:53:58 · 3931 阅读 · 2 评论 -
HDU 1698 Just a Hook——区间更新的线段树
题意:一开始有n个1组成的数列,执行q此操作,每次操作给出x y z,表示把区间【x,y】内的所有数变成z,执行完q此操作后求整个数列的和思路:直接套用区间更新线段树的模板,进行简单的更新值与求和操作#include #include #include #include using namespace std;const int maxn = 1e5 + 10;int T原创 2017-08-08 17:16:06 · 327 阅读 · 0 评论 -
HDU 1394 Minimum Inversion Number——线段树求逆序数
题意:给出一个n元素数列,每次可以把最前面一个数移动到最后面生成一个新的序列,求所序列的最小逆序数思路:线段树只起优化作用(这题也可以暴力),首先要明确的是题目的解法(困扰了我很久):需要注意的一点是n个数一定是1~n且不重复,为了方便后面的解释先对样例前两个数1、3进行操作:样例是1 3 6 9 0 8 5 7 4 2逆序数1 2 4 6 0 4 2 2 1 0,总共22原创 2017-08-09 11:16:45 · 313 阅读 · 0 评论 -
POJ 2777 Count Color——区间更新的线段树+状态压缩
题意:用数字表示颜色,一开始n个物品的颜色全部为1,可以进行操作x y z,把区间【x,y】的颜色全部变为z,求给定区间内有多少种不同的颜色思路:首先想到套用区间更新的线段树模板,但是因为线段树维护的是颜色的种数,因此不能单纯的求和,这就用到了位运算,用数字来保存状态,用位运算进行操作,具体参考代码PS:注意输入的【x,y】可能出现x > y的情况, 注意交换#include #in原创 2017-08-09 13:33:16 · 341 阅读 · 0 评论 -
POJ 3468 A Simple Problem with Integers——区间更新的线段树
模板题#include #include #include #include using namespace std;typedef long long ll;const int maxn = 1e5 + 10;ll n, q, date[maxn], segTree[maxn<<2], lazy[maxn<<2];void pushup(ll root) {原创 2017-08-09 14:02:18 · 259 阅读 · 0 评论 -
POJ 2528 Mayor's posters——线段树+离散化
离散化坑死人#include #include #include #include using namespace std;const int maxn = 1e5 +10;int T, n, m, segTree[maxn], lazy[maxn], point[maxn], id[10000005];struct Seg { int x, y;}seg[ma原创 2017-08-09 19:55:20 · 298 阅读 · 0 评论 -
HDU 2795 Billboard——特殊查询的线段树
#include #include #include #include using namespace std;const int maxn = 1e5 * 2 + 10;int h, w, n, date[maxn], segTree[maxn<<2];void pushup(int root) { segTree[root] = max(segTree[root<原创 2017-08-10 21:20:12 · 236 阅读 · 0 评论 -
URAL - 1989 Subpalindromes——字符串哈希 + 线段树
题意:判断是否为回文串思路:两颗线段树存一段字符串的正向哈希值和反向哈希值,具体思路看别的博客吧,我query函数忘记改ull错了13遍已经没脸见人了。。。#include #include #include #include using namespace std;typedef unsigned long long ull;const int maxn = 1e5 +原创 2017-08-11 21:54:00 · 444 阅读 · 0 评论 -
CodeForces - 527C Glass Carving——线段树
题意:给定一个矩形,每次可以横向切割或纵向切割,求每次切割完后所有矩形的最大面积思路:最大矩形的面积 = 最大的w * 最大的h,所以可以键两棵线段树,一棵维护最大的w,一棵维护最大的h,以维护最大的w为例:我们可以把W - 1个划分点作为线段树的叶子,每个点如果被划分就设为1, 没有划分设为0,那么最长的w就是线段树统计出的最长的连续0的个数+1.因为最长连续0不符合区间加法,所以要原创 2017-08-12 12:10:52 · 434 阅读 · 0 评论 -
树状数组详解
引用请注明出处:http://blog.youkuaiyun.com/int64ago/article/details/7429868 写下这个标题,其实心里还是没底的,与其说是写博帖,不如说是做总结。第一个接触树状数组还是两年前,用什么语言来形容当时的感觉呢?……太神奇了!真的,无法表达出那种感觉,她是那么的优雅,10行不到的代码,却把事情干的如此出色!没有了解她原理的前提下即使把转载 2017-08-12 17:12:55 · 387 阅读 · 0 评论 -
Trie详解
一、知识简介 字典树(Trie)可以保存一些的对应关系。类似于c++的map,但是比map快很多。Trie 的优点在于它的时间复杂度。它的插入和查询时间复杂度都为 O(k) ,其中 k 为 key 的长度,与 Trie 中保存了多少个元素无关;Trie 的缺点是空间消耗很高。Trie的核心思想是空间换时间。利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的。Tr转载 2017-08-12 19:10:27 · 2427 阅读 · 0 评论 -
HDU 1251 统计难题——字典树
题意:Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀). Input输入数据的第一部分是一张单词表,每行一个单词,单词的长度不超过10,它们代表的是老师交给Ignatius统计的单词,一个空行代表单词表的结束.第二部分是一连串的提问,每行一个提问,每个提问原创 2017-08-12 20:48:52 · 286 阅读 · 0 评论 -
CodeForces - 558E A Simple Task——线段树 + 计数排序
题意:给定一个字符序列,每次可以把一个区间变成升序或者降序,求最终的字符序列思路:sort的复杂度为nlog(n),总共是n^2 log(n),超时(快排详解:http://blog.youkuaiyun.com/hao_zong_yin/article/details/64443581)。计数排序的复杂度为n,总共是n^2,还是会超时(计数排序详解:http://blog.csdn.ne原创 2017-08-13 19:52:41 · 383 阅读 · 0 评论 -
ZOJ 1610 Count the Colors——线段树
题意:用不同颜色覆盖区间,问最后每种颜色有多少段思路:线段树维护区间的颜色,线段树和平常的模板不同,只需要维护叶子节点就可以,其余节点放在那里不用考虑了,进而我们可以不用建线段树数组,只需要慵懒标记就可以得到最终结果。注意线段维护的是区间的颜色,不是点的点的颜色,所以用输入的左界+1代表其区间#include #include #include #include using原创 2017-08-15 10:27:24 · 249 阅读 · 0 评论 -
POJ 3264 Balanced Lineup——线段树
题意:求一个区间的最大值减最小值思路:建立两棵线段树维护最大值和最小值,设置一个参数flg代表当前查询的是哪棵线段树。#include #include #include #include using namespace std;const int INF = 0x3f3f3f3f;const int maxn = 1e5;int n, q, date[maxn], s原创 2017-08-15 11:00:33 · 260 阅读 · 0 评论 -
HDU 4027 Can you answer these queries?——其实是点更新的区间更新线段树
题意:给定一个序列,每次操作可以把一个区间内的所有数变成原来数字的开方,求序列和思路:表面上是区间更新,但是每个数开方这种操作区间更新的慵懒标记难以做到,所以这个题不用慵懒标记,而是直接采用 单节点更新的思想,但是单节点更新一定会超时,所以做一个剪枝:当当前区间的值全为1时直接return,不进行任何更新,这是显然的,1开方还是1,更新的话只会徒增复杂度,其他的按照一般的模板写就可以了#i原创 2017-08-15 20:33:50 · 300 阅读 · 0 评论 -
HDU 1540 Tunnel Warfare——特殊查询的线段树
一定要注意查询范围,以及及时变动查询位置,具体参考代码query函数#include #include #include #include #include using namespace std;const int maxn = 1e5;stack last;int n, q;struct SegTree { bool is_all0; int ma原创 2017-08-16 13:45:32 · 241 阅读 · 0 评论 -
HDU 3974 Assign the task——线段树
题意:有一个公司,有n个人,这些人之间的关系是一棵树,公司会安排一些任务给他们, 每次安排至安排一个人,但是他的下属会和他一起做,要求查询当前这个人在做什么工作思路:一开始不好往线段树那里想,想用线段树的lazy思想直接处理原来的树,但发现更新和查询都没法精确定位,最坏的情况为O(n),会超时,所以考虑如何在更短的时间内更新和查询,这就想到了线段树,可以在O(nlogn)内完成更新和查询想原创 2017-08-17 09:53:00 · 333 阅读 · 0 评论