ACM-线段树
slowlight93
这个作者很懒,什么都没留下…
展开
-
poj 1436 Horizontally Visible Segments(线段树基础,区间染色,拆点)
题意: 。。。 思路: 首先按x排序,, 然后一条一条覆盖上去,当前为i,如果可以同时看到x和y,且x和y互相能看到,答案加1。。 统计的部分暴力就能ac。。 关键点:相邻整数之间的部分被当作看不见了。。不如x相同的两条 (1, 2) (3, 3)…(2, 3)之间其实是可以看过去的,所以要拆点。int xi[Maxn], y1i[Maxn], y2i[Maxn], rk[Maxn];原创 2015-04-24 21:41:24 · 444 阅读 · 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 评论 -
zoj 3686 A Simple Tree Problem (经典,利用dfs序维护树)
题意: 给出一棵树,做 M 次操作,每次要么将一棵子树上每个结点的布尔值取反,要么查询一棵子树上布尔值为 true 的个数 思路: 给一颗树,怎么得到它的dfs序 为什么可以这样呢 设定a[i]存dfs序为i的节点,L[i]是i的子树中dfs序最小的,R[i]是i的子树中dfs序最大的 因为对任意一个节点x, 子树的范围就是L[x]-R[x] 这样就可以用线段树+lazy原创 2015-07-24 15:36:54 · 464 阅读 · 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 评论 -
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 评论 -
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 4578 Transformation(线段树中级,区间和加强)
题意: 在区间和基础版本上增加了两个新的东西: 1)将一段区间的数都乘上某个系数。 2)查询区间的平方和,立方和。 思路: 为每个节点设置 add 和 mul 标记。 每个数的实际值就是 x * mul + add, 实际平方和:∑ri=l(ai∗mul+add)2\sum_{i=l}^{r}{(a_i *mul+add)}^2 实际立方和:∑ri=l(ai∗mul+add)3\su原创 2015-05-15 14:48:04 · 407 阅读 · 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 评论 -
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 评论