线段树&&树状数组
文章平均质量分 80
NightRaven
cust
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
POJ3468 线段树||伸展树
线段树的模板题,先给一列数,然后给一些操作,Q操作查询[l,r]区间和,C操作把区间[l,r]全部加上C。最近在学伸展树,就重新把这题做了一下。用伸展树的话,以区间中间点为下表,区间和为键值建树,左孩子记左区间,右孩子记右区间。同时为了处理方便,引入编号为0和n+1的节点。每次操作时,把节点l-1伸展到根,把r+1伸展到根节点的右孩子,这样要处理的区间就被包含在根节点和他右孩子之间了,Q操作就直接原创 2013-09-20 13:23:19 · 827 阅读 · 0 评论 -
CF446C DZY Loves Fibonacci Numbers 线段树
给一个序列,接下来有ruogan原创 2014-08-10 14:36:19 · 843 阅读 · 0 评论 -
codeforces round DIV2
P1:Mashmokh and Lights原创 2014-04-07 13:59:25 · 773 阅读 · 0 评论 -
zoj3635-Cinema in Akiba 树状数组+二分
n个人去看电影,正好有n个座位,每个人手中的票上的号码为a[i],表示他进场的时候,需要做到当前从1---n中第a[i]个空位,给出m个查询,分别求出查询的人实际的座位位置。 用树状数组记录一下每个位置当前是否有人,那么对于一个位置i,就可以求出1---i当中有多少个空位,而i位置也就是当前第i-sum(i)个空位了,由于这个i-sum(i)是单调不减的,所以可以二分位置来求出当前的人原创 2014-03-20 19:01:40 · 748 阅读 · 0 评论 -
zoj-3633 Alice's present 离线线段树
给一列数,每次查询一个区间,求出这个区间中,从右到左第一个出现两次的数。 首先预处理一下每个数左边离他最近的相同的数的位置,读完数据后,按查询的右区间递增排 个序,然后一个一个添加。添加到a[i]时,若l[i]不为0,那么对于右区间为i,左区间为1...l[i]的查询,答案就是i,这里可以用线段树成段赋值处理,要注意的一点是,每次记录一下上一次添加时的l[i]为last,如果本次原创 2014-03-20 03:38:15 · 786 阅读 · 1 评论 -
codeforces 400e 线段树
N个数组成a[1][]这个序列,定义a[i+1][j]=a[i][j]&a[i][j+1],根据此公式可以推出一个数字三角形,现有m个操作,每次操作x,y把a[1][x]的数修改成y,并且输出修改后新的数字三角形中所有数的和。 首先要确定一点,连续k个1相连,构成的三角形中数字和(权值)是sum(1..k),那么对于原题中的三角形,我们可以按位拆分出最多17三角形(因为最大的数10W原创 2014-03-09 02:34:43 · 900 阅读 · 0 评论 -
codeforces 396C On Changing Tree dfs序+BIT
一棵树,根节点为1,现有两种操作 1 v x k :对节点v的值+x,对节点v的后继中,距离为i的节点的值+x-i*k。 2 v :输出节点v现在的值。 对子树进行操作的话,容易想到树状数组或者线段树,先对树做一遍dfs标上时间戳,这样节点v的子树的时间戳就是l[v]--r[v]这个区间,那么对子树的加减就可以转化成区间的加减。再来看操作,操作一v的操作可以看成+x-0*k,或者说是x+de原创 2014-03-01 22:13:02 · 1121 阅读 · 0 评论 -
poj2763 Housewife Wind 在线LCA+BIT
给一棵N个节点的边上带权树,给一个起点,接下来有M个操作,0 i:从当前位置走到i点,并且输出路径和;1 i w:把第i条边的权值变成w。整体上思路还是dis[x]+dis[y]-2*dis[lca(x,y)],但是更新时如果一条一条的去更新,显然会超时..这里可以结合dfs序和树状数组来实现更新和查询。首先dfs的时候给各个节点重新编号打上时间戳,这样每个节点的子树都会是一个连续的区间,那么某条原创 2014-02-08 16:23:23 · 792 阅读 · 0 评论 -
Codeforces 383C Propagating tree DFS序+BIT
一颗以1为根节点的树,两种操作,1 x c 将节点x值+c,节点x的所有孩子的值-c,所有孩子的孩子的节点+c...交替正负直到叶子节点;2 x 查询节点x当前的值。挺简单的一题..当时怎么就没去看...这题只要能想到时间戳的话,就简单了..首先dfs遍历树打上时间戳,这样每个节点保存一个区间l,r表示访问到该节点到遍历完其子树的区间.每个节点按其到根节点的距离的奇偶性分类,ct[i]=0,1表示原创 2014-01-21 19:10:53 · 795 阅读 · 1 评论 -
codeforces 258-E. Little Elephant and Tree 线段树,离线
给一个节点数为n的树,m个操作,每个操作包涵两个数a,b,第i次操作时,向节点a及其子树,节点b及其子树的数据序列中添加i。m次操作完成后,对于每个节点,查询这棵树上有多少个节点与当前节点至少包涵一个相同数。 首先对子树操作的话,先对树做dfs并编号,这样某节点的子树节点的编号一定是一个连续的区间,并记录一下每个节点子树节点编号的范围,这样操作就是一个线段树的区间更新了。原创 2013-11-09 10:33:00 · 1306 阅读 · 0 评论 -
hdu 4777 Rabbit Kingdom 离线树状数组
杭州现场赛的H,现场的时候最后一个小时都在想这题,到底也没搞出来...当时搞出来怎么也Ag了...题意挺简单,给n个数m个查询,每个查询【L,R】,返回这个区间内有多少个数与其他任何数互质。先预处理一下,对每个数a【i】处理一个区间,使得在这个区间中a【i】和其他的数都互质,这个预处理挺简单,提前把1--20W每个数的因子存起来,然后正推一边反推一边就好了。之后从前到后遍历每个数,遍历到a[i]的原创 2013-11-12 14:43:27 · 1382 阅读 · 0 评论 -
fzu 11月赛E 2136 取糖果 线段树
有N个袋子放成一排,每个袋子里有一定数量的糖果,lzs会随机选择连续的几个袋子,然后拿走这些袋子中包含最多糖果的袋子。现问你,在选择x个袋子的情况下,lzs最坏情况下,也就是最少会拿到多少个糖果?对于x取值为1到n都分别输出答案。(直接照搬题面啦..) 先预处理下,对每个位置i处理出一个区间[L,R]。表示这个范围中,a[i]是最大的,然后用线段树维护下最大值,循环1到n,对i,原创 2013-11-11 00:28:43 · 1024 阅读 · 0 评论 -
ZOJ 3726 Alice's Print Service 二分+rmq
打印k页的资料,给出n中付费方案,一次打印超过s1但不超过s2的每页收费p1,超过s2不超过s3的收费p2.....数据保证0=s1=p1>=p3>=...>=pn。接下来m个查询,对于每个查询问最少花多少钱?例如s1=0 s2=100 p1=20 p2=10 的时候,若要打印99页,显然直接打印100页要更便宜一点..所以结果是1000.. 由于数据该要求的都要求了,对于每个原创 2013-11-24 18:08:35 · 1961 阅读 · 0 评论 -
poj3167&hdu4749 KMP+BIT
一道比较好玩的KMP,他在匹配的时候不是按该位字符是否想到,而是按当前字符的名次来判断是否匹配,转化一下就是对i,j,若i之前中比s[i]小的和j之前中比s[j]小的数的个数相等并且i之前小于等于s[i]的数和j之前小于等于s[j]的个数相等,那么就判定s[i]和s[j]匹配。以此方法构造状态转移图后,拿母串跑一遍即可。维护的过程可以用树状数组实现。hdu4749那个和poj3167基本一样,最后原创 2013-10-15 11:25:21 · 929 阅读 · 0 评论 -
UVA1400 "Ray, Pass me the dishes!" 线段树
本来是在做伸展树的,发现了一道需要求区间最大连续和的题,然后想起了原来做的这题好像还没过...当时有事后缀,又是前缀,又是最大子区间和,直接调成傻逼了= =...这次回头做了做,感觉思路还是挺清晰的,就是第一次写搓了把区间和也记录了,实际上只记录个下标就够了,区间和预处理一下就行了。主要思路就是用线段树构造并查询四个值,最大子区间的左右端点l_id,r_id,区间最大后缀的起点s_id,区间最大前原创 2013-10-11 23:08:35 · 1057 阅读 · 0 评论 -
hdu2492 Ping pong 树状数组BIT
给一列互不相同的数,统计第i个位置(2 #include #include #include #include #include using namespace std; typedef __int64 ll; const int maxn=200010; int tr[maxn]; int n,m,p,q,k,mxn; struct BIT { int lowbit(i原创 2013-10-06 20:27:06 · 816 阅读 · 0 评论 -
hdu4742 Pinball Game 3D
杭州网赛的1005,题意挺简单,每个球有x,y,z三个坐标,球i得三个坐标同事小于等于球j的坐标时,可以用i去撞击j,撞击后i消失,j继续去撞下一个球。问最多可以撞多少个球和有多少种不同的方法。比赛结束后也一直没什么好的思路,刚开始想着用拓扑排序去搞结果发现极限情况的边太多记录不下..后来看了 http://troysky.com/hdu-4742-pinball-game-3d/ 这篇题解,又原创 2013-09-18 13:47:20 · 1243 阅读 · 2 评论 -
codeforces 461C 暴力+BIT
题意是这点线段,每次两种操作,1 x表示把线段原创 2014-09-01 23:32:28 · 753 阅读 · 0 评论
分享