洛谷P4135 作诗(不一样的分块)】的更多相关文章

洛谷P4135 作诗 题目描述 神犇SJY虐完HEOI之后给傻×LYD出了一题: SHY是T国的公主,平时的一大爱好是作诗. 由于时间紧迫,SHY作完诗之后还要虐OI,于是SHY找来一篇长度为N的文章,阅读M次,每次只阅读其中连续的一段[l,r],从这一段中选出一些汉字构成诗.因为SHY喜欢对偶,所以SHY规定最后选出的每个汉字都必须在[l,r]里出现了正偶数次.而且SHY认为选出的汉字的种类数(两个一样的汉字称为同一种)越多越好(为了拿到更多的素材!).于是SHY请LYD安排选法. LYD这种…
题面. 之前做过一道很类似的题目 洛谷P4168蒲公英 ,然后看到这题很快就想到了解法,做完这题可以对比一下,真的很像. 题目要求区间内出现次数为正偶数的数字的数量. 数据范围1e5,可以分块. 我们预处理出这么两个数组. 一个是某个数字出现次数的分块前缀和,这个很简单. 一个是sum[ i ][ j ]代表从第i个分块到第j个分块出现次数为正偶数的数字的个数. 这个数组很好维护,只需要枚举左端点分块和右端点分块然后统计数字出现次数即可. 这些代码里有一些细节,可以结合注释理解. for(int…
题意:[l,r]之间有多少个数出现了正偶数次.强制在线. 解:第一眼想到莫队,然后发现强制在线...分块吧. 有个很朴素的想法就是蒲公英那题的套路,做每块前缀和的桶. 然后发现这题空间128M,数组大小我的是133M......看到有人卡到了122M,但是我又不想冒险,就换写法了.(题解里全是空间n1.5的...) 那就用蒲公英的另一个套路吧...vector + 二分. 预处理出每两个块之间的答案,然后查询的时候对边角扫一遍,每个数vector二分,求得出现几次,统计答案. 这样一来块大小是(…
分块大暴力,跟区间众数基本一样 #pragma GCC optimize(3) #include<cstdio> #include<algorithm> #include<cmath> #include<cstring> using namespace std; ,sz1; ]; ],st[],ed[]; ][]; ],tt2[][]; int main() { ,ans; scanf("%d%d%d",&n,&c,&am…
题目链接 题意:\(n\) 个数,每个数都在 \([1,c]\) 中,\(m\) 次询问,每次问在 \([l,r]\) 中有多少个数出现偶数次.强制在线. \(1 \leq n,m,c \leq 10^5\) 如果不强制在线的话可以想到莫队,关键这个强制在线怎么处理. 很容易想到对原数列进行根号分块,为了方便表示,定义 \(L_i\) 为第 \(i\) 块的左端点,\(R_i\) 为第 \(i\) 块的右端点. 我们记 \(t_{i,j}\) 表示在 \([L_i,n]\) 中 \(j\) 这个…
题面 给定一个长度为 n n n 的整数序列 A A A ,序列中每个数在 [ 1 , c ] [1,c] [1,c] 范围内.有 m m m 次询问,每次询问查询一个区间 [ l , r ] [l,r] [l,r],问有多少个数在该区间中出现了偶数次,强制在线. n , m , c ≤ 1 0 5 n,m,c\leq 10^5 n,m,c≤105. 题解 这道题的大方向是分块. 第一个做法是时间复杂度标准 O ( n n ) O(n\sqrt n) O(nn ​) 的做法. 预处理分块数组 有…
题面. 看到这道题,我第一反应就是莫队. 我甚至也猜出了把所有询问的三个区间压到一起处理然后分别计算对应询问答案. 但是,这么复杂的贡献用什么东西存?难道要开一个数组 query_appear_time[ 100000 ][ 100000 ]? 于是我打消了这个念头,最后还是看题解做的. 简化题意:给一个序列,给一些询问,每个询问包含三个区间代表序列的三个子序列,要求出这三个对应子序列去掉三个子序列都具有的公共数字后剩下的数字个数. 令三个区间为a1,a2,a3. 要求的答案就是a1数字个数-公…
题面 Bzoj 洛谷 题解 大力分块,分块大小\(\sqrt n\),对于每一个元素记一下跳多少次能跳到下一个块,以及跳到下一个块的哪个位置,修改的时候时候只需要更新元素所在的那一块即可,然后询问也是\(\sqrt n\)的模拟. #include <cmath> #include <cstdio> #include <cstring> #include <algorithm> using std::min; using std::max; using st…
题目:https://www.luogu.org/problemnew/show/P4135 分块大法: 块之间记录答案,每一块记录次数前缀和: 注意每次把桶中需要用到位置赋值就好了: 为什么加了特判会 T 一个点? 代码如下: #include<iostream> #include<cstdio> #include<cstring> #include<cmath> using namespace std; ; ][maxn],bst[],bed[],f[]…
嘟嘟嘟 郑重声明:我的前几到分块题写法上都有点小毛病,以这篇为主! 这道题感觉也是分块的基本套路,只不过卡常,得开氧气. 维护俩:sum[i][j]表示前 i 块中,数字 j 出现了多少次,ans[i][j]表示块 i 到块 j 的答案.这两者都可以在O(n√n)内预处理.方法也比较套路,具体看代码. 查询的时候也很套路,多开一个num[i],表示 i 这个数在零散部分出现了多少次,那么num[i] + sum[r - 1][i] - sum[l][i]就是在[L, R]中出现了多少次. 因为卡…