
数据结构—线段树
文章平均质量分 82
Ezereal
这个作者很懒,什么都没留下…
展开
-
hdu 1698 Just a Hook (区间更新)
题意:胖子有一条大jb,大JB由n个小JB组成,每次操作将一个区间的小JB变成金银铜三者之一,最后取出所有区间的JB总价值思路:和刷气球差不多意思了,简单的区间更新,无需更新到叶子节点,防止超时#include#include#include#include#include#include #include #include #include #include原创 2015-09-18 16:36:24 · 415 阅读 · 0 评论 -
Educational Codeforces Round 6 E. New Year Tree(DFS序+线段树)
题意:给你一棵树,编号1~n,告诉你根结点是1。 每次有两个操作:1,将以v为根的子树的结点全部染成颜色c2,问以v为根的紫书的结点的颜色种类。思路:如果这是一条线段的话, 那么这就是线段树的区间更新问题,而现在是一棵树。因为告诉了根结点是1, 那么这棵树的任意一个结点的子树就是确定的, 所以我们可以用DFS的先序遍历,将所有结点重新编号,因为先序遍历的话, 任意一原创 2016-08-26 15:23:26 · 443 阅读 · 0 评论 -
2016 ACM/ICPC Reginal Shengyang hdu 5893 List wants to travel(树链剖分 线段树区间更新真蛋疼)★
题意:一棵无根树,两种操作:改变路径上的颜色,和询问路径上有多少段颜色。题解:裸的树链剖分+线段树维护颜色段,唯一难点就是合并的时候 如果两个区间段颜色一样,ans--,链同理。所有的区间更新都需要pushdown,好蛋疼啊,WAWAWAWAWA#include #include #include #include #include #原创 2016-09-19 19:48:19 · 947 阅读 · 0 评论 -
hdu 4117 GRE Words (AC自动机+线段树)★ ★
题意:给出n个字符串,每个字符串有一个权值,我们从中拿出若干个来,这若干个字符串,前一个必须是后一个的子串,问,我们能拿出的这若干个串的权值和最大是多少。解题思路:AC自动机。字符串匹配算法,大概就是kmp,ac自动机,后缀数组,后缀自动机这么几种了。对于这题,我们很容易想到暴力dp,用kmp去匹配,总复杂度可以做到o(n^2+2*m)(n为字符串个数,m为所有字符串的总长),但这样还不够转载 2016-09-26 10:10:53 · 415 阅读 · 0 评论 -
[hdu 5032]2014北京网络赛Always Cook Mushroom 离线线段树/树状数组
题目大意给定一片蘑菇田,只有从(1,1)至(1000,1000)的整数点能产蘑菇,点(x,y)的蘑菇产量为(x+A)(y+B)给定直角三角形的两个顶点和斜边的斜率,用(a,b)的形式给出,求该三角形内的蘑菇产量和。解题思路因为点最多有1000*1000=100W个,可以先求出他们斜率并排序,找到每个斜率的rank,并将询问按照极角排序,离线将询问的斜率也排序,逆时针每个点加转载 2016-09-26 22:28:27 · 314 阅读 · 0 评论 -
Codeforces Round #370 (Div. 2) E. Memory and Casinos 线段树
题意在第i个位置,你有pi的概率走到i+1,有(1-pi)的概率走到i-1单点修改概率区间查询从L开始,从R离开的概率是多少题解:#includeusing namespace std;const int maxn = 1e5+7;typedef pair SgTreeDataType;struct treenode{ int L , R转载 2016-10-15 20:44:55 · 436 阅读 · 0 评论 -
2013 Asia Regional Changchun HDU 4819 Mosaic (二维线段树)
二维线段树的水题了。对于二维的矩阵,需要查询一个区域的最大和最小值。修改单个点的值。二维线段树直接搞,主要是修改的时候,更新操作要往两个方向进行。和一维差不多,就是更新不同。/* ***********************************************Author :kuangbinCreated Time :2014/5/13 23:转载 2016-10-17 18:52:28 · 327 阅读 · 0 评论 -
Codeforces 672 E:Ultimate Weirdness of an Array 线段树 ★ ★ ★
题意是求所有区间[i,j],f(i,j)的和。f(i,j)表示除去i,j的区间之外的数其中两个最大的gcd。ai是从1到200000的数,对于每一个i维护一个区间h(j,k),h(j,k)的含义是f(j,k)然后对于i来说的话,gcd可以发现就是找能够整除这个数的最左距离,次左距离,次右距离,最右距离。之后就是使用线段树更新这个和了。#include #include原创 2016-10-03 16:30:32 · 414 阅读 · 0 评论 -
CF 671D Roads in Yusland 线段树维护代价合并的思想 ★ ★ ★ ★
题目大意给定一颗N个节点的树,现在有M个工人,每个工人有三个属性ui,vi,Ci,表示这名工人可以维修节点ui到节点vi的所有路径,花费为Ci,并且保证vi是ui的祖先。问最少花费多少使得树上的每条边都有人维修。N,M≤300000Ci≤109解题思路这题有个特殊的性质,就是每个工人只会修一条指向祖先的路径。我们设vi为一开始工人所处的位置,那么我们就可以从下往上做,设Fi转载 2016-10-03 16:55:36 · 606 阅读 · 0 评论 -
poj 1177 picture(线段树+扫描线+离散化)★
这道题目就是求这个边界的周长,首先可以讲每个矩形的左右两条边当做两条扫描线,这样如果有n个矩形,就有2*n个扫描线。本代码中l[]数组中保存的就是每条扫描线,包含了这条线上线段的x坐标,两个端点的y坐标,以及是矩形的入边还是出边。建一个二叉树,0 -- cnt - 1,表示有cnt个不同的y值,也就是水平线(已经去除了重复的值)。而树中的l和r标示的就是y数组的下标,当然y数组一定转载 2016-08-13 22:53:40 · 991 阅读 · 0 评论 -
hdu4614 Vases and Flowers (简单线段树 + 二分)
题目大意:n个花瓶,m个操作,花瓶里面有的有花,有的是空的。1操作是从a开始往右放b朵花,花瓶有了的不放,跳过,直到a右边都放满了花,多余的扔了。输出本次放花的起始位置,如果一朵不能放,输出一句话。2操作是清除区间[a,b]的花。并输出清除了多少花。题目分析:简单线段树。只需要维护区间和即可。对于1操作求起始位置,二分位置即可,对于操作2,统计求和即可。#include #i转载 2016-08-13 16:53:39 · 368 阅读 · 0 评论 -
Hdu 4578 Transformation(细节很重要) ★
题目大意:n个数(初始为0)m个操作,操作类型有4中,操作1把区间的每个数+a,操作2把区间的每个数*a.,操作3把区间的每个数=a,操作4,查询区间每个数p次方的和(1对于=更新操作:如果之前有*和+的标记,那可以忽略到*+操作,直接=操作,这个最简单,sum1=val,sum2=val*val,sum3=val*val*val;对于*+操作:如果之前有=标记,就不能忽略了,所以原创 2016-08-13 13:38:23 · 674 阅读 · 0 评论 -
hdu 1255 覆盖的面积
给定一些矩形求被这些矩形覆盖过至少两次的区域的面积求矩形面积交(离散化+线段树)#include #include #include #include #include #include #include #include #include #include #include using namespace std;#define L(i) i<<1原创 2015-10-28 15:23:00 · 392 阅读 · 0 评论 -
poj 3468 A Simple Problem with Integers(线段树区间更新)
题意:一个数列,每次操作可以是将某区间数字都加上一个相同的整数,也可以是询问一个区间中所有数字的和。(这里区间指的是数列中连续的若干个数)对每次询问给出结果。分析:线保留型线段树,线段树中每个节点有两个变量:增量与和,一个记录当前节点对应区间被整体增加了几,另一个记录该区间的真子区间被增加了之后的和是多少。(该区间数字当前和=和+增量×区间长度)#include #include原创 2016-02-25 13:50:16 · 374 阅读 · 0 评论 -
hdu 4027 Can you answer these queries?
线段树区间更新问题,lazy标记当前数能否开方#include #include #include #include #include #include #include #include #include #include #include #include using namespace std;#define L(i) i<<1#define R(i) i<<原创 2016-02-25 16:08:28 · 277 阅读 · 0 评论 -
HDU 5861 Road (线段树+树状数组)
题意:水平线上n个村子间有 n-1 条路. 每条路开放一天的价格为 Cost_i.有 m 天的操作,每天需要用到村子 Ai~Bi 间的道路.每条路只能开放或关闭一次. (不能重复开关)求每天的最小花费.题解:线段树:维护每条路第一次和最后一次被用到的天数.然后用树状数组维护前缀和,最后输出即可#include #include #include #原创 2016-08-19 14:32:23 · 487 阅读 · 0 评论 -
HDU 4747 Mex (2013杭州网络赛1010题,线段树)★
题目定义了mex(i,j)表示,没有在i到j之间出现的最小的非负整数。求所有组合的i,j(i就是求mex(1,1) + mex(1,2)+....+mex(1,n)+mex(2,2) + mex(2,3) + ...mex(2,n)+mex(3,3) + mex(3,4)+...+mex(3,n)+ mex(n,n)可以知道mex(i,i),mex(i,i+1)到mex(i转载 2016-08-31 12:45:57 · 704 阅读 · 0 评论 -
Manthan, Codefest 16(G. Yash And Trees(dfs序+线段树))★ ★ ★
转载自:http://blog.youkuaiyun.com/weizhuwyzc000/article/details/50777092题意:给你一棵树, 根结点为1, q组操作, 每组操作有两种, 一种是对一个结点的所有子树结点的值全部+1, 另一种是查询一个结点的子树结点上值%m的余数为素数的个数。思路:对于第一个操作, 我们可以想到用dfs序给树重新标号, 使得一个结点的子树结点为相邻转载 2016-09-02 22:19:00 · 370 阅读 · 0 评论 -
zoj 1610 Count the Colors(线段树)
题意:给一块长8000米的板上色 问最后能看见几种颜色 而每种颜色的几段思路:线段树。这道题有很多细节eg: 0 2 1 3 4 1output 应该是 1 2 因为中间隔了一段空的具体见代码#include #include #define M 8005#define L(x) (x<<1)#define R(x) ((x<<1)+1)stru转载 2016-08-12 22:18:33 · 288 阅读 · 0 评论 -
hdu 1540 Tunnel Warfare(单点更新,取最大连续区间)★
题意是一条线上的点,D x是破坏这个点,Q x是表示查询以x所在的最长的连续的点的个数,R是恢复上一次破坏的点。线段树结点 设置一个 ls 记录区间左端点开始的最大连续个数, rs 记录区间右端点开始的最大的连续个数,ms表示该区间最大的连续点的个数。#include #include #include #include #include #include #i原创 2016-02-25 16:18:01 · 1024 阅读 · 0 评论 -
Codeforces Round #373 (Div. 2) E. Sasha and Array 线段树维护矩阵
题意给你n个数,两个操作,1是区间增加x,2是查询区间fib(a[i])的和题解:回忆一下你怎么做矩阵快速幂fib的,就知道这个更新,其实就是多乘上了一个A^x矩阵。A = 【0,1;0,0;】这个玩意儿。然后就可以区间更新呢。CF官方题解下面有个评论说的很清楚,大家可以看一下。#includeusing namespace std;转载 2016-10-18 08:55:47 · 426 阅读 · 0 评论