自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

矮纸斜行闲作草

yc写字的地方

  • 博客(18)
  • 收藏
  • 关注

原创 P3258 [JLOI2014]松鼠的新家 (树链剖分+差分)

题目链接分析:题目每次都是让一条路径上的点修改,我们可以先用树链刨分,把树上的点转化成DFS序数组里面的区间, 题目就变成了DFS序数组的区间修改,且每次修改只是把某个区间的值都加1 ,这里用差分数组可以在O(1)时间完成修改,最后统计前缀和输出就好。题目有个坑就是从第二次出发开始出发点是不需要加1的,且最后到达的点也不需要+1,我们可以先忽略这个 ,最后统计完前缀和再把除第一个点之外的答案-1.#include<bits/stdc++.h>using namespace std;

2021-02-28 23:58:05 114

原创 P3384 【模板】轻重链剖分

题目链接直接贴模板 带注释#include<bits/stdc++.h>using namespace std;#define ll long longconst int maxn = 1e5+7;const ll inf = 34359738370;int n,m,r,p;struct { int to,next;}e[maxn<<1];int head[maxn],num=1;void add(int v,int u){ e[num].t

2021-02-28 21:50:20 107

原创 Mayor‘s posters POJ - 2528 (区间染色+离线查询)

题目链接题意:给出一面墙,给出n张海报贴在墙上,每张海报都覆盖一个范围,问最后可以看到多少张海报。(1<=n<=1e5 墙的范围是[1,1e7])分析:题意很明显是在线修改,离线查询的区间染色问题。 我们用线段树维护区间颜色情况,一共三种情况:①无颜色②有一种颜色(记录是哪种)③多种颜色(不需要记录是哪些,因为是离线查询,最后查询的时候递归给子区间处理就好)最后查询的时候遇到第三种信息就继续递归给子区间,否则处理+返回。另外这题区间范围较大,但是给出的区间个数很小,可以考虑离

2021-02-23 14:16:06 172

原创 CF992E Nastya and King-Shamans (线段树+暴力查询+剪枝)

