随笔分类 - 线段树&&树状数组
树状数组的问题处理
摘要:树状数组能够很容易求出前缀和 1.对于区间更新问题 我们要借用辅助函数来帮助自己 自定义一个函数add[i] , 表示将i~n的数都加了add[i]的值 那么将[s,t]区间都增加v,就很容易理解为add[s]+=v , add[t+1]-=v了 查询区间[s,t]的总和的时候就可以理解为: ans
阅读全文
UVA 11297 线段树套线段树(二维线段树)
摘要:题目大意: 就是在二维的空间内进行单个的修改,或者进行整块矩形区域的最大最小值查询 二维线段树树,要注意的是第一维上不是叶子形成的第二维线段树和叶子形成的第二维线段树要 不同的处理方式,非叶子形成的线段树总是在自身的叶子处不能直接更新数据,而是要以一维下他的左右孩子对应的位置数据进行更新。
阅读全文
Codeforce385C 树状数组+素因子分解
摘要:题目大意:给多个区间的询问,在询问区间内每一个出现的素数去计算所有数中有多少个数能被这个素数整除然后将所有素数得到的对应值求和这里因为初始给定的数不超过10000000,最多670000不到的素数而后面给定的区间到达1e9是没意义的,只要后面超过10000000都按最后一个数表示即可然后将素数的标号...
阅读全文
HDU 3333 树状数组离线查询
摘要:题目大意:询问区间内不同种类的数的数值之和这里逐个添加最后在线查询,会因为相同的数在区间内导致冲突我们总是希望之后添加的数不会影响前面,那么我们就在添加到第i个数的时候,把所有在1~i 的区间的询问全部处理完成即可对于之前的冲突,我们可以不断记录上一次冲突的位置,给当前的前缀和添加一个当前的val对...
阅读全文
HDU 5381 The sum of gcd
摘要:题目大意:f(l,r)=∑ri=l∑rj=igcd(ai,ai+1....aj)求解多个区间 l , r 对应的f(l,r)值这里首先要知道一个数的因子个数不超过log2(n)个,所以作为一个int整数来说,对应求得的最多只有31种gcd值那么线段树上就可以维护这样的31种gcd值,并记录他们对应的...
阅读全文
SPOJ GSS1 静态区间求解最大子段和
摘要:题目大意:给定n个数,再给q个区间询问,希望在区间s,t中找到一段连续的子序列使其和最大因为询问上万,节点数50000,明显是用线段树去做,这里很明显的区间更新,唯一写起来有点恶心的是询问每一个区间的最大都要跟左右区间的左最大右最大有关系反正时要注意细节了,查询的时候同时要查询其左右连续最大自己的错...
阅读全文
HDU 3973 线段树+字符串hash
摘要:题目大意:不断修改字符串中的字母,然后询问区间字符串是否处于已给定的字符串集合中这里将原来的字符串集合保存到hash表中,当然用map,set都没有问题修改查询都用线段树实现,自己的query函数写的有问题,按照网上的改了就没问题写一下自己的理解,因为左右子树合并的时候,需要计算右子树生成的字符串的...
阅读全文
CSUOJ 1542 线段树解决括号反向问题
摘要:题目大意:根据初始给定的合法的小括号排序,每次进行一个操作,将第a位的括号反向,找到一个尽可能靠前的括号反向后是整个括号排列合法数据量十分大,不断进行查询,要用线段树进行logn的复杂度的查询首先最简单的考虑 '('->')' , 稍微想一下可以知道因为要尽可能靠前,所以其实把最前面的那个 )改成 ...
阅读全文
线段树练习题(不断更新中)
摘要:通过参考大神们线段树的文章,准备开始要一个一个把上面的题目做一遍了,有很多都是原来做过的,现在也再次做一遍方便以后查阅打过 * 的表示对别人的想法有所参考,留待以后再做一次现在比起一开始接触线段树已经更为容易理解了,想到自己暑期集训的时候还是傻傻的背着线段树的格式在做题,不肯动脑子去思考代码含义,觉...
阅读全文
HDU 1542 Atlantics 线段树+离散化扫描
摘要:将 x 轴上的点进行离散化,扫描线沿着 y 轴向上扫描每次添加一条边不断找到当前状态有效边的长度 , 根据这个长度和下一条边形成的高度差得到一块合法的矩形的面积 1 #include 2 #include 3 #include 4 #include 5 6 using namespace std;...
阅读全文
HDU 1540 区间合并线段树
摘要:题目大意:就是给定一堆位置,进行删除还原,最后找到 t 位置上的最大连续位置 1 #include 2 #include 3 #include 4 5 using namespace std; 6 const int N = 50005; 7 8 struct Node{ ...
阅读全文
CSU 1258 异或运算的线段树
摘要:题目大意:在给定区间内对每个数的最后一个二进制为1的位将其修改为0,如果数本身已经为0了,就不做改变输出给定区间的所有数的异或值 1 #include 2 #include 3 using namespace std; 4 #define N 10005 5 #define L ls,x,mid...
阅读全文
POJ2777
摘要:题目大意:在一段长度为n的黑板上按区间涂色,询问某段区间内不同颜色的数量这里颜色涂改我们很难区分,但因为这里至多只有30种颜色,所以我们可以利用2进制数来代表颜色的个数 1 #include 2 #include 3 #include 4 #include 5 using namespace...
阅读全文
用堆操作不断加入点来找到每个点对应所包含的值的个数的理解
摘要:首先还是要清楚一下堆操作的代码,毕竟线段树打多了,打堆的时候总会往线段树方向靠近首先是建堆:D=1;for(;D>=1,j>>=1){ if(~i&1) ans+=sum[i^1]; if(j&1) ans+=sum[j^1]; } return ans;}更新操作:void update(int ...
阅读全文
SPOJ DCEPC11I
摘要:题目大意:就是给定一段区间令其中的数增加一个递增序列(也就是说第一个+1,第二个+2.。。。。)询问操作是区间的和这里的查询很简单,但是对于添加递增序列入区间就比较搞脑子了我们需要一个add[]作为区间的首个数字增加的值,del[]表示等差数列的公差,因为你每次添加进入一个等差数列,是可以叠加的但公...
阅读全文
POJ 2828
摘要:题目大意:不断将放进来的数字插入要求位置,最后将他们的值按在其所在顺序排序简单的线段树问题,单点查询,从反向点一个个插入,线段树表示区间内还有多少空位,像找第几小的数那样自顶向下递归知道x==y代码: 1 #include 2 #include 3 #include 4 using names...
阅读全文
HDU 3397 双lazy标记的问题
摘要:题目大意对一个只有0和1的序列,支持以下几种操作1.将区间所有的值变成12.将区间所有的值变为03.将区间的0和1翻转(0变成1 1变成0)4.求区间中1的个数5.求区间连续最长的1的个数http://vjudge.net/problem/viewProblem.action?id=14689整整一...
阅读全文
HDU 3911 区间合并求最大长度的问题
摘要:http://vjudge.net/problem/viewProblem.action?id=21557题目大意:每进行一次颜色改变都可以把一段区间内的黑石头变成白石头,白石头变成黑石头,最后问区间内黑石头连续的最大长度这里我们可以用rev[]作为lazy标记,每次进行改变,rev[]^1因为有黑...
阅读全文
CodeForces 444C 节点更新求变化值的和
摘要:http://vjudge.net/problem/viewProblem.action?id=51622题目大意:给定一列n个数字,最初赋予值1到n两个操作:1.将区间[l,r]内的数改为x,则这区间中所有数的改变值进行求和,即ans=abs(a[l]-x)+abs[a[l+1]-x).....a...
阅读全文
POJ 3667 线段树的区间合并简单问题
摘要:题目大意:有一排标号1-N的房间。操作一:询问是不是有连续长度为a的空房间,有的话住进最左边(占用a个房间)操作二:将[a,a+b-1]的房间清空(腾出b个房间)思路:记录每个区间中“靠左”“靠右”“中间”的空房间线段树操作:update:区间替换query:询问满足条件的最左端点题目链接:http...
阅读全文
浙公网安备 33010602011771号