随笔 - 386
文章 - 0
评论 - 21
阅读 -
21万
随笔分类 - 数据结构————Segment Tree
1
POJ 3468 A Simple Problem with Integers(线段树)
摘要:题目链接题意 : 给你n个数,进行两种操作,第一种是将a到b上所有元素都加上c,第二种是查询a到b上所有元素之和输出。思路 : 线段树,以前写过博客,但是现在在重刷,风格改变,,所以重新写一篇。。。。 1 #include 2 #include 3 #include 4 #define LL ...
阅读全文
HDU 4027 Can you answer these queries?(线段树的单点更新+区间查询)
摘要:题目链接题意 : 给你N个数,进行M次操作,0操作是将区间内的每一个数变成自己的平方根(整数),1操作是求区间和。思路 :单点更新,区间查询,就是要注意在更新的时候要优化,要不然会超时,因为所有的数开几次方之后都会变成1,所以到了1不用没完没了的更新。 1 //HDU 4027 2 #include...
阅读全文
ZOJ 1610 Count the Colors (线段树区间更新)
摘要:题目链接题意 : 一根木棍,长8000,然后分别在不同的区间涂上不同的颜色,问你最后能够看到多少颜色,然后每个颜色有多少段,颜色大小从头到尾输出。思路 :线段树区间更新一下,然后标记一下,最后从头输出。//ZOJ 1610#include #include #include using namesp...
阅读全文
2014多校第四场1006 || HDU 4902 Nice boat (线段树 区间更新)
摘要:题目链接题意 : 给你n个初值,然后进行两种操作,第一种操作是将(L,R)这一区间上所有的数变成x,第二种操作是将(L,R)这一区间上所有大于x的数a[i]变成gcd(x,a[i])。输出最后n个数。思路 : 暴力线段树,将区间进行更新,可以用延迟标记,也可以不用。p数组代表当前节点这一段上的值是不...
阅读全文
HDU 1698 Just a Hook (线段树区间更新)
摘要:题目链接题意 : 一个有n段长的金属棍,开始都涂上铜,分段涂成别的,金的值是3,银的值是2,铜的值是1,然后问你最后这n段总共的值是多少。思路 : 线段树的区间更新。可以理解为线段树成段更新的模板题。 1 //HDU 1698 2 #include 3 #include 4 #include ...
阅读全文
POJ 2029 Get Many Persimmon Trees(DP||二维树状数组)
摘要:题目链接题意 : 给你每个柿子树的位置,给你已知长宽的矩形,让这个矩形包含最多的柿子树。输出数目思路 :数据不是很大,暴力一下就行,也可以用二维树状数组来做。 1 //2029 2 #include 3 #include 4 #include 5 6 using namespace std ...
阅读全文
POJ 3368 Frequent values(RMQ)
摘要:点我看题目题意 : 给你一个非递减数列,然后给你一个范围x到y,让你找出从x位置到y位置上,某个数字出现次数最多的那个数字的次数。。。。。思路 :其实我一开始没觉得用RMQ简单,而且我也没想到怎么用RMQ。。。。。听会神讲了才会了。就是找一个数组保存从前边到这个数为止这个数出现的次数,然后再用RMQ,最后判断的时候要把这个范围一上来的那个数字先给去掉,因为你不知道他前边还有没有,所以容易多算上,最后再判断这区间跟后边那些谁多就OK了。#include #include #include #include const int maxn = 101000 ;int a[maxn],data[max
阅读全文
POJ 3264 Balanced Lineup(RMQ)
摘要:点我看题目题意 :N头奶牛,Q次询问,然后给你每一头奶牛的身高,每一次询问都给你两个数,x y,代表着从x位置上的奶牛到y位置上的奶牛身高最高的和最矮的相差多少。思路 : 刚好符合RMQ的那个求区间最大最小值,所以用RMQ还是很方便的。就是一个RMQ的模板题,基本上书上网上都有。RMQ基础知识RMQ...
阅读全文
POJ 1195 Mobile phones(二维树状数组)
摘要:点我看题目题意 : 4条命令,0代表开始,在整组样例里肯定只有第一条是0,0后边的数字代表的矩阵的大小为n*n,1 x y z代表着将z加到(x,y)这个格子上去,2 l b r t代表着,让你求出从(l,b)到(b,r)所包含的矩形中包含的移动电话的数量。思路 :当时看书的时候我就看到二维数组了,一看这个题我就想到了用二维,二维其实和一维差不多,这个就是个模板题。不过依然要注意的是树状数组是从1开始的,所以输入之后要+1以防从0开始。#include #include #include using namespace std;const int maxn = 4123 ;int tree[1
阅读全文
POJ 2892 Tunnel Warfare || HDU 1540(树状数组+二分 || 线段树的单点更新+区间查询)
摘要:点我看题目题意 :N个村子连成一条线,相邻的村子都有直接的地道进行相连,不相连的都由地道间接相连,三个命令,D x,表示x村庄被摧毁,R ,表示最后被摧毁的村庄已经重建了,Q x表示,与x直接或间接相连的村庄有多少个,当然包括他自己。思路 :这是一道用线段树,树状数组,还有STL都可以做的题。。。。...
阅读全文
POJ 2750 Potted Flower(线段树的区间合并)
摘要:点我看题目链接题意 : 很多花盆组成的圆圈,每个花盆都有一个值,给你两个数a,b代表a位置原来的数换成b,然后让你从圈里找出连续的各花盆之和,要求最大的。思路 :这个题比较那啥,差不多可以用DP的思想来解决这个问题,你在某个地方将这个环断开,因为线段树无法建成环形的。然后再去找那个最大值。将这个序列分成两部分,先求左边的最大连续和a,再求右边连续和b,但是由于他们中间相连的那部分,就是左部分的最右边的连续最大和x加上右部分的最左边的连续最大和y加起来可能比ab都大,但分开的话可能并没有a或b大。所以要进行区间合并,将y并到左边去,或者将x并到右边去,但本身那个边界不变#include #inc
阅读全文
POJ 2886 Who Gets the Most Candies?(反素数+线段树)
摘要:点我看题目题意 :n个小盆友从1到n编号按顺时针编号,然后从第k个开始出圈,他出去之后如果他手里的牌是x,如果x是正数,那下一个出圈的左手第x个,如果x是负数,那出圈的是右手第-x个,游戏中第p个离开的孩子得到的糖果是f(p)个,f(p)是p的约数的个数。思路 : 因为f(p)是p的约数的个数,所以,要用到反素数,反素数的定义及求法。反素数s的约数个数比小于它的数的约数个数都多,最大反素数就是要找到的那个得到糖果最多的人。线段树记录的是还剩多少 人未出列。#include #include #include using namespace std;const int maxn = 506000
阅读全文
HDU 1394 Minimum Inversion Number(线段树的单点更新)
摘要:点我看题目题意 :给你一个数列,a1,a2,a3,a4.......an,然后可以求出逆序数,再把a1放到an后,可以得到一个新的逆序数,再把a2放到a1后边,,,,,,,依次下去,输出最小的那个逆序数。思路 :用线段树就是查找比当前这个数大的已存入线段树中的个数。比如求a[i],那么就查找当前线段树(a[i]+1,n)中的个数。。然后把a[i]更新到线段树中。。求逆序数的时候法,当把x放入数组的后面,此时的逆序数应该为x没放入最后面之前的逆序总数加上(n-x)再减去(x-1);sum = sum+(n-x[i])-(x[i]-1)。这个破题让我很晕的地方,一开始我没注意的是,输入的数据大小是
阅读全文
POJ 2528 Mayor's posters(线段树)
摘要:点我看题目题意 :建一堵墙粘贴海报,每个候选人只能贴一张海报,海报的高度与墙一样高,一张海报的宽度是整数个单位,墙被划分为若干个部分,每个部分的宽度为一个单位,每张海报完全的覆盖一段连续的墙体,墙体的宽度占整数个单位。因为候选人将海报贴到墙上的时候可能会将别人的覆盖或覆盖一部分,给出海报的大小,选举墙上张贴的位置,和张贴的次序,然后问你最后还能看到几张海报。思路 : 这个墙因为有10000000单位长,而n最大有10000,所以要先进行离散化,但是离散化之前要先将数字存起来,排序之后再将每相邻的两个数之间一个数加入离散的数组,离散化的处理 :先将n张海报的左边界,右边界中间位置存储在数组x里,
阅读全文
POJ 3321 Apple Tree(树状数组)
摘要:点我看题目题意 : 大概是说一颗树有n个分岔,然后给你n-1对关系,标明分岔u和分岔v是有边连着的,然后给你两个指令,让你在Q出现的时候按照要求输出。思路 :典型的树状数组。但是因为没有弄好数组,所以要用DFS先映射一下,好吧我承认我说不下去了,六级没过,CF又掉了100多分,脑子完全不转转了。。。。。。#include #include #include using namespace std;const int maxn = 500004 ;int head[maxn],start[maxn] ,num[maxn],data[maxn];int m,n,cnt ,cntt;bool vis
阅读全文
POJ 3468 A Simple Problem with Integers(线段树)
摘要:点我看题目题意 :N个数Q条命令,Q a b代表输入Aa,Aa+1, ... ,Ab的和。Cabc代表让你把c加给Aa,Aa+1, ... ,Ab的每一个数。思路 :这个题分类好像不是线段树。。不过我硬是按线段树的方法做了,总觉得和HDU1166和1754差不多,反正要注意数据范围很大不能用int,我还因为用了intWA了一次。反正比平时那些模板的更新啊加减什么的都比较麻烦。#include #include #include using namespace std;const int maxn = 5000004 ;typedef long long LL;struct node{ ...
阅读全文
HDU 1754 I Hate It(线段树)
摘要:点我看题目题意 :又是一道中问题,我就不说题意了。。。。思路 : 线段树,这道题跟1166差不多,改一些地方就差不多了。#include #include #include #include using namespace std;const int maxn = 500005 ;int a[maxn] ;int ans ;struct node{ int l,r,value ;} Node[4*maxn] ;void build(int v ,int l,int r){ Node[v].l = l ; Node[v].r = r ; Node[v].value = 0...
阅读全文
HDU 1166 敌兵布阵(线段树 单点更新)
摘要:点我看题目题意 :HDU的中文题也不常见。。。。这道题我就不详述了。。。。。思路 :这个题用线段树用树状数组都可以,用线段树的时候要注意输入那个地方,输入一个字符串的时候不要紧接着输入两个数字,因为我就是这样贡献了好几个RE。。。。不要用cin,cout,因为也是这样我又贡献了好几个TLE。。。。血...
阅读全文
POJ 2828 Buy Tickets(线段树)
摘要:点我看题目题意 :说实话,看题的时候根本没怎么看懂,每个单词我倒是认识,但是拼一块儿我觉得就有点拗口了,一开始我以为的站右边是以为队伍如果画出来应该是上下的,谁知看了底下的那个样例解释才知道原来队伍时左右的,,,难怪说插到右边呢。。。。大概题意就是,队列中的每个人都被赋一个特定的值,给出所有插队的人及他们插队后他们所站的位置信息,然后输出队列中的人的最终的排列顺序。思路 :首先处理数据,不要从前往后处理,从后往前处理,因为后边的人是会影响前边的人的位置的。用线段树的每个结点记录这个区间中的空位置数,每次插入的时候将这个人放在第pos[i]个空格的地方,因为后边的人如果排在前面人的前面,那么我们
阅读全文
POJ 2352 Stars(树状数组)
摘要:点我看题目题意 : 给你若干个星星,然后给出你每个星星的坐标(按照y递增的顺序给出,若是y相同就按照x递增的顺序给出),定义所谓的星星级别为横纵坐标不超过自己的星星的个数。问级别0到n-1的星星各有多少个。思路 :因为当前的星星与后面的星星没有关系,所以只要把x之前的横坐标加起来就行,树状数组模板题,但是树状数组下标是从1开始的,所以x要加1。#include #include #include using namespace std;const int maxn = 100000 ;int tree[maxn+10] ;//树状数组inline int lowbit(int x)//lowb
阅读全文
1