线段树
文章平均质量分 84
詹明捷
此博客停止更新,迁移至www.zhanmingjie.com
展开
-
分析公式 Codeforces 528B Clique Problem
给定数轴上的n个点。下面n行每行两个数 xi, wi 表示点和点权。对于任意两个点u, v若dis(u,v) >= u_w+v_w 则这两个点间可以建一条边。(in other words 若两点间距离大于两点的权值和则可以建边)找一个最大团,输出这个最大团的点数。原创 2015-08-25 15:06:49 · 1107 阅读 · 0 评论 -
成段异或更新 poj3255 Help with Intervals
题目链接 poj3255 Help with Intervals题目大意:集合的基本操作,具体地说就是并、交、相对补和对称差。五种操作 ‘U’、‘I’、‘D’、‘C’和‘S’中的一个 加上一个区间(T),形式为(a,b)、(a,b]、[a,b)和[a,b]。解题思路: U:把区间[l,r]覆盖成1; I:把区间把[-∞,l)(r,∞]覆盖成0; D:把原创 2015-10-11 15:55:40 · 483 阅读 · 0 评论 -
区间合并 单点更新求最长上升子序列
题目链接hdu3308 LCIS题目大意:给你n个整数,有两种操作,(1)"U A B",表示把第A个数变成B,"Q A B",表示查询区间[A,B]的最长连续上升序列。解题思路:O(-1)#include #include #include #include using namespace std;#define lz 2*u,l,mid#define rz原创 2015-10-11 15:57:46 · 839 阅读 · 0 评论 -
区间合并 区间更新 求第一个条件的子段首下标(住宿问题)
题目链接 poj3667 Hotel (此题代码有详细注释,作为初学者可以参考代码理解)题目大意:让你对一个区间进行操作。输入Q C 或者 Q C D。 Q ==1 输入 C: 表示让你求1-n中是否有连续的C个空hotel,如果有多个连续的C个空hotel,则取最左边的,并输出最左边的第一间hotel标号。让人住进去,那么这些空房就不能住人了。如果不存在连续的C个原创 2015-10-11 16:04:22 · 501 阅读 · 0 评论 -
区间合并 成段异或更新 求最长01段
题目链接 hdu3397 Sequence operation题目大意:有n个数,可能为0或为1。接下来是m个操作,操作有5种类型。(1)“0 a b”,表示将区间[a,b]范围内的数全部置0;(2)“1 a b”,表示将区间[a,b]内的数全部置1;(3)"2 a b",表示将区间[a,b]内的数0变成1,1变成0;(4)"3 a b",表示查询[a,b]范围内1的数;(5)原创 2015-10-11 16:07:00 · 539 阅读 · 0 评论 -
区间合并 内纯释放问题 hdu2871 Memory control
题目链接 hdu2871 Memory control题目大意: 给n个单元内存,有 四个操作: 1、New x 找一段长为x的空区间段填满。 (下面用0表示空单元,1表示非空单元。) 2、Free x 释放包含x的区间段 3、 Get x 找到第x个区间段 4、将整个区间都置为空。解题思路:可以原创 2015-10-11 18:01:06 · 543 阅读 · 0 评论 -
区间合并 连续性问题 查询与第x个村相连的村子有多少个
题目链接 hdu1540 Tunnel Warfare题目大意:有N个村子排成一条直线,每个村子都连接了它的左右两个村子(除了最左边和最右边的外),有3种操作,(1)"D x",表示将第x个村子摧毁。(2)"Q x",表示查询与第x个村子直接和间接相连的村子有多少个。(3)"R",表示将最早摧毁的村子复原。解题思路:O(-1)#include #include #in原创 2015-10-11 18:04:10 · 717 阅读 · 0 评论 -
扫描线 求n个矩形覆盖后的总面积之和 hdu1542 Atlantis
题目链接 hdu1542 Atlantis (入门题)题目大意:给你n个矩形,求他们的总面积之和(覆盖区域只算一次)。解题思路: 详解请移步到here。#include #include #include #include using namespace std; #define lz 2*u,l,mid #define rz 2*u+1,m原创 2015-10-11 22:42:29 · 1984 阅读 · 0 评论 -
扫描线 n个立方体相交区域大于等于三次的体积和 hdu3642 Get The Treasury
题目链接 hdu3642 Get The Treasury题目大意:题意:给你N个长方体的和坐标,问你空间中有多少体积是被大于两个不同的立方体覆盖的。解题思路: 其实吧,三维的和二维的其实差不多。如果一个立方体的高为h,那么我们可以把它分割成h层,对每一层进行面积并的扫描,注意是从下往上。这题离散化x坐标是为了方便建树,离散化z坐标是为了节约时间。 剩下的问题就变成了原创 2015-10-11 22:52:03 · 698 阅读 · 0 评论 -
扫描线 矩形内围起的星星亮度总和最大大 poj2482 Stars in Your Window
题目链接 poj2482 Stars in Your Window题目大意:给你一些星星的坐标以及这些星星的亮度(x y c),然后给你一个矩形的框框,长宽分别为W、H,让你用这个框框去围住一个矩形的区域,要求区域内的星星亮度总和最大,并且矩形边框的星星不计入气内。解题思路: 对于每颗星星我们都对它进行一次构造,构造一个(W-1)*(H-1)的矩形(为什么不用W*H,因为边框原创 2015-10-11 22:48:09 · 732 阅读 · 0 评论 -
扫描线 求多个矩形合并后的周长 hdu1828 Picture
题目链接 hdu1828 Picture 题目大意:给你多个矩形,求他们合并后的周长,被覆盖的边不能算进周长之内。解题思路: 其实周长并和面积并没什么很大的区别,只不过周长并增加了判断左右端点是否被覆盖的标记 lbd 和rbd 数组, 以及numseg 数组 记录连续区间段数。numseg : 一根扫描线扫描过去,会记录有多少个连续的区间段,每个连续的区间段都有两条相等原创 2015-10-11 22:44:15 · 1037 阅读 · 0 评论 -
扫描线 求挖空矩形合并面积 hdu3265 Posters
题目链接 hdu3265 Posters题目大意:给你n张矩形海报,每张矩形海报在中间剪去一块矩形区域后贴在窗户上,问你贴完所有的海报之后窗户被海报覆盖的区域有多大。 解题思路:其实这题和第一题差不多。对于每张剪出矩形东东的海报,我们可以这样处理:挨着中间空矩形的两条横边或者两条竖边画两条线,那么每张海报不就变成四个实心矩形了么,接下来的解法和第一题一样。这里要注意的是原创 2015-10-11 22:45:47 · 907 阅读 · 0 评论 -
扫描线 n块菜地最大利润种菜(重叠区域种最贵) hdu3255 Farming
题目链接 hdu3255 Farming题目大意:有n块蔬菜地,每块蔬菜地中种一种作物,每种作物都有一个价格,当在同一区域内种植了两种不同的作物时,作物价格大的生存下来,作物价格小的死亡。问你最后能得到的最大利润是多少。解题思路: 每块蔬菜地种植蔬菜收获的利润为 val=x*y*price。 面积乘以价格,题目的重点转换在于如何确定重叠区域怎么让它种植最贵的蔬菜。观察原创 2015-10-11 22:55:50 · 599 阅读 · 0 评论 -
成段覆盖更新+离散化 求建筑的平面覆盖面积 poj3277 City Horizon
题目链接 poj3277 City Horizon题目大意: 平面上有[1,40000]个建筑,每个建筑有一个区间[Ai,Bi]表示它的跨度,Hi表示其高度。要求这n个建筑的平面覆盖面积。解题思路:和上一题差不多,只是多了一个求面积操作,数据范围过大,同理也要用到离散化。#include #include #include #include using names原创 2015-10-11 15:53:47 · 852 阅读 · 0 评论 -
成段加值更新 区间求和 poj3468 A Simple Problem with Integers
题目链接 poj3468 A Simple Problem with Integers题目大意:给你n个附有起始值的数,然后m次询问。C a b val :表示区间[a,b]的数都加上一个val值,Q a b :询问区间[a,b]的综合。解题思路:O(-1)#include #include #include using namespace std;#defi原创 2015-10-11 15:50:28 · 538 阅读 · 0 评论 -
求左下角星星之和 树状数组或线段树 poj 2352 Stars
题目是要求出每一个点的左下(正左+正下)有几个星星,那个这个点就是第几层,最后输出0~n-1层的点的个数。比如样列编号为5的星星,左下有3个星星那么5就处于第三层原创 2015-08-27 16:47:05 · 870 阅读 · 0 评论 -
两边点连直线求交点总数 树状数组或线段树 poj 3067 Japan
http://poj.org/problem?id=3067JapanTime Limit: 1000MS Memory Limit: 65536KTotal Submissions: 23602 Accepted: 6369DescriptionJapan plans to welcome the原创 2015-08-27 23:20:08 · 975 阅读 · 0 评论 -
每次输出有几条线段能完全覆盖大于自己和hdu5372相反 树状数组或线段树 poj 2481 Cows
http://poj.org/problem?id=2481CowsTime Limit: 3000MS Memory Limit: 65536KTotal Submissions: 14762 Accepted: 4886DescriptionFarmer John's cows have dis原创 2015-08-27 22:48:21 · 719 阅读 · 0 评论 -
每次询问求出两个字符串的最长公共前缀的长度 后缀数组+RMQ+lcp UVA 12338 - Anti-Rhyme Pairs
题目链接题意:给定一些字符串,每次询问求出两个字符串的最长公共前缀的长度思路:把字符串排序,就能求出height和rank数组,然后利用RMQ查询即可代码:#include #include #include #include #include using namespace std; const int N = 100005原创 2015-10-03 21:52:07 · 1102 阅读 · 0 评论 -
查询[l,r]区间数字串是不是周期为d的串 线段树区间修改+双重hash Codeforces #321 E. Kefa and Watch
题意: 给定数字序列 2种操作 1. 将[l,r]区间数字变成c 2. 查询[l,r]区间数字串是不是周期为d的串 x is called a period of string s (1 ≤ x ≤ |s|), if si = si + x for all i from 1 to |s| - x原创 2015-10-06 22:03:43 · 861 阅读 · 0 评论 -
字符串q次操作将(l,r)内的字符升序或降序排列 计数排序 + 线段树优化 Codeforces div2 558E A Simple Task
题意:给定一个字符串,有q次操作,每次操作将(l,r)内的字符升序或降序排列,输出q次操作后的字符串。分析:基本思想是计数排序。所谓计数排序,是对一个元素分布较集中的数字集群进行排序的算法,时间复杂度为O(n),但使用条件很苛刻。首先对n个数扫一遍,映射出每个数字出现的次数,然后再O(n)扫一遍处理出:对于数字ai,有多少个数字在ai前面。有了这个信息,我们就可以在原创 2015-10-07 14:48:00 · 2668 阅读 · 0 评论 -
字符串k在第li到第ri个字符串中一共出现了几次 后缀数组+线段树 Codeforces Div. 1E. Mike and Friends
http://codeforces.com/problemset/problem/547/E题意:给出n个字符串和q个询问,每个询问给出一个区间[li,ri]和数字k,问字符串k在第li到第ri个字符串中一共出现了几次?题目分析:思路一这题用后缀数组来做,十分直观。我的方法是O(nlog2n),O(nlogn)的方法就是把线段树换成主席树来实现(不想原创 2015-10-08 16:02:41 · 774 阅读 · 0 评论 -
单点更新倒序插队问题
题目链接:poj2828 Buy Tickets题目大意:有n个人排队买票对应n个操作,每个操作有两个值 pos val ,代表第i个人会插到第pos个人后面,他手上票的值为val。n个操作完后让你输出n个人排成一队的总状态。解题思路:题目转了一个弯,不是让你直接求第几位的值是多少。但是其实道理是一样的,从后往前开始排,每个人在他自己前面留pos个空位置,有人的位置不算,因为我原创 2015-10-11 15:43:32 · 531 阅读 · 0 评论 -
单点更新区间求和 hdu1166 地兵布阵
hdu1166 地兵布阵 题目大意: 有N个工兵营,每个工兵营开始有a个人,然后有一些操作。Add i j 第i个工兵营加j个人 Sub 第i个工兵营减j个人,Q i j 询问第i到第j个工兵营的总人数。 解题思路:O(-1)#include #include using namespace std;#define lz 2*u,原创 2015-10-11 15:33:43 · 416 阅读 · 0 评论 -
单点更新区间求和贴海报问题 hdu2795 billbord
hdu2795 billbord 题目大意:有一块板子,长宽分别为W,H,然后有n块1*w海报,让你把这n快海报贴在这块板子上,尽量板子的上方贴,同一行尽量往板子的左边贴。对于第i块海报如果能够贴下则输出能贴在第几行,否则输出-1。 解题思路: 设线段树的操作长度为H,则对应的叶子节点的最大值为W。设每次找到符合要求的位置(板子最上最左,对应线段树中最下最左)减去相原创 2015-10-11 15:36:38 · 680 阅读 · 0 评论 -
单点更新查询区间最大值 hdu1754 I hate it
hdu1754 I hate it 题目大意:给你N个数,M个操作,操作分两类。(1)"Q A B“,查询区间[A,B]内的最大值。(2)"U A B",将第A个数的值改成B。 解题思路:O(-1)#include #include using namespace std;#define lz l , m , rt << 1#define rz m + 1原创 2015-10-11 15:39:52 · 531 阅读 · 0 评论 -
成段改A为B更新区间求和 hdu 1698 Just a Hook
题目链接 hdu 1698 Just a Hook 题目大意:给你n个数(初始时每个数的值为1),m个操作,每个操作把区间[l,r]里的数更新为c,问最后这n个数的和是多少。 解题思路:O(-1)#include #include using namespace std;const int maxn=100005;int tree[4*maxn];int原创 2015-10-11 15:46:17 · 505 阅读 · 0 评论 -
单点更新 平面增减点后找出平面上坐标大于(x,y)的点,有多点则找x小y小
题意:有三种操作“add x y”往平面上添加(x,y)这个点,"remove x y",将平面上已经存在的点(x,y)删除,“find x y”找出平面上坐标严格大于(x,y)的点,如果有多个点找x最小的,再找y最小的。第一次写这种类似的线段树,好处是省内存。这里可以先读入所有坐标后去重,然后对于每一个x坐标,维护一个set记录该x坐标下的所有y坐标,便于添加点或者删除点后查找最大的y坐原创 2015-10-13 17:34:42 · 724 阅读 · 0 评论