Processing math: 100%

随笔分类 -  数据结构之线段树

摘要:题意:给你一个子串,m次询问,每次给你abcd,问你子串sa b的所有子串和子串sc d的最长公共前缀是多长 题解:首先要求两个子串的最长公共前缀就是把反过来插入变成最长公共后缀,两个节点在parent树上的lca就是最长公共后缀.找到某个子串就是在parent树上倍增 我们先二分答案,问题就变成了 阅读全文
posted @ 2019-04-12 09:31 walfy 阅读(242) 评论(0) 推荐(0) 编辑
摘要:题意:给一个初始串s,和m个模式串,q次查询每次问你第l到第r个模式串中包含slsr子串的最大数量是多少 题解:把初始串和模式串用分隔符间隔然后建sam,我们需要找到在sam中表示slsr子串的状态节点(先找到sr对应的节点,然后倍增parent树即可),我们需要找到包含$ 阅读全文
posted @ 2019-04-07 13:42 walfy 阅读(148) 评论(0) 推荐(0) 编辑
摘要:题意:每个节点有个值,求每个节点子树众数和 题解:可线段树合并,维护每个数出现次数和最大出现次数,以及最大出现次数的数的和 // pragma GCC optimize(2) // pragma GCC optimize(3) // pragma GCC optimize(4) // pragma 阅读全文
posted @ 2018-11-13 17:24 walfy 阅读(148) 评论(0) 推荐(0) 编辑
摘要:题意:给出一个长度为 n的数列 a和一个长度为 m 的数列 b,求 a有多少个长度为 m的连续子数列能与 b匹配。两个数列可以匹配,当且仅当存在一种方案,使两个数列中的数可以两两配对,两个数可以配对当且仅当它们的和不小于 h。 题解:先把b排序,要想能匹配,由hall定理,b的每个子集(大小为x)都 阅读全文
posted @ 2018-10-30 15:09 walfy 阅读(282) 评论(0) 推荐(0) 编辑
摘要:题意:给你n个数,1,查询区间和,2,把区间每个数开根 题解:可以发现1e9开5次根就变成1了,所以不用lazy直接暴力更新到叶子节点即可,当这个区间每个数都是0或1就不用下传了, / Problem: 3211 User: walfy Language: C++ Result: Accepted 阅读全文
posted @ 2018-08-08 10:15 walfy 阅读(264) 评论(0) 推荐(0) 编辑
摘要:题意:有一棵树,对于每个点求子树中离他深度最多的深度是多少, 题解:线段树合并快如闪电,每个节点开一个权值线段树,递归时合并即可,然后维护区间最多的是哪个权值,到x的深度就是到根的深度减去x到根的深度复杂度O(nlogn) // pragma comment(linker, "/stack:2000 阅读全文
posted @ 2018-07-19 23:32 walfy 阅读(170) 评论(0) 推荐(0) 编辑
摘要:永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 n 来表示。某些岛之间由巨大的桥连接,通过桥可以从一个岛 到达另一个岛。如果从岛 a 出发经过若干座(含 0 座)桥可以到达岛 b,则称岛 a 和岛 b 是连 通的。现在有 阅读全文
posted @ 2018-06-05 19:18 walfy 阅读(149) 评论(0) 推荐(0) 编辑
摘要:老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成。 有长为N的数列,不妨设为a1,a2,…,aN 。有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2)把数列中的一段数全部加一个值; (3)询问数列中的一段数的和,由于答案可能很大,你只需输出这个数模P的值。 题解:维护两种 阅读全文
posted @ 2018-06-03 20:13 walfy 阅读(187) 评论(0) 推荐(0) 编辑
摘要:https://www.lydsy.com/JudgeOnline/problem.php?id=1012 现在请求你维护一个数列,要求提供以下两种操作:1、 查询操作。语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值。限制:L不超过当前数列的长度。2、 插入操作。语法:A 阅读全文
posted @ 2018-04-12 16:55 walfy 阅读(151) 评论(0) 推荐(0) 编辑
摘要:http://codeforces.com/contest/940 A水题 //#pragma comment(linker, "/stack:200000000") //#pragma GCC optimize("Ofast,no-stack-protector") //#pragma GCC t 阅读全文
posted @ 2018-04-11 20:33 walfy 阅读(153) 评论(0) 推荐(0) 编辑
摘要:给你n和k,n个数,每个数范围1e5,m次查询,每次查询区间(l,r),在区间中的每个数,如果超过k次只算k次,否则算原来的次数,求总次数,强制在线 解法:线段树维护区间中每个数经过k次到达的点pos,然后其中pos<=r的就是能满足条件的加到答案上即可 因为假设原来的点是x(l<=x<=r),经过 阅读全文
posted @ 2018-03-06 17:12 walfy 阅读(117) 评论(0) 推荐(0) 编辑
摘要:http://codeforces.com/contest/817/problem/F 无限长的数组,刚开始每一位是0,三种操作,1,把(l,r)之间不是1的变成1,2,把(l,r)之间不是0的变成0,3,把0变成1,1变成0,每次操作都要查询该数组的mex(最小的没有在集合中出现的数) 解法:很明 阅读全文
posted @ 2018-03-05 22:26 walfy 阅读(127) 评论(0) 推荐(0) 编辑
摘要:A:水题 //#pragma comment(linker, "/stack:200000000") //#pragma GCC optimize("Ofast,no-stack-protector") //#pragma GCC target("sse,sse2,sse3,ssse3,sse4,p 阅读全文
posted @ 2018-02-02 18:59 walfy 阅读(175) 评论(0) 推荐(0) 编辑
摘要:#include<map> #include<set> #include<list> #include<cmath> #include<queue> #include<stack> #include<vector> #include<cstdio> #include<cstring> #includ 阅读全文
posted @ 2018-01-25 16:49 walfy 阅读(209) 评论(0) 推荐(0) 编辑
摘要:链接 G:n个数,q次操作,把lr区间的x全部变成y,求操作完的结果 解法:线段树维护lazy标记,lazy标记开100倍,表示该节点指向的值,不用加value数组,最后的结果就是直接用叶子节点上的lazy标记修改值,lazy标记pushdown的时候直接对下一层的节点进行修改,时间复杂度O(n*l 阅读全文
posted @ 2018-01-23 12:06 walfy 阅读(195) 评论(0) 推荐(0) 编辑
摘要:http://codeforces.com/contest/915 A:水题 #include<bits/stdc++.h> #define fi first #define se second #define mp make_pair #define pb push_back #define pi 阅读全文
posted @ 2018-01-20 14:19 walfy 阅读(202) 评论(0) 推荐(0) 编辑
摘要:http://codeforces.com/contest/678 A:水题 #include<bits/stdc++.h> #define fi first #define se second #define mp make_pair #define pb push_back #define pi 阅读全文
posted @ 2018-01-16 14:23 walfy 阅读(185) 评论(0) 推荐(1) 编辑
摘要:想分块想了很久一点思路都没有,结果一看都是写的线段树= = 。。。完全忘记了还有线段树这种操作 题意:给一个数组,一种操作是改变l到r为c,还有一种操作是查询l到r的总和差 线段树记得+lazy标记 #include<bits/stdc++.h> #define fi first #define s 阅读全文
posted @ 2017-10-14 18:36 walfy 阅读(337) 评论(0) 推荐(0) 编辑
摘要:这题想了很久没思路,不知道怎么不sort维护二维的最小值 emmmm原来是线段树/树状数组,一维sort,二维当成下标,维护三维的最小值 #include<bits/stdc++.h> #define fi first #define se second #define mp make_pair # 阅读全文
posted @ 2017-09-28 13:49 walfy 阅读(216) 评论(0) 推荐(0) 编辑
摘要:可以转变成上一题(hdu1542)的形式,把每条线段变成宽为1的矩形,求矩形面积并 要注意的就是转化为右下角的点需要x+1,y-1,画一条线就能看出来了 #include<bits/stdc++.h> #define pi acos(-1.0) #define ll long long #defin 阅读全文
posted @ 2017-08-18 18:23 walfy 阅读(231) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示