随笔分类 -  数据结构--莫队

摘要:SP10707 COT2 - Count on a tree II 树分块树上莫队。 树上路径数颜色,在线树分块+bitset,离线可以树分块莫队。 于是我们现在来考虑具体怎么做。 首先树分块,分好了之后打上 \(dfn\) 序。 为什么要打 \(dfn\) 序呢?因为我们莫队排序的第二维不是要求是 阅读全文
posted @ 2021-04-23 23:26 __Anchor 阅读(58) 评论(0) 推荐(0)
摘要:P1903 [国家集训队]数颜色 / 维护队列 区间数颜色和单点修改。 可以树套树,但是不太会。 也可以考虑带修莫队,相当于就是多维护了一个时间轴。 排序方法变成先按块排序 \(l,r\) ,再按照 \(t\) 来排序即可。 单点修改里的 \(swap\) 很妙。 代码: #include<bits 阅读全文
posted @ 2021-04-21 20:54 __Anchor 阅读(79) 评论(0) 推荐(0)
摘要:SP3267 DQUERY - D-query 区间数颜色。 直接莫队就行了。 代码: #include<bits/stdc++.h> using namespace std; const int N=10000005,M=10000005; int read(){ int x=0,f=1;char 阅读全文
posted @ 2021-04-21 20:50 __Anchor 阅读(32) 评论(0) 推荐(0)
摘要:P1972 [SDOI2009]HH的项链 经典区间数颜色问题。 离线做法有树状数组和莫队,在线做法有主席树。 莫队做法十分暴力,直接维护每个数当前的 cnt 再在单点更新的时候更新答案即可。 树状数组做法: 对于每一个位置维护一个前缀位置 \(pre\),那么询问就相当于是询问区间多少个位置的 \ 阅读全文
posted @ 2021-04-21 20:49 __Anchor 阅读(84) 评论(0) 推荐(0)
摘要:P3901 数列找不同 询问一个区间的数是否互不相同。 直接莫队区间数颜色。 代码: #include<bits/stdc++.h> using namespace std; const int N=10000005,M=10000005; int read(){ int x=0,f=1;char 阅读全文
posted @ 2021-04-21 20:41 __Anchor 阅读(67) 评论(0) 推荐(0)
摘要:CF940F Machine Learning 首先显然可以直接树套树做,在权值线段树上二分即可。 但是这里数据 1e5 并且可以离线,我们可以想到直接莫队/值域分块来做。 那么直接带修莫队暴力维护即可。 代码: #include<bits/stdc++.h> const int M=1e5+5; 阅读全文
posted @ 2021-04-21 19:48 __Anchor 阅读(42) 评论(0) 推荐(0)
摘要:CF1514D Cut and Stick 找一下规律会发现答案就是 \(1\) 或者 \(2x-(r-l+1)\) 。 然后问题转化成为求区间众数个数。 可以直接用 P5048 [Ynoi2019 模拟赛] Yuno loves sqrt technology III 在线做或者用莫队离线做。 然 阅读全文
posted @ 2021-04-21 19:43 __Anchor 阅读(42) 评论(0) 推荐(0)
摘要:SP30906 ADAUNIQ - Ada and Unique Vegetable 带修莫队。 首先观察题面,然后数据范围一看带修莫队过不了,但这并不妨碍我们玄学起来。 于是这道题特征是“某一个值的出现次数”,再加上单点修改,显然可以使用带修莫队维护。 然后就没有了。 代码: #include<b 阅读全文
posted @ 2021-04-21 19:40 __Anchor 阅读(50) 评论(0) 推荐(0)
摘要:P5268 [SNOI2017]一个简单的询问 莫队+差分。 首先这里是两个区间,显然不好直接做,于是可以考虑差分,我们维护前缀区间,把柿子改写成四个答案组合起来。 这样改写出来的四个小答案都可以使用莫队来求,然后拼起来就行了。 代码: #include <bits/stdc++.h> using 阅读全文
posted @ 2021-04-21 19:37 __Anchor 阅读(110) 评论(0) 推荐(0)
摘要:P3604 美好的每一天 给定一个字符串,每次询问其一个子区间有多少个子区间重排后可以构成回文串。 我们思考“重排后构成回文串”的性质,即:所有字符的出现次数至多有一个奇数。 观察到“出现次数”以及可以离线以及数据范围,我们可以想到使用莫队来解决这个问题。 我们可以通过状压来表示每一个字符当前这个可 阅读全文
posted @ 2021-04-21 09:03 __Anchor 阅读(45) 评论(0) 推荐(0)
摘要:CF1000F One Occurrence 给定一个序列,询问区间内出现次数为 1 的数,输出任意一个。 很容易想到莫队,然后可以用一个 \(unordered_set\) 来维护,但是跑不过,于是我们可以考虑用一个栈来维护,也就是可以直接放到栈里,然后添加直接加,删除的话我们每次进去的时候会记录 阅读全文
posted @ 2021-04-20 23:39 __Anchor 阅读(51) 评论(0) 推荐(0)
摘要:CF351D Jeff and Removing Periods 首先需要想到的是一个结论: 对于一个区间,如果其存在某一个值的位置集合构成等差数列,那么这个区间的答案就是区间颜色个数,如果不存在(也就是说所有值的位置集合都不能构成等差数列),那么这个区间的答案就是区间颜色个数+1,原因显然。 正确 阅读全文
posted @ 2021-04-20 23:28 __Anchor 阅读(44) 评论(0) 推荐(0)
摘要:CF220B Little Elephant and Array 像这样对于出现次数有限定的计数,并且可以离线的问题,我们可以考虑莫队来做。 那么其实这道题想到莫队就很显然了,相当于每次我们直接看一下当前桶是不是等于其本身即可。 代码: #pragma GCC optimize("Ofast") # 阅读全文
posted @ 2021-04-20 22:54 __Anchor 阅读(40) 评论(0) 推荐(0)
摘要:CF877F Ann and Books 给定一个 01 序列,每次询问一个区间有多少个子区间其 1 的个数比 0 正好多 k 个,k 最初给定。 我们可以做一遍前缀和,询问就相当于是在问两个前缀和的差等于 k 的有序对个数。 于是我们每次单点修改的时候询问一下当前值 \(sum+k\) 或者 \( 阅读全文
posted @ 2021-04-20 22:51 __Anchor 阅读(62) 评论(0) 推荐(0)
摘要:CF86D Powerful array 数据范围 2e5 ,可以带根号的算法,同时没有要求强制在线,于是可以考虑莫队。 我们把每次单点变化的贡献写出来就可以直接维护了。 代码: #include<bits/stdc++.h> using namespace std; template <typen 阅读全文
posted @ 2021-04-20 22:45 __Anchor 阅读(45) 评论(0) 推荐(0)
摘要:P4135 作诗 每次询问一段区间中出现了偶数次的数有多少个。 可离线: 莫队。 直接暴力枚举每一个区间然后在每次加的时候判断一下即可。 强制在线: 分块。 和蒲公英很类似的处理办法,要预处理的有: 所以每次询问就相当于先找一下预处理的答案。然后枚举两个小块,然后枚举在这两个块中出现的每一个元素就可 阅读全文
posted @ 2021-04-15 23:29 __Anchor 阅读(46) 评论(0) 推荐(0)
摘要:P1494 [国家集训队]小Z的袜子 发现这道题没有修改,并且可以离线,于是可以考虑莫队。 那么具体这么做?很容易发现答案就是这个区间所有颜色个数 \(d_i*(d_i-1)\) 的和再除以 \(r-l\) 和 \(r-l-1\) 即可。 于是我们莫队只需要维护一下分子的平方项,另外一个我们可以直接 阅读全文
posted @ 2021-04-13 14:56 __Anchor 阅读(69) 评论(0) 推荐(0)
摘要:P4396 [AHOI2013]作业 P4396 [AHOI2013]作业 CDQ分治+树状数组或者莫队+树状数组。 CDQ分治做法: 第一问很简单,就是区间询问大于等于一个数且小于等于一个数的个数,容易发现这就是二维偏序。 然后发现第二问就是矩阵数颜色,那么我们沿用 HH的项链 这道题的经典思路, 阅读全文
posted @ 2021-04-12 16:13 __Anchor 阅读(80) 评论(0) 推荐(0)