线段树
文章平均质量分 92
ModestCoder_
一个modest的coder
展开
-
【题解】模拟赛11.22T1 玩具
以样例为例,我们这样排列数字 枚举所有人最多不能超过iii个玩具,就把超过的部分买回来 然后我自己至少得拥有i+1i+1i+1个玩具,所以如果不够的话,从下面取 可以用线段树维护,所以需要一开始离散化,每次数据结构套离散化真的挺麻烦的 Code: #include <bits/stdc++.h> #define maxn 100010 #define ls rt << 1 #define rs rt << 1 | 1 #define LL long long usi..原创 2020-11-25 21:13:41 · 171 阅读 · 0 评论 -
【题解】LuoGu4611:[COI2012] TRAMPOLIN
原题传送门 如果可以,尽可能经过所有蹦床 只要到达一个蹦床,那么就能到达所有蹦床 暂且先不考虑高度相平的情况,那么必定形如 假设我现在正在aaa蹦床,我可以跳到ddd,再回到aaa 假设我现在正在bbb蹦床,我可以先跳到eee,再回到bbb,再跳到ccc,再回到bbb 假设我现在正在ccc蹦床,我什么也干不了 这样我就把蹦床的三种位置情况的操作方法搞清楚了 如果蹦床在一段斜坡中,可以跳到旁边的高峰,在回来(蹦床在顶峰的情况归于此) 如果蹦床在谷底处,可以分别往两边的高峰跳,再跳回来 然后讨论起点 如果原创 2020-11-06 17:31:59 · 189 阅读 · 0 评论 -
【题解】AT4439:[AGC028E] High Elements
原题传送门 这题很难 因为要求输出的字典序最小,所以0优先 想到逐位确定的贪心思想:从第1位开始,先假设这一位是0,就把这个数放到xxx序列中,验证一下之后的数能否再合法,如果可以,就把这个数放到xxx序列,否则就只能放到yyy序列 逐位确定的复杂度是O(n)O(n)O(n) 所以要求我们在O(logn)O(logn)O(logn)时间内解决checkcheckcheck问题 先定义原序列中的上升位为“原上升位”,到新序列新产生的上升位(即本来不是上升位变成了上升位)为“新上升位” 结论1:原上升位到新的序原创 2020-11-01 11:00:45 · 228 阅读 · 0 评论 -
【题解】LuoGu6859:蝴蝶与花
原题传送门 这是一个超难题的模板,但是有一个性质,ai=1/2a_i=1/2ai=1/2,我敏锐的感觉到这道题可能是基于这个性质来做的 先令l=1l=1l=1,看看是否存在rrr,使得al+...+ar=sa_l+...+a_r=sal+...+ar=s 发现不存在这个rrr,当且仅当存在rrr,使得∑i=lrai=s−1且ar+1=2\sum_{i=l}^{r}a_i=s-1且a_{r+1}=2∑i=lrai=s−1且ar+1=2 如果存在rrr满足,当然直接输出,若是不存在 必定形如 考虑移原创 2020-10-25 12:03:12 · 217 阅读 · 0 评论 -
【题解】LuoGu4422:Deda
原题传送门 这是二维偏序,注意到每个小朋友的年龄为1−n1-n1−n不同 可以按照小朋友的年龄为线段树的下标,维护一段小朋友区间中最小的站台 每次updateupdateupdate暴力把所有包含这个小朋友的区间更新,这个部分稳定O(nlogn)O(nlogn)O(nlogn) 每次queryqueryquery先看看能不能往左找到满足的小朋友,不行看看往右走可不可以 算是一个常数比较大的线段树 Code: #include <bits/stdc++.h> #define maxn 200010原创 2020-10-21 20:32:51 · 160 阅读 · 0 评论 -
【题解】LuoGu5202:USACO19JAN]Redistricting P
原题传送门 这个是双关键字的单调队列 记HHH为1,GGG为-1,统计前缀和 暴力dpi=min(dpj+(sumi>=sumj))(i−j<=m)dp_i=min(dp_j+(sum_i>=sum_j))(i-j<=m)dpi=min(dpj+(sumi>=sumj))(i−j<=m) 用单调队列维护,如何判断两个数在队列中的先后? 对于两个数p,qp,qp,q dpp!=dpqdp_p!=dp_qdpp!=dpq,dpdpdp值小的那个优先 dpp=dp原创 2020-09-20 18:31:19 · 212 阅读 · 0 评论 -
【题解】LuoGu2605:[ZJOI2010]基站选址
原题传送门 开坑原创 2020-08-27 16:25:30 · 228 阅读 · 0 评论 -
【题解】LuoGu5568:[SDOI2008]校门外的区间
原题传送门 转化成线段树的区间覆盖+翻转问题 用线段树维护当前区间 并且维护两个标记cov,tagcov,tagcov,tag,分别代表覆盖和翻转的标记 U:BU:BU:B区间覆盖1 I:BI:BI:B区间的补集覆盖0 D:BD:BD:B区间覆盖0 C:C:C:全集范围内01翻转,转到III操作 S:BS:BS:B区间范围内01翻转 细节处理 输入输出细节 开闭用*2方法处理 覆盖和翻转的优...原创 2019-10-13 16:06:33 · 249 阅读 · 0 评论 -
【题解】9.26模拟赛T3
很好想到暴力线段树 每个数拆成20个二进制位,对于每一位进行区间操作即可 对于每一位,线段树维护0的个数,1的个数,以及是否被翻转 一个区间亦或上0,没变化,不用管 一个区间亦或上1,1变0,0变1,就是两个参数交换一下,顺便给这个区间打上翻转标记 求和就是统计1的个数,然后再最终乘上2x2^x2x代表这一位转成十进制是多少 还是注意一下细节吧,我马力太菜,调了好久。。。 Code: #incl...原创 2019-09-29 13:12:35 · 195 阅读 · 0 评论 -
【题解】CF827D:Best Edge Weight
原题传送门 首先kruskalkruskalkruskal跑出最小生成树 对图中每条边进行讨论(设这条边连接的两个点为u,vu,vu,v) 非树边,要使这条边成为树边,把这条边的权值最大改为u−>vu->vu−>v路径上边权最大值-1即可 树边,最大边权使得这条边依然是树边,最大能达到所有连接的点的路径经过这条边的非树边的边权最小值-1 如何做?非树边和树边分...原创 2019-07-30 17:42:30 · 276 阅读 · 0 评论 -
【题解】LuoGu3313:[SDOI2014]旅行
原题传送门 此题不错,调了我3h,码力++ 第一感觉肯定是树剖了,但是这里还需要关注教派不同的问题 想到对于每一个教派都开一棵线段树,维护区间最值与区间和 空间可能会存不下,所以需要动态开点 有许多细节问题 Code: #include <bits/stdc++.h> #define maxn 100010 using namespace std; struct Edge{ int ...原创 2019-04-21 09:08:43 · 262 阅读 · 0 评论 -
【题解】LuoGu3168: [CQOI2015]任务查询系统
原题传送门 嗯,区间修改+单点求值 仅仅是这样的话,用线段树/树状数组维护差分数组的前缀和即可 不过,本题加强了难度,要求操作中前k小的值对点进行修改 想到对于每个点都维护一颗权值线段树,不过空间不允许如此奢侈 我们把差分思想和权值线段树结合起来,并且凭着优化空间的目的,想到用主席树维护差分数组的前缀和,询问用权值线段树搞一搞 Code: //感觉没什么好注释的,代码很好理解~~ #include...原创 2019-04-20 18:14:37 · 624 阅读 · 0 评论 -
【学习笔记】最长不下降子序列
题目 给定一个长为n(1≤n≤100000)的正整数(最大为2^31-1)序列,求最长不下降子序列的长度. Sample inupt 7 1 3 3 6 8 3 6 Sample output 5 博主自己随便弄的一道题目 这里我讲四种方法 1、普通DP 时间复杂度O(n^2),用在此题会Tle,普通DP在本博文视为暴力~~ dp[i]表示以第i个数结尾的...原创 2018-08-08 21:59:29 · 980 阅读 · 0 评论 -
【学习笔记】浅谈线段树与树状数组
这是两种类似的算法 这是两种O(n^2)->O(nlogn)的算法 这两种算法有区别 树状数组支持: 单点修改(+-*/,维护最值) 区间修改(+-,维护最值) 注意:树状数组覆盖的区间不灵活,只能前缀或后缀,值的变化还好说,维护区间最值的话就很伤了,但这篇题解宽了我的思路,说明要做到树状数组维护区间最值可以浪费点时间 线段树支持: 单点修改(+-*/,维护最值) 区间修...原创 2018-08-07 21:35:33 · 764 阅读 · 0 评论 -
【题解】BZOJ5168:[HAOI2014]贴海报 【线段树】
Description Bytetown城市要进行市长竞选,所有的选民可以畅所欲言地对竞选市长的候选人发表言论。为了统一管理,城市委 员 会为选民准备了一个张贴海报的electoral墙。张贴规则如下: 1.electoral墙是一个长度为N个单位的长方形,每个单位记为一个格子; 2.所有张贴的海报的高度必须与electoral墙的高度一致的; 3.每张海报以“A B”表示,即从第A个格...原创 2018-08-02 22:12:17 · 466 阅读 · 0 评论 -
【学习笔记】线段树
线段树用于解决区间问题,此博文只贴模版,题目假设为区间加和区间查询 推荐 1、更新 void pushup(int root){ tree[root]=tree[root&lt;&lt;1]+tree[root&lt;&lt;1|1]; } 2、建树 void build(int root,int l,int r){ if (l==r){ tree...原创 2018-08-07 19:59:57 · 258 阅读 · 0 评论 -
【题解】LuoGu3372:【模板】线段树 1【两解】
题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.求出某区间每一个数的和 输入输出格式 输入格式: 第一行包含两个整数N、M,分别表示该数列数字的个数和操作的总个数。 第二行包含N个用空格分隔的整数,其中第i个数字表示数列第i项的初始值。 接下来M行每行包含3或4个整数,表示一个操作,具体如下: 操作1: 格式:1 x y k 含义:将区间[...原创 2018-08-05 16:41:19 · 295 阅读 · 0 评论