ACM.数据结构
slowlight93
这个作者很懒,什么都没留下…
展开
-
HDU 5032 Always Cook Mushroom (极角排序 x 树状数组)
题意: 给定一个 [1, 1000] x [1, 1000] 的点阵,每个点阵中的点有一个权值。 n 组询问,每次询问一个由 (0,0)、(x,0) 点一以及从原点出发的方向向量 (a,b) 构成的直角三角形包围的点的权值和。 思路: 极角排序 + 离线处理 + 树状数组 这篇题解很详细const double EPS = 1e-12;struct Node { int x, id原创 2015-09-11 12:52:45 · 650 阅读 · 0 评论 -
UVALive 6838 (括号匹配x线段树)
题意: 。。 思路: 定义a, b数组, indexed from 1a[i] = a[i-1] + ( s[i] == '(' ? 1 : -1 );定义一个b数组b[i] = a[i] - is平衡的必要条件是,a[n] = 0。虽然仅靠这个是不可靠的。。但用这个必要条件已经可以ac了。。 如果b[i] < 0,则 [1, i] 中一定有右括号 1)修改a[x]为 ),[x,n]区间减原创 2015-08-25 17:02:53 · 758 阅读 · 0 评论 -
hdu 4366 Successor (线段树xdfs序x排序预处理)
题意: 给一颗树,每个节点两个属性(x,y)。 每次查询一个子树中,x大于root(子树的根)且y最大的节点。思路: 查询子树,很容易想到先求出dfs序然后用线段树维护y值。 但如何保证 x 呢? 如果让线段树初始为空,叶子的值是-1。 将节点按 x 从大到小排序,x 相等则 dfs序小的在前 (这里子树中root的dfs序最小) 然后只要按序查询每个节点对应的子树,然后将节点更新到线原创 2015-08-25 01:23:02 · 536 阅读 · 0 评论 -
hdu 4622 Reincarnation(后缀自动机,入门级)
题意: 求字符串任意字串的不同字串数。 思路: 用后缀自动机可以做到 O(n2)O(n^2)预处理,O(1)O(1)回答查询。 不过我的代码跑了 1000+ms 别人的代码可以跑到 100ms-200ms。。 VJ的记录#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>#includ原创 2015-08-09 14:46:17 · 552 阅读 · 0 评论 -
hdu 1542 Atlantis(线段树进阶,扫描线,矩形面积并)
题意: 给n个坐标为实数的矩形,求它们的并面积。 思路: 1)扫描算法 扫描线是这样做的,用一个数组来存边,对每个矩形添加它的两条边,上边和下边,,然后所有边从下至上排序。。 扫描过程: 来一条边,如果是上边,把它覆盖的线段计数减1就行了。如果是下边则加1。增加的面积是当前计数不为0的线段长度之和 乘上 (当前边与下一条边纵坐标之差)。。 如右图所示,模拟一下就明白了 2)离散化原创 2015-05-01 21:15:28 · 542 阅读 · 0 评论 -
poj 3667 Hotel(线段树中级,区间合并)
题意: 。。。 思路: 类似动态的最大连续和。 这里我们需要构建一个查询 最靠左的长度不小于D的区间的操作。 可以分类讨论 lc = left child, rc = right child 0)max[o]<Dmax[o] < D 不存在,直接返回 1)lmax[lc]>=Dlmax[lc] >= D 左半区间查询 2)rmax[lc]+lmax[rc]>=Drmax[lc]原创 2015-04-29 16:32:53 · 443 阅读 · 0 评论 -
poj 3225 Help with Intervals(线段树进阶,处理区间,拆点)
题意: 求区间的交,并,补,对称差。。 思路: 为了表示开闭区间,用偶数表示闭区间端点,奇数表示开区间的。 [2,3) -> 4, 5 (3, 7) -> 7, 13 集合操作可以分解为两种,set和xor。。 先实现这两种操作,再讨论情况。。const int Maxn = 65550*2;#define lson(x) ((x)<<1)#define rson(x) (((x)<原创 2015-04-24 19:28:41 · 459 阅读 · 0 评论 -
srm 310 div2 1000(BIT基础, 二分)
题意: 给一个长为N的非负整数序列。然后K长的滑动窗口。 求窗口经过区间的中值之和。 思路: 每次把出去的元素-1,进来的+1。二分前缀和为(K+1)/2的值。const int Maxn = 65535+1;int tree[Maxn+5], a[250001];int sum (int x) { int ret = 0; while (x > 0) {原创 2015-04-15 16:30:58 · 461 阅读 · 0 评论 -
tyvj 1427 小白逛公园(线段树中级,单点修改,动态最大连续和)
题意: 区间[1, n],开始给出初值。 m个操作,包括单点修改和区间最大连续和询问。 思路: 重点在两个地方 1)维护,最大连续和可能在左半区间或右半区间,也可能跨越中点,为此我们需要对一个节点维护最大前缀和,最大后缀和,最大连续和,总和这四个变量。 2)查询,一个区间查询,覆盖了树上一些连续的节点,所以我们应该在查询的过程中把这些节点,相邻的两两合并,最后合并成一个节点返回。stru原创 2015-04-13 22:51:41 · 1163 阅读 · 0 评论 -
hdu 3954 Level up(线段树进阶)
题意: 。。。 思路: 容易想到每个节点,需要维护,(最大exp,最大lev,tag)。 问题在于,区间内每个人的等级是不同的,不能统一维护。。 像exp[child] += lev[child] * tag[now];tag[child] += tag[now]这样的代码只能够在区间内没人升级的时候正常工作。。 当前区间有人升级的时候,我们便跟新子区间,将他升级。 所以,我们在叶子原创 2015-04-23 15:15:43 · 696 阅读 · 0 评论 -
zstuoj 4186 表白计划(区间操作x线段树)
题意: 。。 这道是zstu2015校赛题。。 传送 思路: 对于第一个询问,先维护差分序列,然后求对差分序列求两次前缀和得到前缀和。 对第二个询问。 假设用pair<int, int>来表示区间。 先把表白计划按girl分开存,对每个girl处理出她不发好人卡的区间。 这一步是 O(mlogm),m 为区间数 建一个线段树,节点 v(l,r)包含girl_l到girl_r的不发原创 2015-08-26 00:04:57 · 518 阅读 · 0 评论 -
【算法笔记】Aho-Corasick 算法(AC自动机) 小结
参考: 《训练指南》 http://codeforces.com/blog/entry/14854这个改进《训练指南》中说过, 本文的目的是总结并实现一个自用的模板。。 AC自动机每个节点有一个 fail 指针, 作用与KMP中相同。 假如我们的节点是这样的// link 就是 fail指针struct Node { Node *go[CharSet], *link; in原创 2015-08-10 21:18:12 · 622 阅读 · 0 评论 -
spoj K-th Number (classic! 区间静态第k大)
这道题的 comment 里有人说 题目链接 Beautiful problem. There exists solution which run in O(log^3 N), O(log^2 N), and O(log N) per query. Explore them and learn something new! 我学到的第一种应该是最大的那种, 就是构造一个线段树, 其中每个节点原创 2015-08-02 02:00:53 · 476 阅读 · 0 评论 -
hdu 5381 The sum of gcd (线段树x树状数组x区间和维护进阶x离线处理)
题意: 重复,在t的起始找第一次出现的w,从t中删掉。 求最后的t。 思路: T: 文本 , W: 关键词 KMP过程中T中每个位置都对应了一个W的失配函数值。 我们可以把任何一个状态拿出来,然后继续匹配下去。 匹配过程中把这些pair压入stack。 删除:弹出连续|W|个状态,于是状态回到|W|个字符前,继续与剩下的T进行匹配const int Mxn = 5e6 + 5;ch原创 2015-08-20 02:47:53 · 749 阅读 · 0 评论 -
poj 2985 The k-th Largest Group (并查集x全局动态第k大)
题意: 。。。 思路: 用一个数据结构来存所有树的大小,合并操作先消去旧的再插入新的大小。 可以用 treap, BIT等等。。 这里有个树状数组 O(logn)O(logn) 查询的方法,没能看懂。。const int N = 200000 + 5;typedef long long LL;namespace Treap { static const int MaxNode =原创 2015-08-21 03:56:02 · 582 阅读 · 0 评论 -
【算法笔记】并查集小结
并查集最朴素的用法就是用来维护连通性。 然后可以用在 Kruskal 算法中求 MST。 并查集还可以维护更多信息 1)加上顺序 poj 1456,需要找 1 - i 格子中最靠右的空格。 让每个节点的根代表往左找到的第一个空格。 当一个空格子被占用,维护操作只需要pa[pos] = pos - 1PS:这道题也可以不用并查集,用二分来找 2)为点加上权值 zoj 3261 可以看原创 2015-09-03 16:31:44 · 449 阅读 · 0 评论 -
UESTC 360 Another LCIS(线段树 x 经典区间合并姿势)
题意: 定义 CLIS 为在原序列中连续的一段构成的 LIS。 两种操作 a)给某个区间加上一个值 b ) 询问区间 CLIS 思路: 。。。const int N = 100000 + 5;#define lc o<<1#define rc o<<1|1int g_len;struct Node { int lv, rv, l, r, m, add; void upd(原创 2015-09-01 17:50:32 · 481 阅读 · 0 评论 -
POJ 2892 Tunnel Warfare (线段树)
题意: 。。。 思路: 类似 Hotel。。 不同的地方是,需要通过单点来得到包含它的空区间。 因为空区间一定会在某个节点分成两半,一半在左孩子,一半在右孩子。(空区间长度为1特例) 所以查询时加个判断就行了。 PS:set 可秒const int N = 5e4;#define lc o<<1#define rc o<<1|1struct node { int l, r,原创 2015-09-01 15:40:28 · 425 阅读 · 0 评论 -
uva live 5031 Graph and Queries(Treap x 并查集)
题意: 。。。 同样收录在 HDU 3726,不过hdu貌似有时候 re 会报 wa,不方便调错。。 思路: 教科书题。。 用来练 Treap 模板很合适尝试写了几发GC, 用stack来装指针。。发现效率都不是很高。。还很耗内存。。于是放弃了。。// 纯动态#include <iostream>#include <cstdio>#include <algorithm>#inclu原创 2015-09-01 15:29:59 · 567 阅读 · 0 评论 -
codeforces 570D Tree Requests (树转dfs序,区间统计)
题意: 。。。 思路: 比赛的时候,想到dfs序,不过对层想不到好的处理方法。。 结束发现其实很简单。。分层统计不就行了吗。。 所以可以对每个询问,二分在层内的位置,也可以存前缀和,离线处理询问,甚至可以每一层都建一个BIT。。。 下面是离线处理的代码 注意题目的特殊条件,可以用异或来代替加减const int N = 500005;typedef pair<int, int> pi原创 2015-08-15 00:39:55 · 588 阅读 · 0 评论 -
hdu 4630 No Pain No Game (区间gcd相关x线段树or树状数组)
题意: 给定1-n的一个排列。 在一段区间,找两个位置不同的数,使得gcd最大。 思路: 因为给的序列很特殊。 首先容易想到,对1-n每个数作为约数维护一个状态。 把序列中x的倍数,按原来的位置,过滤出来。 对一个询问li, ri 如果其中至少有两个落到[li, ri]区间中,则x为一个可能值。 考虑将询问按右端点从小到大排序。 last[x]last[x]保存x最近出现的位置,原创 2015-08-28 02:06:10 · 551 阅读 · 0 评论 -
codeforces 46D Parking Lot(线段树模拟区间管理 or set模拟)
题意: 可以看成是 poj Hotel 那道题的加强版。 这里是找车位,还要考虑与前后车之间的距离。。 不过这里n只有100,用set,就成了水题啊。。。思路: 1) 线段树 比起 Hotel 也就是多讨论几种情况吧。。const int N = 100000 + 5;struct Node { int len, l, r, m, tag; // 0 - no tag, 1 - f原创 2015-08-28 01:47:39 · 388 阅读 · 0 评论 -
poj 3481 Double Queue(平衡二叉树基础练习题)
题意: 。。。 思路: 这道题用来作SBT的练习了。。。// SBT节点,固定域 l, r, sz// 需要一个key来比较大小struct node { int l, r, sz, val, K; node (int x=0, int y=0):l(0), r(0), sz(0), val(x), K(y){}};struct SBT { node a[Maxn原创 2015-04-19 00:15:49 · 2182 阅读 · 0 评论 -
hdu 3487 Play with Chain (Splay tree基础)
题意: 最基本的维护数列。 提取区间,懒惰标记。。 思路: 先推入0和n+1两个元素,以方便处理边界情况。 用到的基本操作:insert,select(选取kth,0-indexed),splay 1)提取区间[a, b] splay a-1th 到根,splay b+1th 到根的右孩子,则 b+1th 的左子树对应该区间。 2)反转区间 先反转自己的标记,标记向下传递(访问之前原创 2015-04-22 16:34:35 · 621 阅读 · 0 评论 -
2014西安现场赛I题 International Collegiate Routing Contest(字典树)
题意: 全域是CDIR的ipv4空间。 给若干个ip地址块,然后求他们的补。 思路: 容易想到使用二叉树来解决这个问题,相当一个补齐叶子的问题。缺掉的叶节点就是所求。 所以很自然的可以使用trie。最多30000个地址,每个最多32位,所以最多30000×32个节点。 注意:要标记地址的结束节点,在访问的时候遇到标记的节点必须返回。因为这种节点下面的子树都已经被覆盖了。 这道题,思路挺原创 2015-03-21 22:02:40 · 986 阅读 · 0 评论 -
hdu 2545 树上战争(加权并查集)
题意:给出一颗树,每次询问树上两个节点到根的距离谁跟近原创 2014-11-13 17:10:03 · 726 阅读 · 0 评论 -
poj 2299 Ultra-QuickSort(fenwick树求逆序对)
树状数组求逆序对数方法 GET!原创 2014-10-09 15:08:57 · 571 阅读 · 0 评论 -
Codeforces 269 div2
C每一层需要的卡片数原创 2014-09-27 17:58:41 · 517 阅读 · 0 评论 -
POJ 3581 Sequence(后缀数组)
由于第一个元素最大,所以可以直接原创 2014-09-25 19:20:31 · 448 阅读 · 0 评论 -
uva 1449 Dominating Patterns(ac自动机)
最基本的匹配,适合用来熟悉ac自动机。在打模板的shihou原创 2014-09-03 15:02:43 · 533 阅读 · 0 评论 -
uva 1400 Ray, Pass me the dishes!(线段树, 分治法求最大连续和)
参照RJ大大的代码写的。非常经典的一题!!!原创 2014-09-02 13:14:26 · 661 阅读 · 0 评论 -
uva 11992 Fast Matrix Operations(线段树,区间修改)
此题也是无数WA。原创 2014-09-02 18:34:50 · 530 阅读 · 0 评论 -
uva 11235 Frequent Values(游程编码, RMQ)
因为序列非降,所以相等的元素聚在一起,可以用原创 2014-08-31 21:12:42 · 618 阅读 · 0 评论 -
poj 2823 Sliding Window (线段树,RMQ)
以前写的双端队列版本原创 2014-08-31 13:59:53 · 541 阅读 · 0 评论 -
hdu 3726 Graph and Queries (Treap应用,名次树)
名次树还是比较r原创 2014-10-04 02:40:02 · 698 阅读 · 0 评论 -
uva 11922 Permutation Transformer(Splay tree,懒标记传递)
关于Splay tree网上原创 2014-10-04 18:31:56 · 669 阅读 · 0 评论 -
hdu 2818 Building Block(加权并查集)
题意翻译开始有n棵树,每棵树的大小原创 2014-11-02 22:21:11 · 414 阅读 · 0 评论 -
hdu 5183 Negative and Positive (前缀和加强版,强数据。。)
题意: 。。。 思路: 恩。 这道题数据太强了,以至于不用输入挂过不了 = = 我是用的输入挂+hashint t, n, k;LL a[Maxn+5], f[2][Maxn+5];const int Mod = (int)(1e6+7);struct Ent{ LL val; int nxt;};Ent buffer[Mod*2+5];int head[Mod+原创 2015-03-20 23:07:19 · 464 阅读 · 0 评论 -
codeforces 444C DZY Loves Colors(线段树)
题意:[1, n] 中ai的有两个属性,颜色,累积和。定义两种操作,1:区间染色 2:区间查询。当一个点的颜色变化时,累积和 += abs(new - old)。。。思路:对线段树上每个节点维护三个属性, sum(和), color(颜色), sign(累积和)。。pushdown:如果当前节点上 sign 不为0 (区间修改的结果放在这个节点上,还没更新到子节点), sign[原创 2015-01-21 20:17:06 · 1119 阅读 · 0 评论 -
hdu 2846 Repository(Trie)
Trie练手题。算了下,静态分配内存貌似会MLE?不过看别人的代码开 2e6 * 26 的数组竟然过了? = =嘛,写了个动态的。。#include #include #include #include #include #include #include #include #include #include #include #include using na原创 2014-12-09 23:48:58 · 488 阅读 · 0 评论