随笔分类 - 数据结构 - 可持久化数据结构
摘要:这题看上去没有任何思路,不妨考虑暴力: 先求对于 $i \leqslant j$ 且 $a_{i} > a_{j}$ 的 $min(a_{i}-a_{j}).$. 对于 $a_{i} < a_{j}$ 的情况将序列中的数乘上-1再求一遍即可. 考虑将询问离线,枚举右端点,那么 $i$ 能贡献到 $a
阅读全文
摘要:今年省选考了这个技巧,感觉之前没做过类似的题的话现场挺难想出来的. 我们发现对 1 个数 +1 可以看作从低到高位的第一个 0 修改成 1,该 0 后面的 1 修改成 0. 将一个节点的所有儿子对应的数放到该节点对应的 01 trie 中进行修改的话就是将 0,1 翻转. 翻转后走 0 那边,然后递
阅读全文
摘要:对于一类带修改问题可以采用对时间(操作)分块,然后定期重构的方式来维护. 设块的大小为 $B$,则重构 $\frac{Q}{B}$ 次,每次查询的复杂度为 $O(B \log n)$. 计算一下 $B$ 的大小来平衡重构和查询的复杂度即可. 这种纯数据结构题都挺好写的. 时间复杂度要计算好,块的大小
阅读全文
摘要:没调完呀,感觉代码能力还是有待提高...... 写代码一定要讲究结构 + 逻辑性. 如果结构或者逻辑性不好的话是非常非常遭罪的 QAQ...... upd:好像调了 5 分钟就过了 这个问题等价于求:$x$ 能到达一个点集, $y$ 也能到达一个点集,这两个点集是否有交集 ? 由于是否到达只有边权最
阅读全文
摘要:后缀自动机的做法很显然:建出后缀树,线段树合并,然后倍增的时候更新答案就行. 后缀数组的做法也挺显然:二分答案,然后用主席树判定一下 $[a,b-mid+1]$ 是否有值即可. code: #include <bits/stdc++.h> #define N 200006 #define lson
阅读全文
摘要:如果做过软件开发,餐巾计划问题的话这题就秒切了. 还是类似的套路:借流思想. 正解的话就是无聊地上一个主席树优化建图就行. 维护一颗边权为正数地主席树,再维护一颗边权为负数的主席树就行. 主席树写了,感觉好恶心...... code: #include <bits/stdc++.h> #define
阅读全文
摘要:思路自然的码农题. 显然分类讨论一下编号在 $[l,r]$ 的点与 $p$ 的子树关系. 如果都在 $p$ 的子树内就是个区间 $lca$. 否则,就二分第一个满足 $p$ 的祖先且子树内部没有 $[l,r]$ 之间的点. 二分验证的话要用主席树. code: #include <cstring>
阅读全文
摘要:这个题的思路还是十分巧妙的. 我们发现我们要查询的区域恰好构成了一个梯形. 然后用那个单调栈去维护折线,并用主席树做二维数点. code: #include <cstdio> #include <algorithm> #include <stack> #include <cstring> #incl
阅读全文
摘要:对与每一个时刻用主席树维护一下 DFS 序即可. LCA 的话树剖求解比较快. code: #include <cstdio> #include <string> #include <cstring> #include <algorithm> #define N 200006 using names
阅读全文
摘要:可持久化非旋转treap,真的是又好写又好调 ~ code: #include <cstdio> #include <cstdlib> #include <algorithm> #define N 500007 #define lson t[x].ls #define rson t[x].rs #d
阅读全文
摘要:Description 影魔,奈文摩尔,据说有着一个诗人的灵魂。事实上,他吞噬的诗人灵魂早已成千上万。千百年来,他收集了各式各样 的灵魂,包括诗人、牧师、帝王、乞丐、奴隶、罪人,当然,还有英雄。每一个灵魂,都有着自己的战斗力,而影魔,靠 这些战斗力提升自己的攻击。奈文摩尔有 n 个灵魂,他们在影魔宽
阅读全文
摘要:这个思路挺有意思的 ~ 利用树链的并来保证每个颜色只贡献一次,然后用可持久化线段树维护 code: #include <set> #include <cstdio> #include <cstring> #include <algorithm> #define N 100005 #define se
阅读全文
摘要:感觉这个线段树分治和整体二分几乎相同啊~ code: #include <bits/stdc++.h> #define MAX 100300 #define ll long long #define lson now<<1 #define rson now<<1|1 #define setIO(s)
阅读全文
摘要:和超级钢琴,异或之三倍经验 $?$ 堆+贪心素质三连 $?$ 好无聊...... code: #include <bits/stdc++.h> #define N 500006 #define ll long long #define setIO(s) freopen(s".in","r",stdi
阅读全文
摘要:和超级钢琴几乎是同一道题吧... code: #include <bits/stdc++.h> #define N 200006 #define ll long long #define setIO(s) freopen(s".in","r",stdin) , freopen(s".out","w"
阅读全文
摘要:思路倒是不难,但是这题卡常啊 ~ code: #include <bits/stdc++.h> #define N 2000004 #define M 1000005 #define SIZE 2000005 #define setIO(s) freopen(s".in","r",stdin) us
阅读全文
摘要:开始想了一个二分+可持久化trie验证,比正解多一个 log 仔细思考,你发现你可以直接按位枚举,然后在可持久化 trie 上二分就好了. code: #include <bits/stdc++.h> #define N 700005 #define setIO(s) freopen(s".in",
阅读全文
摘要:强行把序列问题放树上,好无聊啊~ code: #include <bits/stdc++.h> #define N 200005 #define setIO(s) freopen(s".in","r",stdin) using namespace std; int tot,edges,tim; in
阅读全文
摘要:这个是真——可持久化字典树..... code: #include <bits/stdc++.h> #define N 100006 #define setIO(s) freopen(s".in","r",stdin) using namespace std; int n,edges,Q,tot;
阅读全文
摘要:链表这个东西非常好用啊 ~ code: #include <bits/stdc++.h> #define N 50010 #define inf 2000400000 #define setIO(s) freopen(s".in","r",stdin) using namespace std; in
阅读全文

浙公网安备 33010602011771号