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

摘要:Pro: https://codeforces.com/gym/102028/problem/H Sol: 用SAM枚举不同子串后 问题转换为下面这个形式 q组询问 每次询问包含l,r,x三个参数,求下式 i=lrmax(i,x) 这个东西是个套路题 离线+ 阅读全文
posted @ 2020-12-30 05:43 Creed-qwq 阅读(136) 评论(0) 推荐(0) 编辑
该文被密码保护。
posted @ 2020-10-27 14:52 Creed-qwq 阅读(6) 评论(0) 推荐(0) 编辑
摘要:Pro: Sol: 有这样一个性质:一个1开头的1、2序列可以用区间和表示出1~s[n]的所有数字 #include<bits/stdc++.h> #define N 2200000 #define eps 1e-7 #define inf 1e9+7 #define db double #defi 阅读全文
posted @ 2020-10-20 18:06 Creed-qwq 阅读(164) 评论(0) 推荐(0) 编辑
摘要:ZJOI2019最水的一道题,考场上想出了正解却死活调不出来。。 然后就一直咕到了现在(逃 题目求的那个东西可以转化为这样一个东西。 有一些操作,你可以决定每个操作是否执行,动态查询所有可能的情况中线段树上权值为1的节点个数的总和。 然后很自然的(虽然看起来有点奇怪,但真的就很自然的能想到!)想到把 阅读全文
posted @ 2019-04-27 22:57 Creed-qwq 阅读(130) 评论(0) 推荐(0) 编辑
摘要:很像LNOI 2014 LCA那道题。 同样的套路,离线以后直接扫描线。 k=1的话就是原题。 考虑一般情况。 原本的做法是对x到根的这条链做一下区间+1操作,目的是为了是的在深度为i的位置得到的贡献是i。 因此,我们只需要构造出一个任意一个位置都满足前缀和为i^k的序列即可。 然后每次把这个序列加 阅读全文
posted @ 2019-04-25 20:24 Creed-qwq 阅读(227) 评论(0) 推荐(0) 编辑
摘要:题目的含义可以看做是以权值为下标的一些柱子,每个柱子的高度就是这个权值的出现的次数。 然后把这些柱子向左推倒,一个高度为h的柱子的影响范围为i−h+1∼i。 那么答案就是查询1∼n的这段区间没有被覆盖的点的个数。 因为所有没有被覆盖的位置都需要且可以通过一次更改使得能被推倒。 考虑线段树维护这个东西 阅读全文
posted @ 2019-04-25 07:45 Creed-qwq 阅读(142) 评论(0) 推荐(0) 编辑
摘要:注意,题意的意思是已经有了一些椅子。 如果要加椅子的话,显然每次加入的椅子都应该是可以和任何一个人匹配的椅子。(即位置为1或者m) 考虑最少需要加入的椅子数量。 根据霍尔定理,假设现在有一个集合|s|和它的连边集合|t|。 如果|s| |t|=k的话,我们至少需要加k把椅子才能满足条件。 因此,最少 阅读全文
posted @ 2019-04-08 21:51 Creed-qwq 阅读(362) 评论(0) 推荐(0) 编辑
摘要:https://loj.ac/problem/6062 直接套用霍尔定理。 由于A有多个选择,考虑维护B是否合法。 首先B数组的顺序显然是没有用的,可以直接排序。 然后每个A就都变成了向一个后缀连边。 对于B,原本需要check每一个集合是否满足|u|=0 因此,只需要维护F【i】 的最小值即可。 阅读全文
posted @ 2019-04-08 21:07 Creed-qwq 阅读(276) 评论(6) 推荐(0) 编辑
摘要:https://www.luogu.org/problemnew/show/P4384 容斥一下考虑计算切两刀使得三个串都不存在的s[l,r]的方案数。 分类讨论一下。 1.有三个互不相交的目标串 此时显然无解。 2.最左边的目标串和最右边的目标串相交 画一下图可以发现。 答案是一个sigema ( 阅读全文
posted @ 2019-03-21 09:03 Creed-qwq 阅读(116) 评论(0) 推荐(0) 编辑
摘要:这是一种经典的单调栈+线段树的维护方法。 从左到右枚举右端点。 线段树维护每一个左端点的max(+ or )min的值。 每次右端点移动的时候,把a[i]加入单调栈。 每弹栈一次,便在线段树上把对应弹掉的区间加上a[i] a[s[top]]。 时间复杂度是均摊O(nlogn)的。 阅读全文
posted @ 2019-03-12 06:55 Creed-qwq 阅读(215) 评论(0) 推荐(0) 编辑
摘要:先把所有询问离线一下。 从右向左枚举左端点,线段树维护每一个右端点的答案。 (这里的每一个右端点包含的答案只包括以它为右端点的当前最小的差值) 因此对于询问l,r,应该查询线段树l,r的区间最小值。 每次左端点移动的时候,暴力的做法是直接for过去更新每一个位置。 考虑怎么优化。 先考虑更新比左端点 阅读全文
posted @ 2019-03-11 23:13 Creed-qwq 阅读(213) 评论(0) 推荐(0) 编辑
摘要:考虑维护出每一个点左边第一个比它大的位置,右边同理,这样有一个合法区间。 然后对询问离线,由于要求只包含区间内的贡献,扫描线+线段树解决。 T1 http://codeforces.com/problemset/problem/1117/G 考虑一下笛卡尔树,然后分析出答案等于这个区间形成的笛卡尔树 阅读全文
posted @ 2019-02-23 15:48 Creed-qwq 阅读(473) 评论(0) 推荐(0) 编辑
摘要:考虑最大流=最小割 不妨把a到a的边称为a类边,b到b的称为b类边,a到b的称为c类边。 显然,答案一定是由最多1条a和最多一条b以及一些c组成的。 只有a是会变的,也就是说每个a对应了唯一的最优的b和c。 因此可以先求一下每个a对应的最优的b和c。 分析一下可得,a,b确定后,c应该是所有满足xb 阅读全文
posted @ 2019-01-26 13:58 Creed-qwq 阅读(227) 评论(0) 推荐(0) 编辑
摘要:首先只有询问的话就是个WC的题,线性基+生成树搞一搞就行。 进一步,考虑如果修改操作只有加边怎么做。 好像也没有什么变化,只不过需要在线地往线性基里插入东西而已。 删边呢? 注意到线性基这个玩意是不支持删除操作的。 对于这种不好删除的的东西有种不错的解决方法,就是线段树分治。 把每个操作劈成logn 阅读全文
posted @ 2019-01-19 00:19 Creed-qwq 阅读(186) 评论(0) 推荐(0) 编辑
摘要:https://www.lydsy.com/JudgeOnline/problem.php?id=3413 显然答案等于模式串si和模板串的每一个后缀的匹配长度之和。 这里忽略了匹配成功的情况,那种情况只需要额外特判一些东西。 显然可以用线段树合并维护出right集合。 按照要求查询即可。 cpp 阅读全文
posted @ 2019-01-04 21:42 Creed-qwq 阅读(136) 评论(0) 推荐(0) 编辑
摘要:题面 https://www.lydsy.com/JudgeOnline/problem.php?id=1396 首先,对于题目所说的T在S中只出现一次这个要求, 可以利用后缀自动机的parent树的叶子节点的性质来满足要求。 显然所有满足T在S中只出现过一次的子串就是parent树所有叶子节点的r 阅读全文
posted @ 2018-12-20 14:14 Creed-qwq 阅读(125) 评论(0) 推荐(0) 编辑
该文被密码保护。
posted @ 2018-12-03 00:37 Creed-qwq 阅读(20) 评论(0) 推荐(0) 编辑
摘要:记'1'为+1,'0'为 1; 可以发现 pre[i],suf[i]分别为前/后缀和 a[i]=max(pre[l.....i]); b[i]=max(suf[i+1....r]); ans=max(a[l]+b[l],a[l+1]+b[l+1],........a[r]+b[r]); 即ans=最 阅读全文
posted @ 2018-11-25 16:34 Creed-qwq 阅读(180) 评论(0) 推荐(0) 编辑
摘要:满足这两个性质的问题可以用线段树解决 1.一个区间[l,r]的答案可以由[l,mid],[mid+1,r]的答案推出来 2.区间修改对答案造成的影响可以快速的计算出来 阅读全文
posted @ 2018-11-25 15:56 Creed-qwq 阅读(374) 评论(0) 推荐(0) 编辑

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