随笔分类 - 数据结构--线段树
摘要:"传送门" 解题思路 推了推式子发现是个二维数点,想了想似乎排序加线段树难写,就写了个树套树,结果写完看见空间才$128M$。。各种奇技淫巧卡空间还是$MLE$到天上。后来只好乖乖的写排序+线段树。做法就是把式子写出来,然后把绝对值分类讨论成四种情况,发现这就是二维数点,然后讨论每种情况排序算最小值
阅读全文
摘要:"传送门" 解题思路 可以离线,然后确定每个边的出现时间,算这个排序即可。然后就可以线段树分治了,连通性用并查集维护,因为要撤销,所以要按秩合并,时间复杂度$O(nlog^2 n)$ 代码 cpp include include include include include include usi
阅读全文
摘要:"传送门" 解题思路 出题人真会玩。。操作$2$线段树合并,然后每棵线段树维护元素个数和。对于$6$这个询问,因为乘积太大,所以要用对数。时间复杂度$O(nlogn)$ 代码
阅读全文
摘要:"传送门" 解题思路 以每个颜色为根开一棵权值线段树,下标就是$dfs$序,其余都是基本操作,要动态开点。 代码 cpp include include include include include using namespace std; const int N=100005; const in
阅读全文
摘要:解题思路 对于一段区间考虑每条边的贡献,即$ans=\sum\limits_{i=l}^{r 1}(i l+1) (r i) w(i)$,把这个暴力展开,得到一个关于$i$的多项式,然后发现只需要维护$\sum a(i)$,$\sum a(i) i$和$\sum a(i) i^2$,线段树维护即可。
阅读全文
摘要:"传送门" 解题思路 遇到这种选区间的题,很多时候都是枚举左端点,然后计算右端点。考虑枚举左端点之后如何维护,设下一部和$i$这个位置的电影相同的为$nxt[i]$,那么如果左端点从$i$移动到$i+1$,$[i+1,nxt[i] 1]$这段区间会减少$w[f[i]]$,而$[nxt[i],nxt[
阅读全文
摘要:"传送门" 解题思路 首先按照每个修改时$x$的深度$+d$从大到小排序,然后按照深度分层,一层一层的修改,修改的时候就直接暴力修改子树,然后每做完一层把答案都取下来,因为以后的所有修改的深度都小于当前层,也就是无法对当前层的节点造成贡献。 代码 cpp include include includ
阅读全文
摘要:"传送门" 解题思路 比较有意思的一道题。首先要把求$\sum\limits_{i=l}^r dep[lca(i,z)]$这个公式变一下。就是考虑每一个点的贡献,做出贡献的点一定在$z$到根节点的路径上,对于$x$这个点,它的贡献就是区间$[l,r]$与$z$的$lca$在它下方的个数。那么就可以将
阅读全文
摘要:题面 escription 黑客们通过对已有的病毒反编译,将许多不同的病毒重组,并重新编译出了新型的重组病毒。这种病毒的繁殖和变异能力极强。为了阻止这种病毒传播,某安全机构策划了一次实验,来研究这种病毒。 实验在一个封闭的局域网内进行。局域网内有n台计算机,编号为1~n。一些计算机之间通过网线直接相
阅读全文
摘要:"传送门" 解题思路 前两个操作都比较基础。对于第三个操作分类讨论一下,首先如果当前根不是要操作点的子树,那么就无影响,直接查询操作点的子树即可。第二种是当前根是操作点的子树,那就找到当前根到操作点这条链的顶端(也就是操作点的儿子,这个儿子为当前根的祖先),然后将这块连续的$dfs$序挖掉,查询两边
阅读全文
摘要:"传送门" 解题思路 线段树打标记,刚开始想复杂了,维护了四个标记。后来才知道只需要维护一个最大值最小值即可,然后更新的时候分类讨论一下。 代码 cpp include include include include using namespace std; const int MAXN = 200
阅读全文
摘要:"传送门" 解题思路 大概就是一个数很少次数的开方会开到$1$,而$1$开方还是$1$,所以维护一个和,维护一个开方标记,维护一个区间是否全部为$1/0$的标记。然后每次修改时先看是否有全$1$或$0$的标记,有就不用理了,没有就暴力开方。 代码
阅读全文
摘要:传送门 解题思路 区间加等差数列+单点询问,用差分+线段树解决,线段树里维护的就是差分数组,区间加等差数列相当于在差分序列中l位置处+首项的值,r+1位置处-末项的值,中间加公差的值,然后单点询问就相当于在差分数列中求前缀和。 #include<iostream> #include<cstdio>
阅读全文
摘要:传送门 解题思路 记得当时考试我还是个孩子,啥也不会QAQ。现在回头写,用动态开点的线段树,在每行和最后一列开线段树,然后对于每次询问,把x行y列的删去,然后再把x行m列的元素加入x行这个线段树,然后再把删去元素加到最后一列里,用一个vector维护变化后的标号。 代码 #include<iostr
阅读全文
摘要:传送门解题思路扫了一眼觉得是贪心+线段树,结果贪心的时候刚开始按区间长度排的序。。这还有82分,后来叉了自己,换成按右端点排序过了。代码#include#include#include#include#includeusing namespace std;c...
阅读全文
摘要:传送门解题思路正解好像是什么前缀和+二分,没想到。。就写了个线段树骗分,结果擦着边过了??线段树中维护一个区间和 and 最小值即可。代码#include#include#include#includeusing namespace std;const in...
阅读全文
摘要:1858: [Scoi2010]序列操作 Time Limit: 10 Sec Memory Limit: 64 MB Submit: 3397 Solved: 1624 [Submit][Status][Discuss] Descriptionlxhg...
阅读全文
摘要:传送门解题思路和GSS1相似,但需要巨恶心的分类讨论,对于x1#include#include#includeusing namespace std;const int MAXN = 10005;inline int rd(){ int x=0,f=1...
阅读全文
摘要:Time Limit: 10 Sec Memory Limit: 256 MB Submit: 3287 Solved: 1549 [Submit][Status][Discuss] Description 小A的楼房外有一大片施工工地,工地上有N栋待...
阅读全文
摘要:题目描述给出了序列A[1],A[2],…,A[N]。 (a[i]≤15007,1≤N≤50000)。查询定义如下: 查询(x,y)=max{a[i]+a[i+1]+…+a[j];x≤i≤j≤y}。 给定M个查询,程序必须输出这些查询的结果。输入输出格式输入格...
阅读全文

浙公网安备 33010602011771号