线段树
Phoenix丶HN
这个作者很懒,什么都没留下…
展开
-
线段树变形(玲珑学院1129)
题目链接区间更新和查询,无非就是换了种思想。可以二分来查一个区间的左区间和有区间是否有大于x的数,然后nlogn完美解决问题!坑了我一晚上,居然是一个sum的初始化,没初始化完的锅!!!#include#include#include#include#include#include#include#include#include#include#includ原创 2017-05-30 20:40:50 · 443 阅读 · 0 评论 -
当我真正搞懂主席树!!!
题目链接Problem I: qwb VS 去污棒Time Limit: 2 Sec Memory Limit: 256 MBSubmit: 64 Solved: 20[Submit][Status][Web Board]Descriptionqwb表白学姐失败后,郁郁寡欢,整天坐在太阳底下赏月。在外人看来,他每天自言自语,其实他在和自己的影子“去污棒”原创 2017-06-02 19:43:32 · 464 阅读 · 0 评论 -
“玲珑杯”ACM比赛 Round #19 B(RMQ大法好啊,比线段树快得多!!!!)
#includeusing namespace std;typedef long long ll;int a[200010];int maxl[200010*2][30];int minl[200010*2][30];int n,kk;void S_table(){ int l = int(log((double)n)/log(2.0)); for (int j=1原创 2017-07-29 17:03:13 · 571 阅读 · 0 评论 -
HDU5861(线段树好题)
题解:找到每一段路最开始的时间和结束的时间,然后一起统计。区间最值问题,首选线段树。可以先对m条边倒着更新一遍线段树,便可以知道没一个点最开始的时候在哪一条线段上。然后再正着跟新一遍,就知道每个点最终结束在哪一条线段。然后合并统计#includeusing namespace std;int node[200010*4];vectorin[200010],out[200010];voi原创 2017-07-21 21:32:33 · 348 阅读 · 0 评论 -
HDU5862(树状数组好题)
题意:给一些平行坐标轴的线段,。统计相交数题解:可以这样考虑,把所有与x轴平行的线段存起来,用来枚举。把与y轴平行的线段的左右端点存起来。这样在枚举x线段时。就需要看x线段的左端点左边有多少,右端点有多少,相减就是中间重合的。如何维护这些数据呢?当然就得用树状数组了。,简单粗暴#include#include#include#include#include#include#incl原创 2017-07-21 21:37:01 · 388 阅读 · 0 评论 -
HDU5828(线段树好题,区间加,区间求根号,吉老师在51nod直播讲过这道题,相应的还有区间取模)
题解:区间加,区间和不用说。重点在区间取模,首先,就算一个很大的n,几次根号之后就会很小。我们可以思考一下,如果一个区间内的极差>1的时候,不断地进行整体加某个值然后开方,是没办法保持住这样的序列的(相邻两个极差都>1)。只有整个区间内的极差#include#include#include#include#include#include#include#include#in原创 2017-07-22 22:21:29 · 1090 阅读 · 0 评论 -
zoj3886(线段树,区间取模)
因为一个数最多只需要log(n)次就会变成1,而模数大于他本身,他又不会变化,最次每次o(n)修改区间,最多也不会多过log(n)次,所以复杂度是正确的。暴力修改就好#include#include#include#include#include#include#include#include#include#include#include#define nl n<<1#d原创 2017-07-23 16:56:39 · 582 阅读 · 0 评论 -
树状数组好题(codeforces828E)
题意:给你一个只包含四字母的字符串,用另一个字符串去匹配该字符串的一个区间,第二个字符串只是一个循环节,知道把区间全部匹配一次,计算相同的字母数。经典的单点更新和区间求和的问题(有没有感觉?)题解:因为只包含四种字母,第一感觉就想分块搞。但是又和前缀和没什么关系,因为得比较每一位。但是第二个字符串又只有10,相当于什么呢?把整个数列分成10块的,更新的时候就只需要看属于那一块,然后往后更新答案原创 2017-07-19 19:22:21 · 398 阅读 · 0 评论 -
HDU5775(树状数组)
分析:由冒泡算法可知,一个数是先往右移,再往左移。所有从后往前扫,看每一个数右边有几个比他大的数,那么就知道要往右边移动几次,左边的话,就看现在的位置和他本身的大小,谁小就在哪#include#include#include#include#include#include#include#include#include#include#include#include#def原创 2017-07-24 19:50:05 · 293 阅读 · 0 评论 -
主席树模板(区间第k大!)hdu2665
http://www.cnblogs.com/zyf0163/p/4749042.html#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;typedef long long ll;co原创 2017-06-02 18:33:43 · 279 阅读 · 0 评论 -
poj3468 树状数组的区间快速更新和查询
直接用树状数组会超时;所以必须快速更新。/*分析:由于本题更新的时候是区间更新 所以不能直接去一个个更新区间内的点,肯定会超时 对于每次更新C(a,b,d)表示区间[a,b]内的值增加d 用ans[a]表示a~n区间元素增加的值,所以对于C(a,b,d)有:ans[a]+=d,ans[b+1]-=d; 则每次询问的时候Q(a,b),求a~b的和SUM=sum(a,b)+转载 2016-04-25 23:54:03 · 353 阅读 · 0 评论 -
线段树区间更新+区间合并
题目链接一看就是线段树区间合并的题。俩操作,一个跟新,一个查询#include#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;typedef long long ll;const原创 2017-05-22 10:52:46 · 307 阅读 · 0 评论 -
二次手撕线段树区间更新
题目链接题意:这个题说白了就是一个线段树区间跟新的问题,只不过是刻意加大了难度。操作一:从x-n每个点加k+td(t=0,1,2……);操作二,输出某个点的值,并清0题解:明显的线段树区间更新。每个点都加k这个简单。只不过延迟更新需要更新区间内的点加了多少次,就有点困难了,但是查询的时候只查一个点。所以可以一直把设计每个点的做区间记录下来,然后在查询的时候一起算node[n]=(n原创 2017-05-19 16:05:08 · 271 阅读 · 0 评论 -
poj1769(线段树+dp)
点击打开链接题意:用最少的线段,把1-n填满!思路:dp【i】【j】表示到第i个线段,最大能覆盖到j所需要的最少的线段!dp[0][1]=0(因为,一个线段都不选,就是到一开始的1,数量自然也是0);dp[0][j]=INF(j>1)(一开始设为最大,慢慢找最小的);dp[i+1][j]=dp[i][j](t!=j)(这条线段没到底,不能选,因为选了就到t的位置了)原创 2017-04-01 21:36:40 · 523 阅读 · 0 评论 -
线段树+三个map保存状态(打表)。
GCDTime Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 1240 Accepted Submission(s): 382Problem DescriptionGive you a sequence of N(N原创 2016-07-20 17:17:05 · 593 阅读 · 0 评论 -
利用结构体让线段树有一个区间值的方法更新区间
#include #include #include using namespace std;const int maxn = 100000+10;int n,sum;struct node{ int l,r,n;} a[maxnvoid init(int l,int r,int i){ a[i].l = l;原创 2016-07-12 11:54:44 · 641 阅读 · 0 评论 -
线段树 区间跟新,查询!
#include #include #include#include #include#include#define maxx 200010using namespace std;int grade[maxx];int node[maxx*4];int query(int p,int q,int l,int r,int n){ if(l>=p&&r<=q)原创 2016-07-12 10:12:46 · 309 阅读 · 0 评论 -
线段树+L3-002. 堆栈
大家都知道“堆栈”是一种“先进后出”的线性结构,基本操作有“入栈”(将新元素插入栈顶)和“出栈”(将栈顶元素的值返回并从堆栈中将其删除)。现请你实现一种特殊的堆栈,它多了一种操作叫“查中值”,即返回堆栈中所有元素的中值。对于N个元素,若N是偶数,则中值定义为第N/2个最小元;若N是奇数,则中值定义为第(N+1)/2个最小元。输入格式: 输入第一行给出正整数N(5)。随后N行,每行给出一原创 2016-07-11 12:00:27 · 819 阅读 · 0 评论 -
poj3264 树状数组找最大值问题
#include #include#define MAXN 50100#define MAXT 1000010#define max(a,b) a>b?a:b#define min(a,b) a>b?b:ausing namespace std;int a[MAXN],tl[MAXT],tr[MAXT],tmax[MAXT],tmin[MAXT];void原创 2016-04-25 23:51:04 · 269 阅读 · 0 评论 -
HDU5792(树状数组)
PS:思维还是太弱了,计算方法太神奇!题意:就是找四个不同的数,ad.算种数分析:简化一下问题,如果单纯求ad,树状数组求逆序对即可。但是这里a,b,c,d不能相同。那么就考虑一下怎么去重。枚举一个数,他左边比他小的数就可以当做a,相当于他是b。他左边比他大的数就是c,相当于他是d。同理,看右边是一样的。那样把左边所有小于当前数的数求和,大于的一样。乘积是什么。就是算可以重复的总种数。这时原创 2017-07-27 10:37:26 · 215 阅读 · 0 评论