线段树
文章平均质量分 68
BSOD_aura
这个作者很懒,什么都没留下…
展开
-
Codeforces 558E 线段树处理字符串内排序
给出长度为n的字符串,m个操作。每个操作有三个值 l,r,op。op==1,表示将字符串中[ l ,r ]的部分按照升序排列。op==0,表示将字符串中[ l ,r ]的部分按照降序排列。输出最终的字符串按小写字母建26颗线段树对于每次修改,先记录[l,r]区间内各个字母出现的次数,并对相应区间清空,然后按照升序或者降序从新更新#include "std原创 2015-07-22 12:29:24 · 1105 阅读 · 0 评论 -
HDU 5091 线段树扫描线
给出N个点,和一个w*h的矩形给出N个点的坐标,求该矩形最多可以覆盖多少个点对每个点point(x,y)右边生成对应的点(x+w,y)值为-1;纵向建立线段树,从左到右扫描线扫一遍,遇到点则用该点的权值更新区间(y,y+h)#include "stdio.h"#include "string.h"#include "algorithm"using namespace原创 2014-11-02 18:42:18 · 1427 阅读 · 0 评论 -
HDU 4107 线段树
给出N个节点,M次操作,和p每次操作 对l-r区间的每个节点+c,若节点值>=p,则加2*c;结点存当前区间伤害最小值,最大值,以及lazy操作。更新到如果最小值大于等于P,或者最大值小于P为止。#include "stdio.h"#include "string.h"struct node{ int l,r,Min,Max,lazy;} data原创 2014-11-03 17:39:58 · 769 阅读 · 0 评论 -
ZOJ 1610 线段树区间染色
给长度8000米的板,对其中区间染色,问最后能看到的颜色,和该颜色一共出现了几段线段覆盖法数据比较水 也可以暴力水过线段树:#include "stdio.h"#include "string.h"struct node{ int l,r,c;}data[40010];int color[8011];void build(int l,int r,i原创 2014-10-30 19:45:45 · 840 阅读 · 0 评论 -
HDU 3698 DP+线段树
给出N*M矩阵,每个点建立灯塔有花费,每个点的灯塔有连接范围,求每一行都建立一个灯塔的最小花费,要求每相邻两行的灯塔可以互相连接,满足 |j-k|≤f(i,j)+f(i+1,k)DP思路,dp[i][j]=在第i行的j位置放置灯塔的最小花费,dp[i][j]=Min(dp[i-1][k]+a[i][j]),同时更新当前点可以覆盖该行的所有位置的最小值要求上个区间的最小值,用线段树优化,否则原创 2014-10-14 14:01:10 · 1268 阅读 · 0 评论 -
HDU 1199 && ZOJ 2301 线段树离散化
一段长度未知的线段,一种操作:a b c ,表示区间[a,b]涂为颜色C,w代表白色,b代表黑色,问最终的最长连续白色段,输出起始位置和终止位置离散化处理,和平常的离散化不同,需要把点化成线段,左闭右开,即对于一段区间[a,b],转化成区间[a,b+1)#include "stdio.h"#include "string.h"#include "algorithm"using n原创 2014-10-30 15:56:35 · 1073 阅读 · 0 评论 -
BZOJ 1012 线段树||单调队列
很裸的线段树 ||单调队列:如果一个节点在队列中既没有时间优势(早点入队)也没有值优势(值更大),那么显然无论在怎样的情况下都不会被选为最大值。 既然它只在末尾选,那么自然可以满足以上的条件。线段树#include "stdio.h"#include "string.h" struct node{ int l,r,Max;}d原创 2014-10-22 10:32:24 · 763 阅读 · 0 评论 -
SYSU 1686 线段树 lazy
区间更新+lazyI 操作 l-r 区间+cC操作 l-r区间的最大值,并把最大值删除线段树再加个记录最大值的位置即可#include "stdio.h"#include "string.h"int ans,mark;struct node{ int l,r,Max,mark,lazy;}data[400010];void原创 2014-09-03 10:19:48 · 708 阅读 · 0 评论 -
HDU 4973 线段树 映射离散算法
线段树的应用2014 Multi-University Training Contest 10题意:N个数,1-n每个数出现一次,M次操作操作D:第a个数到第b个数次数翻倍操作Q:询问第a个数到第b个数出现次数最多的数的个数对于样例:1 2 3 4 5D 5 5 =>1 2 3 4 55Q 5 6 =>1 2 3 45 5D原创 2014-09-02 16:41:58 · 701 阅读 · 0 评论 -
HDU 5023 线段树+状压
2014 ACM/ICPC Asia Regional Guangzhou OnlineN个节点,M个操作。P操作把l-r全部改为x (1Q操作询问l-r出现的数字,升序输出线段树成端更新+成端查找因为X最大30,用二进制压缩存储已经出现的数字。#include "stdio.h"#include "string.h"struct node{ i原创 2014-09-23 15:37:56 · 1051 阅读 · 0 评论 -
POJ 2828 线段树 水题
线段树部分很简单重点是处理的思想对数据从后往前插入队列#include "stdio.h"#include "string.h"#include "math.h"#include "stdlib.h"struct comp{ int l,r,mid,sum,w;} data[800008];int first;int a[200001],b[20000原创 2013-09-05 19:10:10 · 771 阅读 · 0 评论 -
HDU 4893 线段树
2014 Multi-University Training Contest 31 k d, 修改k的为值增加d2 l r, 查询l到r的区间和3 l r, 间l到r区间上的所以数变成最近的斐波那契数,相等的话取向下取。原本以为需要加lazy...竟然可以直接暴力线段树过。。用cover 记录此区间内的数是否都已经为斐波那契数,对满足的区间不再进行更原创 2014-07-29 19:55:56 · 754 阅读 · 0 评论 -
HDU 4578 线段树 多lazy操作
2013ACM-ICPC杭州赛区全国邀请赛原创 2014-07-10 11:58:29 · 575 阅读 · 0 评论 -
HDU 4902 线段树||暴力
给定一个序列,两种操作1:把一段变成x。2:把一段每个数字,如果他大于x,就变成他和x的gcd,求变换完后,最后的序列。线段树解法:用lazy标记下即可,优化方法还是很巧妙的,Accepted4902515MS3308K1941 BC++#include "stdio.h"#include "string原创 2014-08-02 20:25:34 · 817 阅读 · 0 评论 -
BZOJ 1798 线段树 双LAZY操作
线段树裸题 双LAZY操作 记录 mul和add原创 2014-04-15 11:09:56 · 457 阅读 · 0 评论 -
HDU 3874 离线线段树
统计区间内所有数字和,对于重复出现的只统计一次线段树的离线算法 按结束坐标排序,然后扫一遍,遇到重复的,就把之前插入线段树的给删掉#include "stdio.h"#include "string.h"#include "algorithm"using namespace std;struct node{ int l,r; __int64 sum;原创 2014-11-03 16:37:09 · 787 阅读 · 0 评论 -
HDU 5107 线段树扫描线
给出N个点(x,y),每个点有一个高度h给出M次询问,问在(x,y)范围内第k小的高度是多少,没有输出-1 (k线段树扫描线首先离散化Y坐标,以Y坐标建立线段树对所有的点和询问进行离线操作,将询问和点按照x,y的大小排序,从左向右,从下向上,对于相同的(x,y)插入点在询问点之前线段树的每个节点维护10个高度,每次询问[0,mark[i].y]的第mark[i].h高的原创 2014-11-17 16:53:26 · 1054 阅读 · 5 评论 -
HDU 2461 线段树扫描线
给出N个矩形,M次询问每次询问给出R个,问这R个矩形围成的面积经典扫面线求面积并,对每次询问的R个点离散化一下#include "stdio.h"#include "string.h"#include "algorithm"#include "map"using namespace std;mapmp;struct P{ int x1,y1,x2,y2原创 2014-11-08 14:38:52 · 1033 阅读 · 0 评论 -
HDU 5289 思路+线段树处理
给出N个数,和K求这N个数的所有满足条件(最大数-最小数数组b记录以当前位置开始,到最右端最多满足条件的数的个数,b数组的值可通过二分+线段树查找区间最大最小值得到对于第二组数据10 50 3 4 5 2 1 6 7 8 9B数组为3 7 7 7 3 1 4 3 2 1由于当前I点取最右端值可能会导致i+1点和后面取到的点不满足条件,所有应有:b[i]得B数原创 2015-07-22 13:45:22 · 795 阅读 · 0 评论 -
HDU 5372 线段树
给出两种操作:第i个0:在x位置插入一个长度为i的线段,并输出该线段共覆盖了多少之前加入的线段1:删除第i次插入的线段官方题解:对于新插入的线段,查询有多少个线段左端点大于等于该线段的左端点。 再查询有多少个线段的右端点大于该线段右端点, 两者之差就是答案。用两个树状数组搞定。时间复杂度nlog思路很好理解,直接用一个线段树记录区间的左端点和右端点即可#include原创 2015-08-12 14:57:18 · 740 阅读 · 0 评论 -
HDU 5316 线段树区间最值问题
T组数据N个数字,M次操作op=0:找出L-R区间内的最大‘值’op=1:把a位置的数字换成b对最大‘值’的定义:取区间内的最大子序列,需要保证子序列的下标为奇偶交替的用线段树分别记录每个区间的ee:以偶数下标开始偶数下标结束的最大和eo:以偶数下标开始奇数下标结束的最大和oe:以奇数下标开始偶数下标结束的最大和oo:以奇数下标开始奇数下标结束的最大和原创 2015-07-28 16:58:06 · 1170 阅读 · 0 评论 -
2013山东省赛Boring Counting 离线线段树
2013年山东省第四届ACM大学生程序设计竞赛n个数,m次询问每次询问在 l-r区间内的 大小范围的在 a-b之间的数字个数先将原数组排序做两遍线段树第一次对m次询问的b升序排列,每次插入所有小于等于b的数字,然后线段树查询在区间 l-r范围内的数字个数,记录在ans[i].r第二次对m次询问的a升序排列,每次插入所有小于a的数字,然后线段树查询在区间l-r范围内原创 2015-04-14 10:29:10 · 587 阅读 · 0 评论 -
HDU 3607 线段树+离散化+DP
N个连续的盒子,每个盒子有高度h和价值v,选择任意一点进入,且从任意一点出来,进入后只能从左向右走,且每次走到的盒子高度必须更高,可以跳过低的盒子状态转移方程:dp[i]=max(dp[j])+v[i], (0h[j])用线段树优化,寻找 j#include "stdio.h"#include "string.h"#include "queue"#inc原创 2015-03-24 20:29:27 · 664 阅读 · 0 评论 -
HDU 1255 扫描线
扫描线处理矩形覆盖过至少两次的区域的面积.把callen函数的修改一下即可data[k].len表示被覆盖的长度data[k].sum表示被覆盖两次以上的长度#include "stdio.h"#include "string.h"#include "algorithm"#include "math.h"using namespace std;struct Ma原创 2015-03-22 16:35:54 · 575 阅读 · 0 评论 -
FZU 2187 扫描线
和HDU 1255差不多这次是求只被覆盖一次的矩形面积和修改callen函数即可data[k].len表示被覆盖的纵长度data[k].key表示被只被覆盖一次的纵长度#include "stdio.h"#include "string.h"#include "stdlib.h"#include "math.h"#include "iostream"#incl原创 2015-03-22 16:57:44 · 611 阅读 · 0 评论 -
HDU 5195 线段树
官方题解:因为我们要求最后的拓扑序列字典序最大,所以一定要贪心地将标号越大的点越早入队。我们定义点i的入度为di。假设当前还能删去k条边,那么我们一定会把当前还没入队的di≤k的最大的i找出来,把它的di条入边都删掉,然后加入拓扑序列。可以证明,这一定是最优的。具体实现可以用线段树维护每个位置的di,在线段树上二分可以找到当前还没入队的di≤k的最大的i。于是时间复杂度就是O((n+m)lo原创 2015-03-29 12:01:24 · 1009 阅读 · 0 评论 -
HDU 2612 水BFS
两个人(Y和M)要在‘@’处相遇,图中有不定个‘@’;对每个人做一遍BFS即可,然后枚举每个‘@’位置#include "stdio.h"#include "string.h"#include "queue"using namespace std;const int inf=0x7fffffff;const int dir[4][2]={{1,0},{-1,0},{0,1原创 2015-03-09 20:06:21 · 570 阅读 · 0 评论 -
HDU 4553 线段树双关键字区间合并
用两个关键字记录,分别为屌丝时间和女神时间若屌丝约,更新屌丝时间若女神约,更新屌丝和女神时间学习,则两个全部清空#include "stdio.h"#include "string.h"struct Data{ int l,r,x1,x2,l1,l2,r1,r2;}data[400010];int Max(int a,int b){ if原创 2015-03-08 16:24:22 · 630 阅读 · 0 评论 -
HDU 1823 二维线段树
二维线段树入门题分别以身高和活泼度开两维以身高-100,活泼度*10,为两个区间所谓的二维就是在第一维查找到正确位置时,进入第二维再查找#include "stdio.h"#include "string.h"double ans;double Max(double a,double b){ if (a<b) return b;else return a;原创 2015-03-08 19:32:26 · 726 阅读 · 0 评论 -
HDU 1540 POJ 2892 线段树区间合并
给出N个点,M次操作,N个点开始在一条线上链式相连D操作 把某点删除掉 Q操作 询问某点一共可以连接多少个点R操作 把上一次删除的点还原线段树处理区间合并分别记录每个区间的左端连续最长和右端连续最长#include "stdio.h"#include "string.h"struct node{ int l,r,lx,rx,x;}data[2原创 2015-03-04 17:51:05 · 610 阅读 · 0 评论 -
HDU 3974 线段树(将树映射到区间)
第一次写将树映射到区间的线段树。。。线段树部分很简单主要是将原有的关系树根据BOSS关系从新编号以便把每个BOSS所带领的员工全部压入一个连续区间内然后记录每个BOSS的起始编号和他的最后一名的员工的编号然后用线段树成端更新,单点查找即可#include "stdio.h"#include "string.h"struct node{ int l,原创 2015-03-04 20:31:25 · 634 阅读 · 0 评论 -
HDU 3564 线段树+DP
给出1~n的插入顺序,要求每次插入之后的LIS对于样例: 0:1插入到当前第0个位置后 10:2插入到当前第0个位置后 2 12:3插入到当前第2个位置后 2 1 3线段树处理空格填数问题,然后做LIS难点主要是如何处理LIS,因为每次填入的数字都是递增的,所以1——>n循环下去一定是递增的。mark记录每个数字的位置,因为数值递增,所以在保证LI原创 2015-03-25 17:02:35 · 600 阅读 · 0 评论 -
POJ 2750 线段树+DP
给定一个环形序列,进行在线操作,每次修改一个元素,输出环上的最大连续子列的和。原创 2014-07-23 16:20:55 · 565 阅读 · 0 评论 -
POJ 3277线段树 离线+离散
题意:给定每个矩形的高度以及底边在数轴上的起点和终点。各矩形间可能有重叠。问它们覆盖的总面积是多少。原创 2014-07-22 09:33:12 · 546 阅读 · 0 评论 -
POJ 2528 线段树+离散化 入门题
线段树离散化的入门题,线段树部分的操作很简单第一次用离散化。。。其实就是对数据的压缩#include "stdio.h"#include "iostream"#include "algorithm"using namespace std;struct comp{ int x,num;} line[20001]; // 离散化的辅助数组struct comp1原创 2013-09-04 20:18:37 · 767 阅读 · 0 评论 -
POJ 1151 线段树 扫描线 模板题
第一道扫描线求相交矩阵面积的题 建树的方法和原来的线段树不太一样#include "stdio.h"#include "string.h"#include "stdlib.h"#include "math.h"#include "iostream"#include "algorithm"using namespace std;struct com原创 2013-10-02 14:31:15 · 905 阅读 · 0 评论 -
POJ 1823 线段树
做过POJ 3667 后 这题就小儿科了......一个更新函数直接搞定 #include "stdio.h"#include "string.h"#include "math.h"#include "stdlib.h"struct comp{ int l,r,mid; int sum,ls,rs,lazy;} data[100001];i原创 2013-10-01 17:02:25 · 621 阅读 · 0 评论 -
POJ 3225 区间操作 交并补
U:把区间[l,r]覆盖成1I:把[-∞,l)(r,∞]覆盖成0D:把区间[l,r]覆盖成0C:把[-∞,l)(r,∞]覆盖成0 , 且[l,r]区间0/1互换S:[l,r]区间0/1互换 cover记录成段覆盖,xo记录互换当一个节点得到覆盖标记时把异或标记清空当一个节点得到异或标记的时候,先判断覆盖标记,如果是0或1,直接改变一下覆盖标记,不然的话改变异或标记原创 2013-09-16 20:07:02 · 893 阅读 · 0 评论 -
POJ 2823 线段树 暴力之...
#include "stdio.h"#include "string.h"#include "math.h"#include "stdlib.h"int ans1[1000010],ans2[1000010];struct comp{ int l,r,mid; int max,min;} data[3000010];int max,min;int原创 2013-10-01 15:44:56 · 798 阅读 · 0 评论 -
POJ 2777 线段树 线段染色 基础题
#include "stdio.h"#include "string.h"#include "math.h"#include "stdlib.h"#include "algorithm"using namespace std;struct comp{ int l,r,mid; int lazy,color;} data[300001];int hash[50];int原创 2013-10-01 14:22:25 · 687 阅读 · 0 评论