题目链接分析:原数组a[i] 前缀和数组sum[i]设数组d[i]=a[i]-sum[i-1]问题就等价于每次修改数组d[i] 、 d [i+1,n] 也就是单点修改+区间修改。 查询的时候需要查的就是 是否存在d[i]==0,想到能否对数组d[]建线段树维护某些信息呢?我们用线段树维护数组d[i]的区间最大值,每次查询就单点查询+剪枝(区间最大值小于0就直接return)这样看似暴力,似乎时间复杂度是O(n * n * logn),实际上由于剪枝会降到O(n * logn * logs

2021-02-21 18:47:03 241

原创 P2184 贪婪大陆 (线段树+差分思维)

题目链接题意:简单点说就是,操作1相当于放置一个区间,操作2相当于询问[l,r]内涉及多少种放置的区间。思路:对于询问的区间[l,r] 如果我们能知道 [1,r] 里面一共涉及多少个区间,[1,l-1]一共有多少个完整的区间(即区间在l左边就结束了) 。用前者减去后者就是答案了。所以我们需要维护2个信息,对于任意下标i①维护[1,i]的区间左端点个数(也正是涉及的区间数)②维护[1,i-1]的区间右端点个数 (也正是i之前已经结束的区间个数)对于每次操作1,输入L,R ,我们要让[L,n]的

2021-02-20 16:22:17 367

原创 CF438D The Child and Sequence (线段树 区间取模)

题目链接分析:这里涉及区间取模操作。显然是一个不好处理的操作,因为它不方便打标记,更很难合并标记。一般遇到这种情况,我们可以考虑单点暴力修改,然后再优化这个暴力的过程。我们可以用一个结论:若p<=x, (x%p)<x/2 。因此任意整数数x取模最多可以取logx次。若p>x, x%p相当于没有任何操作. 我们可以记录区间最大值,如果最大值小于p就直接返回,类似于剪枝操作。于是就把这题从区间取模修改 转化成了单点修改,无需pushdown操作,遇上区间最值小于p的就直

2021-02-19 17:52:46 209

原创 P2894 [USACO08FEB]Hotel G (线段树)

题目链接这题其实和P6492 [COCI2010-2011#6] STEP思路差不多,要维护的东西也差不多。都是考虑区间合并的时候,需要哪些信息,然后和答案一起维护就好。不过区间查询的时候需要注意,优先考虑左子区间的答案 ,然后是中间,最后是右子区间。#include<bits/stdc++.h>using namespace std;#define ll long longconst int maxn = 5e5+7;const ll inf = 34359738370;

2021-02-19 14:22:54 121

原创 CF620E New Year Tree (dfs序建线段树+状态压缩)

题目链接分析:题目要求是区间修改 区间查询,我们考虑用线段树去搞。但是这里是在树上,而线段树是维护(线性)区间信息的。所以我们需要对树做一个预处理,即:求出树的dfs序dfs序就是从根节点dfs得到的一个序列,将树拍平成一条线。比如:这棵树的dfs序(不唯一)就是:1 4 6 3 7 10 5 8 2 9 这样的话我们就可以把一个点的dfs序代表这个点,这样不论树的形状是怎样的,dfs序都可以把它转化成线性结构。我们通过dfs把这颗树的dfs序存储在pos数组中。同时用in数组记录dfs

2021-02-17 23:28:05 118

原创 P6492 [COCI2010-2011#6] STEP (线段树)

题目链接我们先规定L为0 R为1,题目就是求最长的01/10串从题意来看,类似单点修改 区间查询,于是思考能否用线段树来维护某些东西,从而在logn时间内完成查询。我们令tree[rt].ans 表示rt对应区间的答案,也就是最长的01/10串我们考虑左右两个子区间 [l,mid] 、[mid+1,r] 的合并的若干种情况:①当左子区间右端点等于右子区间左端点 :此时根节点答案只能是左右子树答案中的最大值。tree[rt].ans=max( tree[lc(rt)].ans , tree[

2021-02-17 14:06:26 254

原创 CF242E XOR on Segment (线段树+二进制拆位)

题目大意涉及区间内的异或,我们可以把每个数看成二进制,由于1e6<2^20 ,所以最多有二十位 。用二十棵线段树维护二进制下的20位。 每棵线段树涉及的操作就是区间求合 区间翻转啦。#include<bits/stdc++.h>using namespace std;#define ll long longconst int maxn = 1e5+7;const ll inf = 34359738370;int tree[maxn<<2][21],tag[ma

2021-02-16 15:08:55 227

原创 P1637 三元上升子序列 (权值线段树优化dp)

题目链接首先我们很容易想到这题可以用dp来做,d1[i]表示前i-1个元素中,小于a[i]的元素个数d2[i]表示前i个元素中三元上升子序列的对数转移过程非常朴素,见代码#include<bits/stdc++.h>using namespace std;#define ll long longconst int maxn = 1e5+7;const int INF = 2e9+1;int d1[maxn],d2[maxn];int n,a[maxn];ll ans=0

2021-02-11 19:07:54 197

原创 P3369 【模板】普通平衡树 (权值线段树解法)

题目链接可以用权值线段树维护一个[-inf,inf]大小的桶 。插入删除就是点修改求v的排名:求出区间[-inf,v-1]里面数的个数再加1求排名为k的数:权值线段树的基本操作求v的前驱:先求出[-inf,v]区间数的个数,再减去桶里面v的个数得到的就是前驱节点的排名 。然后按排名求出前驱即可求v的后继:先求出[-inf,v]区间数的个数,再+1就得到后继的排名,再按排名求出后继。#include<bits/stdc++.h>using namespace std;#def

2021-02-11 16:52:54 225

原创 P5459 [BJOI2016]回转寿司 (权值线段树+动态开点)

题目链接题意:给定一个序列,给定区间[L,R] ,问序列有多少子串的和属于这个区间。分析:我们先处理得到前缀和数组,pre[] ,子串[l,r]的和即:pre[r]-pre[l-1]问题即:对于L<=pre[r]-pre[l-1]<=R (1<=l<=r<=n ),有多少对l r满足它我们转化一下变成:pre[r]-R<=pre[l-1]<=pre[r]-L (1<=l<=r<=n )到这里可以想到一种思路:我们枚举r同时把pre数

2021-02-09 21:04:28 201

原创 P3372 【模板】线段树 1 (动态开点)

题目链接线段树的动态开点,简单点说就是在心中构建好了一棵线段树,需要访问某个点的时候才标记,没有访问节点的统一设为0,节约空间。主要用于维护区间很大(比如权值线段树),或者数据需要离散化的时候也可以动态开点来省点代码量。#include<bits/stdc++.h>using namespace std;#define ll long longconst int maxn = 1e5+7;//线段树维护区间和 涉及区间修改ll tree[maxn<<2];//表示对

2021-02-09 18:03:25 799

原创 P4588 [TJOI2018]数学计算 (线段树入门)

题目链接 这题咋一看不就是开long long然后模拟吗? 但是模拟的话,如果出现连续Q/2次乘,然后连续Q/2次除以,就只能留到最后取模(否则除的时候就出错了),这样是会爆long long 的。所以不能单纯模拟我们换个思路,如果我们把输入序列记录下来,每次改一个数就从新算一遍。这不就相当于点修改,区间乘积查询吗? 很明显可以用线段树维护,让"从新算一遍"降到log级别复杂度。我们建一棵Q个叶子节点的线段树维护区间乘积,叶子节点初始化成1。用a[ ]记录输入的数。如果第i次操作是操作1 就把第

2021-02-04 11:41:48 142 1

原创 P5057 [CQOI2006]简单题 (线段树入门)

题目链接线段树维护RSQ问题,tree[rt]表示rt代表的区间中 1的个数,思路和普通的RSQ问题处理基本一致,有一个要注意的地方在于,更新懒标记tag的时候,如果翻转了偶数次,那么相当于不翻转,翻转了奇数次等价于翻转1次。所以我们更新方法为:tag[rt]^=1 ,当tag[rt]==1 ,说明子树区间需要翻转,否则不需要#include<bits/stdc++.h>using namespace std;#define ll long longconst int max

2021-02-03 22:14:23 188

原创 P1276 校门外的树(增强版) (线段树入门)

题目链接涉及区间维护,我们可以用线段树来做。开两个线段树tree[] 、 miao[] ,分别表示区间中树的个数,树苗的个数。(注意种下的全部是树苗)。要求输出砍掉的树苗数,最终剩余的树苗数,所以我们用ret记录砍掉的树苗数目,而剩余的树苗数目就是miao[root]懒标记一共有4种:种树、砍树、先种后砍、先砍后种。其中先种后砍与砍树的作用是等价的 ,所以我们用1表示种树,2表示砍树,3表示先砍后种区间更新以及标记的下放细节见代码。#include<bits/stdc++.h&gt

2021-02-03 14:30:17 405

原创 True Liars POJ - 1417 (带权并查集+01背包)

题目链接题意:正义阵营只会说真话,邪恶阵营只会说假话共有n句话,形如x y a表示:x说y属于正义或邪恶(x可以等于y)其中a为yes或no(yes表示正义,no表示邪恶)题目保证不会出现矛盾的情况。分析:①如果a是yes,那么x y一定是同一个阵营,如果是no,一定是相反阵营②据此我们可以用带权并查集维护1~p1+p2所有节点之间的相对关系,0表示同阵营,1表示相反阵营。最终维护得到若干个连通块。每个连通块分别有若干个正义/邪恶阵营,统计信息,存进数组bag[i][0] / bag[

2021-02-01 20:28:38 99

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除