随笔分类 -  线段树

摘要:思路:本来写了一个比较短的代码,并且各函数间的重用性比较高,就是结果悲剧的超时了...就是保证每个区间只有一种操作,那么更新时就要更新子节点的子节点,需要递归更新,结果是可想而知。其实这种做法是可以过得,只要将复杂度转移到求和上去(测试数据对求和操作应该要求不严)。但那样就不能直接保存p的三种情况值,因为这样会使得常数级非常大,超时。所以就要找到多重操作并存的方法。对于置为c,这个容易解决。关键是加和乘。思路见代码注释#include#include#include#include#include#define lson(x) x>1; }}tree[Maxn*4];int ans;vo 阅读全文
posted @ 2013-08-11 12:51 fangguo 阅读(344) 评论(0) 推荐(0)
摘要:思路:当k为1的时候,用二分法查询包含有f个空瓶的上界r,然后更新会方便很多,直接更新区间(a,r)了。#include#include#include#include#include#define lson(x) (x>1)#define inf 1=tree[po].r) { ans+=tree[po].r-tree[po].l+1-tree[po].left; tree[po].left=tree[po].r-tree[po].l+1; tree[po].up=1; return ; } down(po); ... 阅读全文
posted @ 2013-07-26 14:18 fangguo 阅读(266) 评论(0) 推荐(0)
摘要:思路:首先将所有的查询有一个vector保存起来。我们从1号点开始dfs这颗二叉树,用线段树记录到当前节点时,走左节点的有多少比要查询该节点的X值小的,有多少大的,同样要记录走右节点的有多少比X小的,多少比X大的。小和大的x,y值题目给了。当要进行左儿子时,建该节点值插入走左的线段树,回退的时候将其删除,进入右儿子时将其插入走右的线段树,同样回退时删除。遍历完一个树,整个查询就做完了,最后输出。#include#include#include#include#include#include#define Maxn 200100#define lson(x) (x>1)#define in 阅读全文
posted @ 2013-07-24 17:13 fangguo 阅读(428) 评论(0) 推荐(0)