自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

苟为蒟蒻又何妨

DianPiBoZhuBaoFuSheHui

  • 博客(83)
  • 资源 (1)
  • 收藏
  • 关注

原创 2018.07.31cogs2964. 数列操作η(线段树)

传送门 线段树基本操作。 我们维护当前所有的aiaia_i%bibib_i与bibib_i差量的最小值,这样就把第一个操作变成了区间减法。 如果当前区间的差量最小值是大于111的,说明在这次减法过后整个区间对答案不会有新的贡献,直接打上标记。 否则我们递归到叶子结点,重新赋值差量并统计对答案的贡献,整个东西开个树状数组记录就好。 代码:#include<bits/stdc+...

2018-07-31 15:34:00 258

原创 2018.07.31洛谷P1552 [APIO2012]派遣(可并堆)

传送门 貌似是个可并堆的模板题,笔者懒得写左偏堆了,直接随机堆水过。实际上这题就是维护一个可合并的大根堆一直从叶子合并到根,如果堆中所有数的和超过了上限就一直弹直到所有数的和不超过上限为止,最后对于当前的子树,这样剩下的堆中的元素个数一定是最多的,然后直接统计答案就行了。 代码:#include<bits/stdc++.h>#define N 100005#define...

2018-07-31 14:06:35 175

原创 2018.07.31 bzoj4569: [Scoi2016]萌萌哒(并查集+倍增)

传送门 对于每个限制,使用倍增的二进制拆分思想,用并查集数组fa[i][j]fa[i][j]fa[i][j]表示从iii开始,延伸2j2j2^j的区间所属的集合,这样的话,我们将所有限制拆分过后,从上向下传递标记直到长度为111的区间,最后统计有多少长度为111的区间的祖先是自己即可。 代码:#include<bits/stdc++.h>#define mod 10000...

2018-07-31 11:51:51 240

原创 2018.07.31 POJ1741Tree(点分治)

传送门 只是来贴一个点分治的板子(年轻时候写的丑别介意)。 代码:#include<cstdio>#include<cstring>#include<algorithm>using namespace std;#define N 10010#define INF 1e9+10struct node{int v,c,next;}e[N*2]...

2018-07-31 10:21:36 115

原创 2018.07.30 cogs2632. [HZOI 2016] 数列操作d(线段树)

传送门 线段树基本操作 区间加等差数列,维护区间和。 对于每个区间维护等差数列首项和公差,易证这两个东西都是可合并的,然后使用小学奥数的知识就可以切掉这题。 代码:#include<bits/stdc++.h>#define lc (p<<1)#define rc (p<<1|1)#define mid (T[p].l+T[p].r>&a

2018-07-30 16:00:59 448

原创 2018.07.30 bzoj4355: Play with sequence(线段树)

