线段树
文章平均质量分 80
2013hlq20
没什么好说的
展开
-
CF256E Lucky Arrays
在线段树上dp。我无论如何也是想不出来的。我直接说思路吧。就是建一颗[1, n]的线段树,节点域为a[3][3],表示该节点表示的区间首尾分别为x, y时方案数为a[x][y]。叶子节点的a数组的值与于该点的值有关:叶子节点的值z为0时有a[i][j] = (i == j ? 1 : 0),否则只有a[z][z]=1其余为0。那么其它节点的维护可以用如下函数写出:void upda原创 2015-02-22 21:37:59 · 410 阅读 · 0 评论 -
CF85D Sum of Medians
操作数nvoid Update(int u) { seg &lch = Tree[u * 2], &rch = Tree[u * 2 + 1]; Tree[u].size = (lch.size + rch.size) % 5; for(int i = 0; i < 5; i++) Tree[u].a[i] = lch.a[i] + rch.a[(i - lch.原创 2015-02-21 23:43:15 · 399 阅读 · 0 评论 -
hdu3397 Sequence operation
一个很繁琐的线段树的题,对于一个树节点表示的区间 [L, R] 我们要维护以左端点为起点的连续最长的1,以右端点为结尾的连续最长的1,以及这个区间连续最长的1;因为这个题有反转操作,我们还要记录0的情况,其它的就很常规了。反正要细心,错了就静态查错(主要是代码太丑,不好调试),然后就可以AC了。#include#includeusing namespace std;const in原创 2015-03-16 23:01:08 · 380 阅读 · 0 评论 -
CF258E Little Elephant and Tree
注意到每个操作都是对子树上色,我们先dfs得到dfs序,那么子树u可以表示为区间 [dfn[u], dfn[u] + size[u]) 其中cnt[u]表示子树u的节点数,这样我们就将上色的操作转变成了线段树的区间覆盖。有了dfs序之后,我们就可以再dfs一遍,每到一个节点,就涂色(前提是这个节点有涂色操作),然后统计有多少节点上了色,那么上色数-1就是这个节点的答案。代码很丑的..#in原创 2015-03-16 22:42:49 · 459 阅读 · 0 评论 -
poj3667 Hotel
经典问题,就是线段树[L, R]上保存3个信息,分别表示以L开头最多连续的空格,R为结尾的最多连续空格,这段区间最大的连续空格。然后就可以写代码了。(为什么我的线段树这么丑)#includeusing namespace std; const int MAXN = 50000; struct seg { int l, r; int a, b, Max; i原创 2015-03-16 22:55:59 · 342 阅读 · 0 评论 -
hdu1542 Atlantis
求矩形面积的并,这个题应该是线段树刚刚出现在竞赛时要做的题。这个题的主要思想就是扫描,我们将所有矩形竖直方向的两条线段,都拿出来排序,然后扫描用线段树维护覆盖的线段长度即可。对于如上的矩形给所有竖直线段排序后就可以得到下面的图我们可以观察到从一条线段到下一条线段之前竖直方向的覆盖长度a都不变,而这两条线段之间的距离为b,那么这两条线段之间的面积表示为a * b。邻近原创 2015-03-16 23:09:55 · 496 阅读 · 0 评论 -
hdu4027 Can you answer these queries?
这个题乍一看没思路啊,但后来发现每个数小于2^63,开方至多6次就变成1了,然后就不用开方了,只有这么暴力了。(似乎我的代码里有一些没用的东西= =)#include#include#includeusing namespace std;typedef long long LL;const int MAXN = 100000;int n;LL A[MAXN + 10];原创 2015-03-16 23:47:18 · 471 阅读 · 0 评论