数据结构
文章平均质量分 78
moon_NO2015
Beyong the river!
展开
-
二维线段树UVA11297
#include#include#include#includeusing namespace std;#define nn 505#define inf 0x7fffffffint ma[nn<<2][nn<<2],mi[nn<<2][nn<<2];int x,y,xo,xleaf,v,x1,x2,y1,y2;int n,m,vmax,vmin;void query1(int原创 2015-07-29 16:57:05 · 359 阅读 · 0 评论 -
POJ2482 Stars in Your Window(线段树)
题意:在一个平面内有N个星星,每个星星都在一个亮度值,用一个W*H的矩形去围这些星星,(边上的不算)求能得到的最大亮度值。思路:我们很容易想到,可以动态的维护出每个宽度为W 的区间内,找出满足的星星,然后在高度为H的范围内求和。但是这样明显时间复杂度太高,维护宽度为W的区间只需要o(n),在高度为H的范围内求和时间复杂度为o(n*H),总的就是o(n^2*H).显然“维护宽度为W的原创 2016-01-23 15:13:55 · 463 阅读 · 0 评论 -
HDU 2072 单词数
字典树。这题真的有点坑。1,输出为0的情况。2,第一个单词前面有空格3,单词间的空格不止一个4,最后的单词后面的空格#include#include#include#include#include#includeusing namespace std;#define nn 1001000char s[nn];struct Trie{ int原创 2016-01-24 21:12:30 · 280 阅读 · 0 评论 -
HDU1251 统计难题
简单的字典树,当然也可以用其他方法。#include#include#include#include#include#includeusing namespace std;#define nn 1001000#define lson l,mid,rt<<1#define rson mid+1,r,rt<<1|1struct Trie{ int ch[nn][2原创 2016-01-24 21:14:18 · 340 阅读 · 0 评论 -
HDU1075 What Are You Talking About
水题一道,可以用字典树也可以用map做。都很简单;字典树版#include#include#include#include#include#includeusing namespace std;#define nn 1001000char s[nn];struct Trie{ int ch[nn][26]; int val[nn]; cha原创 2016-01-26 10:08:28 · 313 阅读 · 0 评论 -
POJ 1330 Nearest Common Ancestors
LCA 的 入门级题目。现在给你一棵树,求u和v的最近公共祖先是那个节点。方法有很多种,可以用RMQ,tarjan或者是回溯打标记。#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;#pragma原创 2016-01-27 16:23:53 · 262 阅读 · 0 评论 -
大视野1047 [HAOI2007]理想的正方形
一道简单的二维RMQ,#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;#pragma comment(linker, "/STACK:1024000000,1024000000")#define nn原创 2016-01-31 11:37:10 · 360 阅读 · 0 评论 -
hdu5652 India and China Origins
官方题解:这是一个连通性的问题。你会发现如果将所有操作逆序来看的话就很容易用并查集来处理了。 首先把所有的山峰都加到图中,然后逆序处理每个操作: 对某次操作,在图中删除该位置的山峰,然后判断两个点是否联通,一旦联通就得到了结果。 这里需要对China和India分别新建一个对应的节点。当然加点操作也是可行的。#include#include#include#include#incl原创 2016-03-27 18:45:55 · 760 阅读 · 0 评论 -
LA 2755 Hidden Password
题意:一个长度为n的串,它可以按位循环左移,问变成最小字典序的字符串需要左移多少次。据说后缀数组要TLE。正解是“字符串最小表示” PPT在:http://download.csdn.net/detail/moon_no2015/9006921可以免费下载。代码很简单,至于为什么,看PPT吧。#include #include #include using namespace s原创 2016-08-03 19:58:08 · 387 阅读 · 0 评论 -
UVA 11732 "strcmp()" Anyone?
题意: 输入n个字符串,两两调用一次strcmp(),问字符比较的总次数。分析:两个相同字符 比较2次 两个不同字符 比较1次 ‘\0’和'\0‘ 比较两次 '\0'和其它字符 比较一次思路: 建一颗字典树,然后每insert一个字符串,就原创 2016-07-31 11:05:01 · 375 阅读 · 0 评论 -
LA3907 Puzzle
题意:给s个禁止子串,求不含他们的最长串。思路:用这s个禁止串建一个 AC自动机,那么这些串的尾节点表示禁止节点。然后DFS判断是否存在环(为环就无限长了),在DFS的时候顺便记录下跑的路径,在输出字符串的时候就方便了。代码:#include#include#include#include#include#include#include#include#include#i原创 2016-08-04 09:58:56 · 303 阅读 · 0 评论 -
LA 4670 Dominating Patterns
题意:找出在文本串中出现次数最多的字符串。方法:AC自动机。基本上算模板。(按照大白书的写法)#include#include#include#include#include#include#include#includeusing namespace std;#define ll long longconst ll mod = 20071027;#define nn原创 2016-07-31 15:33:23 · 280 阅读 · 0 评论 -
UVA 11019 Matrix Matcher
题意:找在矩阵T中P矩阵出现的次数做法:AC 自动机,或者hash。hash版:http://blog.csdn.net/moon_no2015/article/details/47760299AC自动机版:#include#include#include#include#include#include#include#includeusing namespace原创 2016-08-01 11:00:14 · 338 阅读 · 0 评论 -
LA 11107 Life Forms
题意:在一个最大的字符串,使得它在超过一半的DNA序列中出现。思路:首先用不同字符间隔将所有输入的串拼起来,,求出这个新串的后缀数组和height数组,然后二分长度P,每次只需要判断出是否有一个长度大于P的串在超过一半的串中连续出现。判断方法是扫一次height数组,将其分成若干段。每当height[i]小于p时开辟一个新段,则每一段的最初p个字符均相同,只要某段中包含了超过n/2个原串的后缀原创 2016-08-01 17:10:15 · 397 阅读 · 0 评论 -
SPOJ DQUERY
题意: 求区间内不同元素的个数。做法:主席树,莫队等等。主席树:又叫可持续化线段树。说白了就是每一个前缀和都建一颗线段树。表示出以该点结尾的区间的区间不同数的个数。 虽然说建立n棵线段树,其实每颗线段树只有longn个点,来维护整个树的信息。因为每两个相邻的线段树只有一个值不同,那么我们就刚好就是这long n个点。不会主席树的可以看看代码。试着将这那个线段树画出来,看看他们每个点的原创 2016-08-18 09:23:08 · 417 阅读 · 0 评论 -
HDU 5877 Weak Pair
题意;求所有点的祖先节点中与他的权值的乘积小于k 的个数的和;思路:我们在从祖先节点开始进行DFS, 当跑到该节点时,在线段树中查找比k/val[u] 小的权值的个数,并在线段树中该权值对应的点+1, 当回溯的时候该点权值的位置在-1。由于权值的范围较大,可以先将权值离散化,或者直接建立一颗手动分配内存的线段树,如果离散化树状数组也可解,当然维护一个set也是可以的。代码:#inc原创 2016-09-12 20:53:11 · 369 阅读 · 0 评论 -
[Zjoi2013]K大数查询
两个线段树,来维护C在任意区间上出现的次数。外层按质(C)建树,内层按下标建树(只建需要用到的节点)。#include#include#include#include#include#include#includeusing namespace std;#define LL long long#define ull unsigned long long#define nn原创 2016-01-20 11:00:03 · 746 阅读 · 0 评论 -
3196: Tyvj 1730 二逼平衡树
/************************************************************** Problem: 3196 User: moonbeam Language: C++ Result: Accepted Time:5236 ms Memory:27600 kb***********************原创 2015-08-22 21:01:55 · 479 阅读 · 0 评论 -
HDU1542 线扫描求矩形面积并
原题的链接为:http://acm.hdu.edu.cn/showproblem.php?pid=1542 这道题是最简单的先扫描的例题,适合初学线扫描的认真仔细理解的一道题。其他的线扫描的题都是在这上面的加深,比如矩形面积并,周长等,思想都是一样的,只是更新部分有的差别而已。说来也就,建树,去重,最后加一条边,计算一次矩形的面积。线扫描的题最主要的就是考虑好状态的更新。原创 2015-07-29 16:32:17 · 329 阅读 · 0 评论 -
HDU3068 最长回文 manacher
至于manacher算法的原理,大家可以去看大神的:http://acm.uestc.edu.cn/bbs/read.php?tid=3258 这里面写的很清楚。#include#include#include#include#include#include#include#include#include#includeusing namespace std;原创 2015-08-17 20:37:21 · 411 阅读 · 0 评论 -
hdu5371 Hotaru's problem 2015年多校第七场C题 最长回文串
题意很简单,就是分成连续三段,相邻的两段为回文,求这三段的最大长度。111 2 3 4 3 2 1 2 3 4 5在这组数据是,为0;131 2 3 4 4 3 2 1 1 2 3 4 6这组数据为12.如果会最长回文的话,这道题就简单了,不会的可以先看看http://acm.uestc.edu.cn/bbs/read.php?tid=3258 ,会manacher的话原创 2015-08-17 21:12:40 · 608 阅读 · 0 评论 -
UVA11235 Frequent values
求区间内出现次数最多的数出现的次数。一道比较经典的RMQ问题,在大白书的198页也最这题进行了详细的分析!#include#include#include#include#include#include#include#include#include#includeusing namespace std;#pragma comment(linker, "/STACK:原创 2015-08-18 20:47:30 · 280 阅读 · 0 评论 -
POJ1703 简单的种类并查集
#include#include#include#include#include#include#include#include#include#includeusing namespace std;#pragma comment(linker, "/STACK:1024000000,1024000000")#define nn 100010#define LL long原创 2015-08-18 20:50:30 · 297 阅读 · 0 评论 -
HDU3308 LCIS 最长连续上升序列。
询问区间内最大的LCIS 我们需要记录包含最左点的LCIS ,包含最右点的LCIS,和这段的最长LCIS,然后向上更新就没了!#include#include#include#include#include#include#include#include#include#includeusing namespace std;#pragma comment(linker,原创 2015-08-18 20:51:40 · 315 阅读 · 0 评论 -
HDU5316 Magician (线段树区间合并)
一个漂亮的子序列指的是:一个子序列,它的每一对相邻元素在原数组中的下标的奇偶性不同。这个题就是求给定的LR区间内的若干个漂亮的子序列他们各自的和最大是多少。对于线段树每个节点,用四个值 奇始奇终、奇始偶终、偶始奇终、偶始偶终 去分别存四种不同情况的最大值。然后向上更新就好了!原创 2015-08-18 20:59:19 · 429 阅读 · 0 评论 -
POJ2528 Mayor's posters
线段树的区间更新,最简单的模型!建树的时候需要离散化!离散时注意要将段改成点的区间,不然离散会出错的!虽然POJ数据水不会WA ,但是还是最一下比较好!例如:131 101 3 7 10正确答案为3,离散错的话会得到答案2.#include#include#include#include#include#include#include#include原创 2015-08-18 21:12:36 · 322 阅读 · 0 评论 -
hdu 5384 Danganronpa AC自动机
求目标串中出现了几个模式。模板题#include#include#include#include#include#include#include#include#include#includeusing namespace std;#pragma comment(linker, "/STACK:1024000000,1024000000")#define nn 1000原创 2015-08-18 16:13:54 · 365 阅读 · 0 评论 -
HDU2795 Billboard 线段树
这是一道简单的线段树,只需要考虑好我们建树的方式即可!我们以高h来建树,点的权值为W,通过来维护区间的最大值,我们很快就能查找到编号最小的点切大于等于wi。。明白之后就是一道简单的线段树单点更新,维护区间最小值。#include#include#include#include#include#include#include#include#include#include原创 2015-08-18 21:29:08 · 770 阅读 · 0 评论 -
UVA 11019 Matrix Matcher
不会AC自动机,就来份邪教的矩阵hash;存个模板留作纪念!AC自动机的做法在大白书上有作为例题来讲的!#include#include#include#include#includeusing namespace std;#define ull unsigned long long#define ll long long#define seed1 131#define原创 2015-08-18 21:34:47 · 357 阅读 · 0 评论 -
hdu4419 Colourful Rectangle(离散,线段树,线扫描,状压)
由于状态有点多,我们用状压的思想来做这道题,用1,2,4分别来表示三原色,其他的就和线扫描一样了!这样是比较简单的做法了,当然也可以用最原始的做法!不过嘛就是有点麻烦了!#include#include#include#include#includeusing namespace std;#define nn 10005#define LL __int64#define roo原创 2015-08-19 09:28:44 · 410 阅读 · 0 评论 -
hdu1255 覆盖的面积
典型的线段树+线扫描#include#include#include#include#includeusing namespace std;#define nn 1010struct node{ int l,r,c; double len1,len2;}tree[nn<<3];struct seg{ double l,r,h; int f;原创 2015-08-19 09:39:09 · 361 阅读 · 0 评论 -
HDU4638 Group (线段树,莫队算法)
题意:给出一个数组,每次查询l,r,看区间内能分成几个连续的数列也即时求求一个区间中连续ID区间的个数。需要离线处理所有查询。我们从左往右扫描,依次考虑右端点为i的询问,设dp[l]为区间[l,i]的连续区间个数,po[i]为i出现的位置,若还未出现,则为0,设我们当前考虑的右端点为a[i],首先我们假设a[i]不能和区间[1,i-1]中的任何一个数分到一组,则我们要将dp[1]到d原创 2015-08-18 21:14:37 · 672 阅读 · 0 评论 -
treap 排序二叉树的模板
Description有一个序列含有一定数量的元素,现在要求写一个程序,满足以下几个要求:【A】支持插入操作(这个序列不允许有重复元素,即是说,如果待插入的元素已经出现在这个序列中,那么请忽略此操作)【B】支持删除操作(如果此序列中不包含待删除的这个元素,则忽略此操作,否则删除这个元素)【C】查找元素x的前继元素(前继元素是指:小于x且与x最接近的元素,当然,如果x已经是序列原创 2015-08-21 20:19:09 · 448 阅读 · 0 评论 -
multi_treap
#include#include#includeusing namespace std;class multi_treap//multi_treap和treap类似,也是一种排序二叉树,但支持重复元素,其他功能上和treap一样{private: struct node//multi_treap的节点定义 { node* ch[2]; int v, r, s, num;原创 2015-08-21 20:32:35 · 385 阅读 · 0 评论 -
HDU 5828 Rikka with Sequence
题意: 对一个长度为10W 的数组进行如下三种操作:1,区间[l,r]的数都加上x;2,区间内的没个数都开根号(向下取整);3,求区间[l,r]每个元素的和。官方题解:但是官方标程也被卡T了。据说hack数据是:10万个2,3,2,3,2,3.......,10万个操作 加6,开根。但是题的确不错。在本题中我并没有按照官方题解的方法。我们可以想下,发现区间的最大值,最小原创 2016-08-13 21:30:38 · 389 阅读 · 0 评论