
线段树
文章平均质量分 69
Miao_zc
膜Hz
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
bzoj4034: [HAOI2015]T2
初学树剖。。。听说是裸题。。。然后就做了。。。 注意某个节点和它的子树DFS序相连,只要记住它子树最大的DFS序即可进行子树修改。 #include #include #define N 2000000 #define ll long long using namespace std; int n,m,x,y,l,p,q; ll s[N*5],up; struct edge{int to,ne原创 2016-03-10 07:22:20 · 484 阅读 · 0 评论 -
uoj#228. 基础数据结构练习题
第一次看到这题大概在这里:2016多校联合 反正当时也没什么想法,表示有区间加好难受。 题解并不难,维护每个区间最值、和,当一个区间开根后所有值都一样就直接赋值,否则递归。存在一种特例:3 4 3 4 3 4 3 4 3,开根后1 2 1 2 1 2 1 2 1.,+2: 3 4 3 4 3 4 3 4 3,,成功卡到暴力,所以要特判,原因大概是取整吧。 所以就有了: 后来发现ad原创 2016-12-15 15:59:27 · 643 阅读 · 0 评论 -
bzoj3672: [Noi2014]购票
为什么我这么慢!!! 这道题大概有两种思路,树分治和线段树。 树分治:使用类似cdq的方式,1:找重心,分裂,2:work(根所在的树)3:用重心到根的点的答案更新重心的子树,4:work(重心的子树)。更新的时候维护一个下凸壳,在下凸壳上二分即可。(我写了这个) 线段树:同样需要维护下凸壳,考虑在dfs时动态维护当前节点到根路径上的区间下凸壳,这个用线段树在每个节前维护一个支持回撤的单调栈原创 2016-12-12 15:15:26 · 698 阅读 · 1 评论 -
bzoj1588: [HNOI2002]营业额统计
切水。 法一:用平衡树维护,nlogn,网上大多数题解都是这个 法二:权值线段树,我写的是这个,nlog1e9 法三:离线+离散化+权值线段树,没什么好说的,nlogn 法四:离线排序+链表,从后往前扫一遍即可,nlogn+n,常数比较小 #include #include #define N 1000005 #define inf 200000000 using namespace s原创 2016-12-01 14:24:24 · 565 阅读 · 0 评论 -
uoj#46. 【清华集训2014】玄学
难得的1A。。。 今天上午 Lych大讲了归并,分块,推和可并推,马上练了这题。 题意很简单对于一个数列有操作使x~y区间内的数*a+b,多次询问有x~y操作时z的值(对m取模),很显然*a+b的操作满足结合律且多次*a+b可合并为一个*c+d,不满足区间减法(m不为质数)。 对于询问一段操作,可以考虑对时间建线段树,l~r的时间内对数列的修改是O(r-l)段,于是归并,然后就好了。。。原创 2016-07-06 16:40:31 · 992 阅读 · 0 评论 -
bzoj4592: [Shoi2015]脑洞治疗仪
由于脑洞的序列不会改变,考虑用线段树维护区间内sum,左边0的个数,右边0的个数,区间内最大脑洞。对于查询l~r最大脑洞可以将l~r分成logn个区间,总复杂度O(nlogn)。 #include #include #include #define N 800005 using namespace std; int n,m,p,x,y,l,r; int sum[N],L[N],R[N],tg[N原创 2016-05-18 20:13:47 · 871 阅读 · 0 评论 -
bzoj2962: 序列操作
这是一道区间修改的线段树,其中区间加比较难,但手推一下也可以推出来,然而我慢的飞起。。。 #include #include #include #define P 19940417 #define N 160005 #define ll long long #define MO(x) ((x)%P) using namespace std; int n,q,a[N],x,y,z,b[21],tg原创 2016-05-31 08:19:29 · 956 阅读 · 0 评论 -
bzoj2157: 旅游
树链剖分。 把边权转成深度大的点权,支持单点赋值,路径取反,路径求和,路径最值,用线段树即可完成。 因为第一种操作是对边的编号修改,一开始没注意WA了。。 #include #include #define N 100000 #define inf 1000000000 using namespace std; int n,m,x,y,z,w[N],L[N]; int first[N],to原创 2016-04-18 08:48:45 · 441 阅读 · 0 评论 -
bzoj2957: 楼房重建
容易想到把楼房高度转化为斜率,然后就是求x1,x2,x3...使x1 #include #include #define N 100005 using namespace std; int n,m,x,y,see[N*4]; double Max[N*4]; int Get(int k,int l,int r,double x) { if (l==r) return Max[k]>x; in原创 2016-05-26 15:49:09 · 642 阅读 · 0 评论 -
bzoj3242: [Noi2013]快餐店
——来自一个失去梦想的咸鱼miaom 考虑海蜇基环树的一般套路,在确定快餐店位置的情况下,最优解中环上必有一条边是废的。思考枚举这条边,我们需要在最快的时间求剩余部分的直径。当前答案就是直径/2,证明非常简单,就离快餐店最远的点一定是直径端点。这个东西可以通过双指针单调队列维护,达到O(n)复杂度。然后我就失去了梦想,直接线段树水过了。 线段树做法如下:先搞出那个环,重复一遍变成序列问题,询问原创 2017-07-04 21:09:18 · 668 阅读 · 0 评论