传送门 维护区间覆盖成非负数,区间变成max(xi+a,0)max(xi+a,0)max(x_i+a,0),询问区间中000的个数。 由于每次操作之后区间中都是非负数,因此相当于只用维护最小值和最小值的个数。 对于将一个区间变成max(xi+a,0)max(xi+a,0)max(x_i+a,0)的操作,我的想法是将它转化成xi=xi+axi=xi+ax_i=x_i+a,xi=max(xi,0...

2018-07-30 13:38:03 250

原创 2018.07.29~30 uoj#170. Picks loves segment tree VIII(线段树)

传送门 线段树好题。 维护区间取两种最值,区间加,求区间两种历史最值,区间最小值。 自己的写法调了一个晚上+一个上午+一个下午+一个晚上并没有调出来,909090分草草收场。 于是我开始学习新的写法。 也就是封装再封装。 然后发现自己的方法的确有不严谨的地方,但并不好改,于是写了一个凌晨参考了xuyixuanxuyixuanxuyixuan神犇的写法调过了这题。 实际上就是我们对区间...

2018-07-30 00:26:43 406

原创 线段树(合并/分治)&&重/长链剖分&&主席树专题(持续更新中)

常规线段树(简单)模板 树剖区间取负,单点修改维护最大最小总和 单点修改维护根节点乘积 维护区间连续(0/1)(0/1)(0/1)的长度 根据逆序对数还原排列 双指针+线段树永久化标记 505050多棵线段树动态开点 线段树(树状数组)求逆序对 单点插入区间查询 区间开根区间求和 单点修改区间最大连续和线段树与算法(简单)优化dpdpdp 线段树合并 李超线...

2018-07-28 16:01:09 3201 9

原创 2018.07.28 uoj#169. 【UR #11】元旦老人与数列(线段树)

传送门 线段树好题。 维护区间加,区间取最大值,维护区间最小值,历史区间最小值。 同样先考虑不用维护历史区间最小值的情况,这个可以参考这道题的解法,维护区间最小和次小值可以解决前两个操作,然后使用历史标记的常规维护方式合并标记更新就行了。 代码:#include<bits/stdc++.h>#define lc (p<<1)#define rc (p&a

2018-07-28 15:25:18 241

原创 2018.07.28 uoj#164. 【清华集训2015】V(线段树)

传送门 线段树好题。 要求支持的操作: 1.区间变成max(xi−a,0)max(xi−a,0)max(x_i-a,0) 2.区间加 3.区间覆盖 4.询问单点最值 5.询问单点历史最值 注:以下提到的标记都是向下传递的懒标记。 这题直接更新区间最大值貌似不好维护,因此我们需要更换思路,对于每个节点维护一个标记(a,b)(a,b)(a,b),来表示在上一次修改这个区间之后当前区间...

2018-07-28 10:36:58 284

原创 2018.07.27 bzoj3064: Tyvj 1518 CPU监控(线段树)

传送门 线段树好题。 维护区间加,区间覆盖,区间最大,区间历史最大。 这个东西在国家集训队2016论文集之《区间最值操作与历史最值问题——杭州学军中学 吉如一》中讲的已经很详细了。 简单来说是这样的: 我们先考虑没有区间覆盖的情况,如果只有区间加的话,我们维护一个标记historyhistoryhistory_addaddadd来表示当前区间在上一次区间加之后最大的历史加标记,这样的话可...

2018-07-27 23:15:28 271

原创 2018.07.27 bzoj4695: 最假女选手(线段树)

传送门 线段树好题 支持区间加,区间取minminmin和maxmaxmax。 维护区间和,区间最大值,区间最小值。 这题可以类比另外一道线段树 维护区间最大,次大,最小,次小,和。 每次修改的时候考虑对每个量产生的影响,然后用最大最小值配合次大次小值剪枝就行了。 注意这题卡空间。 代码:#include<bits/stdc++.h>#define ll lo...

2018-07-27 17:52:11 655

原创 2018.07.25 bzoj2125: 最短路(圆方树+倍增)

传送门 人生的第一道仙人掌。 这道题求是仙人掌上的最短路。 先建出圆方树,然后用倍增跑最短路,当lcalcalca是圆点和方点时分类讨论答案即可。 代码如下:#include<bits/stdc++.h>#define N 20005using namespace std;inline int read(){ int ans=0; char ch=ge...

2018-07-25 21:44:45 173

原创 2018.07.25 bzoj3878: [Ahoi2014&Jsoi2014]奇怪的计算器(线段树)

传送门 线段树综合。 让我想起一道叫做sainosainosaino的题,这题就是那题的强化版本。 说说做法吧: 跟sainosainosaino一样,当我们把a[i]a[i]a[i]排成有序的之后,就会保证在若干次操作后整个数列仍然是单调的。 首先加减可以看成一个操作,L,RL,RL,R的限制也只相当于一个操作,因此这道题要我们维护这几个操作: 1.区间加 2.区间乘 3.区间加...

2018-07-25 17:24:34 293

原创 2018.07.25 hdu5306Gorgeous Sequence(线段树)

传送门 线段树基本操作。 要求维护区间取minminmin(给定一个数xxx,让整个区间中的数都变成min(x,a[i])min(x,a[i])min(x,a[i])) 然后是查询区间最大与区间和。 第一眼看到以为是maxmaxmax和minminmin直接剪枝,结果写了一发发现挂了,然后找到了一篇叫做segmentsegmentsegment treetreetree beatsbeat...

2018-07-25 14:21:01 397

原创 2018.07.24 loj#107. 维护全序集(非旋treap)

传送门 就是普通平衡树,可以拿来练非旋treaptreaptreap的板子。 贴个代码:#include<bits/stdc++.h>#define N 300005using namespace std;typedef pair<int,int> res;int n;inline int read(){ int ans=0; char...

2018-07-24 22:54:55 249

原创 2018.07.24 bzoj3531: [Sdoi2014]旅行(树链剖分+动态开点)

传送门 树链剖分。 如何维护? 如果颜色少直接每种颜色一颗线段树走人。 但这题颜色数量不大于1e51e51e5,空间难以承受。 因此我们动态开点(毕竟所有点数加起来只有1e51e51e5) 其余就是树链剖分的基本操作了。代码如下:#include<bits/stdc++.h>#define N 3000005#define lc T[p].l#define r...

2018-07-24 21:26:12 165

原创 2018.07.23 codeforces 438D. The Child and Sequence(线段树)

传送门 线段树维护区间取模,单点修改,区间求和。 这题老套路了,对一个数来说,每次取模至少让它减少一半,这样每次单点修改对时间复杂度的贡献就是一个logloglog,所以维护区间最大值剪枝,然后每次单点暴力取模,这样的话时间复杂度为O(nlogn)O(nlogn)O(nlogn)。 代码如下:#include<bits/stdc++.h>#define lc (p&lt...

2018-07-23 23:04:17 497

原创 2018.07.23 洛谷P4097 [HEOI2013]Segment(李超线段树)

传送门 给出一个二维平面,给出若干根线段,求出xxx坐标为x0x0x_0时在最上方的线段的标号(若有多条输出最小的)。 线段树好题,这题是李超线段树板子题。 没学过的这道题可以让你很好的理解李超线段树,下面讲讲这是什么东西。 先闲扯一句没用的:维护这个信息就相当于维护实数域上插入等差数列求单点的最大值的最小标号。 下面切入正题: 李超线段树的每个节点Tl,rTl,rT_{l,r}维护的...

2018-07-23 22:04:07 284

原创 2018.07.23[PA2015]Siano(线段树)

[PA2015]Siano描述Description农夫Byteasar买了一片n亩的土地,他要在这上面种草。 他在每一亩土地上都种植了一种独一无二的草,其中,第i亩土地的草每天会长高a[i]厘米。 Byteasar一共会进行m次收割,其中第i次收割在第d[i]天,并把所有高度大于等于b[i]的部分全部割去。Byteasar想知道,每次收割得到的草的高度总和是多少,你能帮帮他吗...

2018-07-23 17:01:28 1058

原创 2018.07.23 hdu5828 Rikka with Sequence(线段树)

传送门 这道题维护区间加,区间开根,区间求和。 线段树常规操作。 首先回忆两道简单得多的线段树。 第一个:区间覆盖,区间加,区间求和。 第二个:区间开根,区间求和。 这两个是名副其实的常规操作。 但这道题如果学习没有区间加的做法维护最大值很容易卡掉。 所以怎么做呢? 区间加和区间求和就略了。 考虑到开根的性质,显然一段区间的数多开几次根差就不大了。 这样的话,我们维护区间最大...

2018-07-23 15:20:33 244

原创 2018.07.23 洛谷P4513 小白逛公园(线段树)

传送门 线段树常规操作了解一下。 单点修改维护区间最大连续和。 对于一个区间,维护区间从左端点开始的连续最大和,从右端点开始的连续最大和,整个区间最大和,区间和。 代码如下:#include<bits/stdc++.h>#define N 500005#define lc (p<<1)#define rc (p<<1|1)#define ...

2018-07-23 13:41:26 232

原创 2018.07.22 洛谷P3047附近的牛(树形dp)

传送门 给出一棵nnn个点的树,每个点上有CiCiC_i头牛,问每个点kkk步范围内各有多少头牛。 刚看完题惊了这东西不可做啊。 然后就开始想换根dpdpdp,结果没杠出来。 继续读题发现kkk很小啊,才202020,那这怕不是可以跑一个O(nk)O(nk)O(nk)的算法哦。 然后发现确实可以O(nk)O(nk)O(nk)做出来,方法是这样的。 我们仍然先选一个节点(为了方便我选的就...

2018-07-22 23:08:37 187

原创 2018.07.22 洛谷P2986 伟大的奶牛聚集(树形dp)

传送门 给出一棵树,树有边权和点权,若选定一个点作为中心,这棵树的代价是所有点权乘上到根的距离的和。求代价最小。解法:一道明显的换根dpdpdp,如果枚举根的话时间复杂度O(n2)O(n2)O(n^2)直接上天。看来只能通过某些方法来优化时间复杂度啊。我们知道求出以111为根的代价是可以O(n)O(n)O(n)递推的。然后这样能否推出111的儿子的代价呢?显然是可以的,对于以vvv为根的...

2018-07-22 22:16:13 172

原创 2018.07.22哨戒炮 II(树形dp)

哨戒炮 II描述你的防线成功升级,从原来的一根线变成了一棵树。这棵树有 N 个炮台,炮台与炮台之间 有 N-1 条隧道。你要选择一些炮台安装哨戒炮。在第 i 个炮台上安装哨戒炮得到的防御力为 vi。上次说过,哨戒炮离得太近会产生神奇的效果。具体来说,对于炮台 i,如果它安装了 哨戒炮且和 k 个哨戒炮用隧道直接相连,那么其防御力会变化 k*di。其中 di 为炮台 i 的抗 干扰属性值。如...

2018-07-22 21:16:50 284

原创 2018.07.22 洛谷P4316 绿豆蛙的归宿(概率dp)

传送门 简单的递推。由于是DAGDAGDAG,所以状态转移方程很好写。 一个点的答案等于所有能到的点的答案加上所有边权再除以边数。 没理解的请看代码:#include<bits/stdc++.h>#define N 100005#define M 200005using namespace std;struct Node{int v,next;double w;}...

2018-07-22 16:30:17 175

原创 2018.07.22 洛谷P1967 货车运输(kruskal重构树)

传送门 这道题以前只会树剖和最小生成树+倍增。 而现在学习了一个叫做kruskalkruskalkruskal重构树的优美姿势,搞得我不想写都不行了。好吧事实上krsukalkrsukalkrsukal重构树上两点的lcalcalca就是它们路径上的瓶颈这个优美的性质可以秒杀这道题。代码如下:#include<bits/stdc++.h>#define N 10005...

2018-07-22 15:53:07 208

原创 2018.07.22 洛谷P3106 GPS的决斗Dueling GPS's(最短路)

传送门 图论模拟题。这题直接写3个(可以压成一个)spfaspfaspfa,前两个把题上的p,qp,qp,q分别当做边权来跑,然后最后一次将前两次标记过两次的边边权设为0,标记过一次的边权设为1,没标记过的边权设为0就行了。代码如下:#include<bits/stdc++.h>#define N 100005#define M 500005using namesp...

2018-07-22 15:00:50 170

原创 2018.07.22 bzoj3613: [Heoi2014]南园满地堆轻絮(逆序对结论题)

传送门 做这道题有一个显然的结论,就是要使这个数列单调不减,就要使所有逆序对保证单调不减,也就是求出所有逆序对的最大差值,然后除以2然后就没了。代码如下:#include<bits/stdc++.h>#define N 5000005using namespace std;inline long long read(){ long long ans=0; ...

2018-07-22 14:20:21 190

原创 2018.07.22 codeforces750E(线段树维护状态转移)

传送门 给出一个数字字串,给出若干个询问,询问在字串的一段区间保证出现201720172017而不出现201620162016需要删去的最少字符。 下面定义5个状态。 状态0:连2都没有 状态1:只有2,没有0连在后面 状态2:出现20,没有1连在后面 状态3:出现201,没有7连在后面 状态4:出现2017 这样每次询问时,用f[i][j]f[i][j]f[i][j]表示从状态i...

2018-07-22 13:17:35 814

原创 2018.07.20 洛谷P4178 Tree(点分治)

传送门 又一道点分治。 直接维护子树内到根的所有路径长度,然后排序+双指针统计答案。 代码如下:#include<bits/stdc++.h>#define N 40005using namespace std;inline int read(){ int ans=0; char ch=getchar(); while(!isdigit(ch))...

2018-07-20 23:34:22 128

原创 2018.07.20 bzoj2152: 聪聪可可(点分治)

传送门 本蒟蒻AC的第二道点分治,调了30min30min30min发现自己把gcdgcdgcd写错了。这题是一个点分治裸板,记录整颗子树中到根的距离模333的情况,容斥一下扣去多算的部分就行了。代码如下:#include<bits/stdc++.h>#define N 20005using namespace std;inline int read(){ ...

2018-07-20 22:53:46 150

原创 2018.07.20 bzoj1614: Telephone Lines架设电话线(二分+最短路)

传送门 这题直接做显然gggggg,看这数据范围也不可能是只跑一波最短路那么简单。没错,这道题需要你跑很多次最短路。没错,这是一道二分+最短路验证的题。事实上,题目要求的东西已经提示了要使用二分。毕竟是求路径上第k+1k+1k+1大条边的权值的最小值。所以这东西怎么二分判定?干脆二分答案吧,二分路径上第k+1k+1k+1大条边的权值的最小值是kkk,然后怎么判定?等等,这样的...

2018-07-20 17:56:44 235

原创 2018.07.20 bzoj3211: 花神游历各国(线段树)

传送门 维护区间开方,区间求和。这个是线段树常规操作。 显然一个数被开方若干次之后要么是1,要么是0,所以用线段树维护区间最大和区间和,如果区间最大不超过1就剪枝剪掉,不然就继续递归直到叶节点时停下进行单点修改。虽然这方法看起来很暴力,但实际上由于只有开方这一个操作,时间复杂度是有保障的。代码如下:#include<bits/stdc++.h>#define N 10...

2018-07-20 15:10:44 257

原创 2018.07.20 atcoder Largest Smallest Cyclic Shift(贪心)

传送门 题意:给你x个a,y个b,z个c,显然这些字符可以拼成若干字符串,然后求这些字符串中最小表示法表示出来的最大的那一个。解法:贪心思想,用multiset维护现在拼成的字串,每次取一个最小的和一个最大的拼在一起,最后剩下的就是答案。代码如下:#include<bits/stdc++.h>using namespace std;int a,b,c;multise...

2018-07-20 14:42:50 417

原创 2018.07.18 洛谷P1171 售货员的难题(状压dp)

传送门 感觉是一道经典的状压dp,随便写了一发卡了卡常数开了个O(2)O(2)O(2)优化水过。。。 我直接用dp[i][j]dp[i][j]dp[i][j]表示当前在第i个点,现在点的选取状况是j(二进制表示状态)。 这样的话直接位运算枚举出可以前去的点,然后转移状态。边界是所有点都被取过一遍。 代码如下:#include<bits/stdc++.h>using n...

2018-07-18 23:32:51 344

原创 [NOI2018]归程(return)(kruskal重构树)

传送门 新鲜出炉的noi2018试题。 话说今年T1被许多大佬秒掉了。 lzy就是其中一个,并且他解法传给了我。 下面讲讲这题的解法: 首先要学习一个叫做kruskal重构树的东东。听名字就知道跟kruskal算法有关,没错,原来的kruskal算法就是用并查集实现的,但当我们使用kruskal重构树的时候,对于每次找出的不同的两个连通块的祖先,我们都新建一个点作为两个祖先的父亲,并...

2018-07-18 22:49:08 1566

原创 2018.07.18 HAOI2009 逆序对数列(线性dp)

传送门 目前只会n2n2n^2的dpdpdp做法。 设dp[i][j]dp[i][j]dp[i][j]表示111~iii的排列逆序对为jjj的方案数。显然这个东西是可以递推的。相当于将iii插入到111~i−1i−1i-1的排列中,然后就可以从dp[i−1][k]dp[i−1][k]dp[i-1][k]转移过来。 代码如下:#include<bits/stdc++.h>...

2018-07-18 11:55:35 157

原创 2018.07.17 CQOI2017 余数求和(整除分块)

洛谷传送门 bzoj传送门 这道题要用到学习莫比乌斯反演时掌握的乘除分块算法,也就是对于一个数nnn,nnn除以111到nnn的数商的取值只有sqrt(n)sqrt(n)sqrt(n)种,然后这道题对于商相同的一段余数,它们会构成一个等差数列,于是直接上整除分块统计答案即可。代码如下:#include<bits/stdc++.h>using namespace std...

2018-07-17 16:09:52 164

原创 2018.07.17 HAOI2016 找相同字符(SAM)

传送门 就是给两个字符串,让你求公共字串的个数。 本来大佬们都是用的广义后缀自动机,但我感觉后缀自动机已经可以做这道题了。我们对其中一个字串建出后缀自动机,然后用另外一个后缀自动机在上面统计贡献即可。代码如下:#include<bits/stdc++.h>#define N 400005#define ll long longusing namespace std;...

2018-07-17 15:38:51 214

segment--tree

一个线段树的ppt,里面主要讲了线段树,主席树,和树链剖分

2018-08-20

空空如也

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

TA关注的人

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