
线段树
文章平均质量分 69
Miao_zc
膜Hz
展开
-
bzoj4034: [HAOI2015]T2
初学树剖。。。听说是裸题。。。然后就做了。。。注意某个节点和它的子树DFS序相连,只要记住它子树最大的DFS序即可进行子树修改。#include#include#define N 2000000#define ll long longusing 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 · 467 阅读 · 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 · 628 阅读 · 0 评论 -
bzoj3672: [Noi2014]购票
为什么我这么慢!!!这道题大概有两种思路,树分治和线段树。树分治:使用类似cdq的方式,1:找重心,分裂,2:work(根所在的树)3:用重心到根的点的答案更新重心的子树,4:work(重心的子树)。更新的时候维护一个下凸壳,在下凸壳上二分即可。(我写了这个)线段树:同样需要维护下凸壳,考虑在dfs时动态维护当前节点到根路径上的区间下凸壳,这个用线段树在每个节前维护一个支持回撤的单调栈原创 2016-12-12 15:15:26 · 685 阅读 · 1 评论 -
bzoj1588: [HNOI2002]营业额统计
切水。法一:用平衡树维护,nlogn,网上大多数题解都是这个法二:权值线段树,我写的是这个,nlog1e9法三:离线+离散化+权值线段树,没什么好说的,nlogn法四:离线排序+链表,从后往前扫一遍即可,nlogn+n,常数比较小#include#include#define N 1000005#define inf 200000000using namespace s原创 2016-12-01 14:24:24 · 547 阅读 · 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 · 978 阅读 · 0 评论 -
bzoj4592: [Shoi2015]脑洞治疗仪
由于脑洞的序列不会改变,考虑用线段树维护区间内sum,左边0的个数,右边0的个数,区间内最大脑洞。对于查询l~r最大脑洞可以将l~r分成logn个区间,总复杂度O(nlogn)。#include#include#include#define N 800005using 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 · 817 阅读 · 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 · 942 阅读 · 0 评论 -
bzoj2157: 旅游
树链剖分。把边权转成深度大的点权,支持单点赋值,路径取反,路径求和,路径最值,用线段树即可完成。因为第一种操作是对边的编号修改,一开始没注意WA了。。#include#include#define N 100000#define inf 1000000000using namespace std;int n,m,x,y,z,w[N],L[N];int first[N],to原创 2016-04-18 08:48:45 · 426 阅读 · 0 评论 -
bzoj2957: 楼房重建
容易想到把楼房高度转化为斜率,然后就是求x1,x2,x3...使x1#include#include#define N 100005using 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 · 628 阅读 · 0 评论 -
bzoj3242: [Noi2013]快餐店
——来自一个失去梦想的咸鱼miaom考虑海蜇基环树的一般套路,在确定快餐店位置的情况下,最优解中环上必有一条边是废的。思考枚举这条边,我们需要在最快的时间求剩余部分的直径。当前答案就是直径/2,证明非常简单,就离快餐店最远的点一定是直径端点。这个东西可以通过双指针单调队列维护,达到O(n)复杂度。然后我就失去了梦想,直接线段树水过了。线段树做法如下:先搞出那个环,重复一遍变成序列问题,询问原创 2017-07-04 21:09:18 · 655 阅读 · 0 评论