线段树/树状数组/RMQ
sunyutian1998
这个作者很懒,什么都没留下…
展开
-
New Year Concert CodeForces - 1632D
http://codeforces.com/contest/1632/problem/D“dcan beany positive integer”是关键:既然可选任意数,则选大于1e9的素数即可。线段树用于区间查询,AC代码复杂度为n*logn*logn。其中logn*logn为二分*区间查询,可通过修改区间查询来省略二分(线段树本来就在不断二分),将复杂度降为n*logn。#include <bits/stdc++.h>using namespace std;cons..原创 2022-02-07 22:06:02 · 454 阅读 · 0 评论 -
Query on a tree HDU - 3804
http://acm.hdu.edu.cn/showproblem.php?pid=3804居然在树剖题集里发现这道题 一开始智障的用树上主席树 MLE。。 不就是个普通dfs吗。。开个vector把每个点的查询存起来 然后遍历到一个点时更新权值线段树 返回时反更新深陷数据结构泥潭 要加快进度了#include <bits/stdc++.h>using namesp...原创 2018-08-11 10:43:06 · 168 阅读 · 0 评论 -
如何愉快地与STL玩耍 51Nod - 1981
https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1981bitset说明书https://blog.csdn.net/hallmeow/article/details/76162536bitset大法好 时空复杂度低的出奇 但这题内存太小 还是要处处小心 线段树数组只能开两倍 还要用永久化标记 最后又加了俩inl...原创 2018-08-10 21:50:52 · 266 阅读 · 0 评论 -
Kingdom UVALive - 4730
https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2731给出每个点的横纵坐标 但是只关心纵坐标 每次查询都是x.5的形式 也可以当做查一条长度为1的小线段 一开始所有点都是孤立的 所以不可能会对线段造成什么影响 所...原创 2018-08-06 22:05:31 · 222 阅读 · 0 评论 -
A Simple Problem with Integers 上海大都会赛
https://www.nowcoder.com/acm/contest/163/H两种操作 区间平方取模和区间求和 模数是2018 很蹊跷 感觉运算几次之后会变为0或1 就打了个表 发现了循环节长度大部分是6 少数是2和3 只有2017自己是1 为统一取个lcm=6即可 但是每个数不一定要运算几次才能进入循环节 有345不等 直接取个10当一个区间内所有数都进入循环节后 则可以对这个区间...原创 2018-08-05 18:49:58 · 284 阅读 · 0 评论 -
SKYLINE UVALive - 4108
https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2109本来以为有什么高深的做法.. 试了一发暴力剪枝就过了..维护区间最大最小值即可#include <bits/stdc++.h>usin...原创 2018-08-05 11:04:55 · 258 阅读 · 0 评论 -
Team Rocket 牛客网多校
https://www.nowcoder.com/acm/contest/144/I用各线段的左端点离散化 建树时再将所有右端点有序地插入到线段树的叶节点 然后在pushup的过程中归并排序 这样对于每个查询 二分得到第一个小于等于x的左端点的位置p 然后查询[1,p]范围内有多少右端点大于等于x 还要看这些右端点代表的线段之前是否已经被抹除 数组标记即可 还有一个坑点就是 区间查询时如果没有...原创 2018-08-05 09:19:45 · 321 阅读 · 0 评论 -
inv 牛客网多校
https://www.nowcoder.com/acm/contest/143/D给一个1 3 ... n-1的a序列 和一个2 4 ... n的排列的b序列 问归并后最小逆序对数 肯定考虑用a插b 因为a是有序的(无脑解释)首先有个结论 a序列插入时 a[i+1]插入的最优位置一定在a[i]的右边//(1,i)|(b[j]>a[i]) 代表[1,n]内有多少b[j]大于a[i...原创 2018-08-03 15:03:43 · 197 阅读 · 0 评论 -
Legacy CodeForces - 787D
http://codeforces.com/problemset/problem/787/D线段树建图纯模板题#include <bits/stdc++.h>using namespace std;#define ll long long#define N 0x3f3f3f3f3f3f3f3fstruct node1{ int v; ll w; ...原创 2018-07-30 09:17:42 · 344 阅读 · 0 评论 -
Sasha and Array CodeForces - 719E
http://codeforces.com/problemset/problem/719/E像等差数列一样 斐波那契数列也满足可加性 所以每个区间只维护前两项即可 给每个区间项数加x等于对每个点把斐波那契矩阵乘x次 线段树里维护前两项 并把laz标记做成矩阵形式即可一开始智障 把x当参数传进update 每遇到一次目标区间就要做一次矩阵快速幂 喜获一T#include <cst...原创 2018-07-29 19:32:15 · 167 阅读 · 0 评论 -
Hash Function 牛客网多校
https://www.nowcoder.com/acm/contest/142/J这题竟然卡memset.. 一开始t了以为数组开小了 就往大了搞..首先是判矛盾 如果i位置上的一个数ary[i] 本来应该在ary[i]%n=j处 那j到i之间肯定不能有负数 前缀和判断一下如果暂时没矛盾 那就将从j到i-1的位置都向i连一条边 因为ary[i]这个数会出现在i这个位置就是因为j到i-...原创 2018-07-29 14:52:37 · 256 阅读 · 0 评论 -
Dirt Ratio HDU - 6070
http://acm.hdu.edu.cn/showproblem.php?pid=6070题目要求区间颜色数与区间长度的最小比二分这个最小比值 但是怎么决定下一步是向左还是向右是关键设区间颜色数为size(l,r) 那么我们就看是否存在这样一个区间满足size(l,r)/(r-l+1)<=m m是二分枚举的答案这个式子化简得 size(l,r)+l*m<=(r+1)*...原创 2018-07-29 10:44:38 · 176 阅读 · 0 评论 -
Blue Mary开公司 HYSBZ - 1568
https://www.lydsy.com/JudgeOnline/problem.php?id=1568李超线段树模板博客https://blog.csdn.net/flere825/article/details/76283734#include <cstdio>#include <cstring>#include <algorithm>...原创 2018-07-28 23:08:51 · 200 阅读 · 0 评论 -
Play With Sequence HDU - 3971
http://acm.hdu.edu.cn/showproblem.php?pid=3971又学到了新姿势 居然还能每隔一段时间排个序...通过维护区间最大最小值来剪枝 但肯定不够如果一个数列是有序的 那这样维护区间最值 就相当于维护区间端点了 从而有logn得复杂度 所以可以每隔一定循环次数就把数列排序重新建树#include <bits/stdc++.h>usi...原创 2018-07-24 08:37:47 · 225 阅读 · 0 评论 -
Gorgeous Sequence HDU - 5306
http://acm.hdu.edu.cn/showproblem.php?pid=5306和hysbz4355一样 维护最大最小值来剪枝#include <bits/stdc++.h>using namespace std;#define N 0x3f3f3f3f3f3f3f3f#define ll long longstruct node{ ...原创 2018-07-22 12:40:22 · 190 阅读 · 0 评论 -
Play with sequence HYSBZ - 4355
https://www.lydsy.com/JudgeOnline/problem.php?id=4355第二问要取最大值不好处理 一开始想的是只有当前区间所有数都一样时才进行加操作 WA...应该是T啊...看了正解 感觉时间复杂度很玄学 首先根据题意发现 如果区间内有零存在 那一定是以最小值的形式存在 所以要记录最小值及其数量 通过维护区间最小和次小值来剪枝具体看这篇博客https...原创 2018-07-21 10:05:39 · 374 阅读 · 0 评论 -
GCD HDU - 5930
http://acm.hdu.edu.cn/showproblem.php?pid=5930先预处理出整个区间有多少个gcd 统计每个gcd出现多少次然后还有一个巧妙的地方就是 对每个把tar位置的数改为val的修改 把[1,tar]和[tar,n]这左右边各有多少gcd值不同的以tar为右左端点的区间找出并记下来 因为这些区间数量很少 所以用两层for循环处理 对于一个gcd的出现次数 ...原创 2018-07-20 11:44:26 · 342 阅读 · 0 评论 -
Stars in Your Window POJ - 2482
http://poj.org/problem?id=2482和hdu5091基本一样 做法也差不多但是叶节点的选择不太一样 if(l+1==r) return;这道题要求如果星星在边框上就不算 所以肯定不能把边框对齐某个星星 而应该介于两颗星星之间的那个线段上#include <cstdio>#include <cstring>#include <...原创 2018-07-17 09:33:14 · 219 阅读 · 0 评论 -
Beam Cannon HDU - 5091
http://acm.hdu.edu.cn/showproblem.php?pid=5091把所有点的纵坐标打入到x轴上的对应位置上 然后双指针i-w-1和i向后扫过去 一个减一个加减或加指的就是 假设该点纵坐标为y 矩形高度为h 就将[Y,Y+H]区间的最大值减或加1 然后用tree[1].val更新答案这时线段树每个叶子节点维护的值的含义就不再是对应高度有多少个点了 而是将给定矩形...原创 2018-07-16 22:26:34 · 158 阅读 · 0 评论 -
Interesting Array CodeForces - 483D
点击打开链接要求一个区间内的数相与等于一个值 那就是说这个值的某个二进制位如果是1 那这个区间内所有数对应为都要是1 即对区间内每一个数都做或运算 线段树维护一下 如果是0 那这个区间内所有数对应为至少有一个0 不用管q次都更新完以后 再统一把每个区间都查询一下 看是否和一开始给定的值一样 不一样则说明有矛盾#include <bits/stdc++.h>using n...原创 2018-07-15 15:33:08 · 178 阅读 · 0 评论 -
DZY Loves Colors CodeForces - 445E
点击打开链接线段树剪枝 当区间内只有一种颜色时才进行更新 虽然乍一看对复杂度不是很好 仔细想想 虽然每次把一段区间染成同一种颜色 但以后再访问这一段里的区间时就可以直接返回#include <bits/stdc++.h>using namespace std;#define ll long longstruct node{ int l; int r;...原创 2018-07-14 21:59:29 · 256 阅读 · 0 评论 -
Typeface Design HihoCoder - 1074
点击打开链接第一个和最后一个数是必须要标记的 这就是一个突破口 然后找区间[2,n-1]的最小值是否小于第一与最后一个数的最小值 若小于的话则该数必须要标记 然后从该数的位置将区间一分为二 否则查最大值是否大于第一与最后一个数的最大值这样走的每一步都是基于当前情况的必然选择 且是唯一正确选择#include <bits/stdc++.h>using namespace ...原创 2018-07-14 08:52:53 · 146 阅读 · 0 评论 -
Mobile phones POJ - 1195
点击打开链接模板题 区间更新点查询#include <cstdio>#include <cstring>#include <algorithm>using namespace std;int sum[5010][5010];int n;void pushupy(int curx,int cury){ sum[curx][cur...原创 2018-06-06 20:26:35 · 226 阅读 · 0 评论 -
Luck and Love HDU - 1823
点击打开链接点更新区间查询模板 但有两个坑1 左右端点大小未定 需要判断 这个已经见怪不怪2 精度问题 要用float#include <cstdio>#include <map>#include <cstring>#include <algorithm>using namespace std;float maxx[81...原创 2018-06-06 10:57:40 · 231 阅读 · 0 评论 -
The Bakery CodeForces - 834D
点击打开链接状态转移方程: dp[i][j]=max(dp[i-1][k]+sum[j]-sum[k]) 复杂度为k*n*n但是求最大值这个过程可以用线段树来优化要查询一个区间有多少种颜色 先处理处每个位置i的左边最近的同色位置在哪 记为left[i] 然后对[left[i]+1,i]这个区间加一 因为再靠左的区间已经有另一个同色发挥作用了 没必要再更新#include <...原创 2018-06-05 12:17:56 · 209 阅读 · 0 评论 -
Propagating tree CodeForces - 384E
点击打开链接思维水题 每个区间维护两个值 一个是来自偶数层节点的累加值 另一个是来自奇数层节点的累加值因为是单点查询 pushup和pushdown都扔掉就 一路加到底即可#include <bits/stdc++.h>using namespace std;struct node1{ int v; int next;};struct nod...原创 2018-06-03 21:40:36 · 234 阅读 · 0 评论 -
Three displays CodeForces - 987C
点击打开链接基于s值建立线段树从左到右 对于i 利用线段树维护 [1,i-1] 范围内 s值比s[i]小的元素中c值最小的是多少 再从右到左跑一遍似乎dp也可以写 只是复杂度要高许多#include <bits/stdc++.h>using namespace std;#define ll long long#define N 0x3f3f3f3f3f3f3f3...原创 2018-06-01 21:33:07 · 230 阅读 · 0 评论 -
加农炮 51Nod - 1287 + 扔盘子 51Nod - 1279
点击打开链接点击打开链接线段树维护区间最大/最小值 然后可以二分找到第一个大于等于/小于给定高/宽度的位置1287数据有问题 暴力比线段树跑得都快。。1279利用单调性二分也可以 代码就不贴了51nod 1287#include <bits/stdc++.h>using namespace std;struct node{ int l; ...原创 2018-06-01 09:56:49 · 156 阅读 · 0 评论 -
Get The Treasury HDU - 3642
点击打开链接枚举立方体高度 然后对每一层求三次交的面积#include <bits/stdc++.h>using namespace std;#define ll long longstruct node1{ int x1; int y1; int z1; int x2; int y2; int z2;};str...原创 2018-05-23 10:29:20 · 261 阅读 · 0 评论 -
Transformation HDU - 4578
点击打开链接维护一次幂二次幂三次幂的三个区间和 再维护乘法加法赋值的三个lazy标记几个幂次和之间是有公式的 如图而lazy标记的使用也需要技巧首先赋值的优先级最高 只要赋值操作 其他两种操作直接舍弃 而加法和乘法虽然优先级一样 但是乘法操作不止影响乘法lazy 也影响加法lazy 具体见代码 #include <bits/stdc++.h>using ...原创 2018-05-21 21:19:33 · 319 阅读 · 0 评论 -
Doom HDU - 5239
点击打开链接题目给的这个模数很神奇 其实是2^63-2^31这个值 找规律发现 在摸这个数的前提下 对任何一个数平方运算不超过30次就变为一个恒定值 就可以用剪枝搞一搞 类似于开根号的题型 难在找规律#include <cstdio>#include <cstring>#include <algorithm>using namespace std...原创 2018-05-15 13:16:57 · 328 阅读 · 0 评论 -
In Touch HDU - 5361
点击打开链接当一个点要和一个连续区间内的所有点连权值相同的边时 可以用线段树来优化这个过程 就和区间更新一样的还有要注意的就是内存对齐问题 node1结构体中的 ll w 如果放在中间的位置就会MLE 具体什么是内存对齐问题就不说了 自行百度#include <cstdio>#include <queue>#include <cstring>...原创 2018-05-14 09:40:13 · 170 阅读 · 0 评论 -
最小正子段和 51Nod - 1065
点击打开链接一 线段树一个子段肯定是由两个前缀做差相得 那么对于每一个前缀 就看它前边比它小的最大的前缀 做差取最大值 线段树维护一下#include <bits/stdc++.h>using namespace std;#define ll long long#define N 0x3f3f3f3f3f3f3f3fstruct node{ int l...原创 2018-05-07 23:37:14 · 153 阅读 · 0 评论 -
Calculate the Function ZOJ - 3772
点击打开链接通过题目给的递推公式 可以的出其矩阵形式 然后就是求某一区间的矩阵乘积 线段树或者rmq都可以解也可以只维护一个前缀积 然后求矩阵的逆#include <bits/stdc++.h>using namespace std;#define ll long long#define M 1000000007struct node{ int l;...原创 2018-04-27 08:20:50 · 182 阅读 · 0 评论 -
Lazy Salesgirl ZOJ - 3606
点击打开链接先把每个人按其与之前一个人的时间差排序 然后更新线段树对应时间点的位置 因为当前时间间隔比之前的都长 那之前的肯定也都满足关键之怎么处理 123123... 这个问题 对每一个区间开四个变量 分别记录该区间内第一个人买一个两个三个时区间的总价值以及 总人数 pushup时通过左区间人数确定与右区间哪个变量想加 这样就有了满足区间加法的性质#include <cstd...原创 2018-04-25 09:09:02 · 198 阅读 · 0 评论 -
Subpalindromes URAL - 1989
点击打开链接每次修改字符串中的一个字符 然后问某个区间是否为回文串 这个要用的多项式哈希 在这里就是把采字符串当做26进制数 然后比较从左至右 和从右至左的哈希值是否相等#include <bits/stdc++.h>using namespace std;#define ll unsigned long longstruct node1{ int l; ...原创 2018-04-20 08:48:00 · 224 阅读 · 0 评论 -
A Simple Task CodeForces - 558E
点击打开链接一个由26字母组成的字符串 每次对一个区间内的子串升序或降序排序 如果以字符串为基础建立线段树 真的是毫无头绪(或许这就是所谓的不满足区间加法吧) 但是26个字母很少 对每一个字母建立线段树是可行的 并且排序也可以考虑用基础排序来实现 这样时间空间都满足#include <bits/stdc++.h>using namespace std;struct no...原创 2018-04-19 14:00:23 · 237 阅读 · 0 评论 -
Road HDU - 5861
点击打开链接对每条路求出最早与最晚使用时间 记为l与r 然后在l加上花费 在r+1减去花费注意题目给的两个端点没有规定大小顺序!!!#include <bits/stdc++.h>using namespace std;#define N 0x3f3f3f3fstruct node1{ int l; int r; int minn; ...原创 2018-04-19 12:24:38 · 144 阅读 · 0 评论 -
线段树总结
线段树详解 By 岩之痕 目录:一:综述二:原理三:递归实现四:非递归原理五:非递归实现六:线段树解题模型七:扫描线八:可持久化 (主席树)九:练习题 一:综述假设有编号从1到n的n个点,每个点都存了一些信息,用[L,R]表示下标从L到R的这些点。线段树的用处就是,对编号连续的一些点进行修改或者统计操作,修改和统计的复...转载 2018-04-18 21:51:50 · 420 阅读 · 0 评论 -
Digits Count FZU - 2105
点击打开链接数据量很小 [0,15] 四个二进制位 每一位对应一颗线段树 然后就是对每一位进行区间更新与查询#include <cstdio>#include <cstring>#include <algorithm>using namespace std;#define N 0x3f3f3f3fstruct node{ int ...原创 2018-04-13 11:39:39 · 146 阅读 · 0 评论