BZOJ 3509 分块FFT】的更多相关文章

思路: 跟今年WC的题几乎一样 (但是这道题有重 不能用bitset水过去) 正解:分块FFT http://blog.csdn.net/geotcbrl/article/details/50636401    from GEOTCBRL 可以看看hgr的题解..写得很详细 //By SiriusRen #include <cmath> #include <cstdio> #include <cstring> #include <algorithm> usi…
[BZOJ 3509] [CodeChef] COUNTARI (FFT+分块) 题面 给出一个长度为n的数组,问有多少三元组\((i,j,k)\)满足\(i<j<k,a_j-a_i=a_k-a_j\) \(n \leq 10^5, a_i \leq 30000\) 分析 记\(m=\max(a_i)\) 先做一点变形\(a_i+a_k=2a_j\).那么枚举j,把j左边的和右边的所有数字找出来,找出有哪些数字对的和为\(2a_j\). 维护当前块左边每个数的出现次数cntl,,和右边块的出现…
[BZOJ 3771] Triple(FFT+生成函数) 题面 给出 n个物品,价值为别为\(w_i\)且各不相同,现在可以取1个.2个或3个,问每种价值和有几种情况? 分析 这种计数问题容易想到生成函数. 设生成函数\(A(x)=\sum_{i=1}^{n} x^{w_i}\),指数为价值,系数为选的方案数.A表示每种物品取1个的方案数.同理,我们可以写出每种物品取2个和3个的生成函数. \(B(x)=\sum_{i=1}^{n} x^{2w_i}\) \(C(x)=\sum_{i=1}^{n…
分块大法好. 块内暴力,块外FFT. 弃疗了,抄SX队长$silvernebula$的代码 #include <map> #include <cmath> #include <queue> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; #define F(i,j,k) fo…
3509: [CodeChef] COUNTARI 题意:统计满足\(i<j<k, 2*a[j] = a[i] + a[k]\)的个数 \(2*a[j]\)不太好处理,暴力fft不如直接暴力 考虑分块 每个块用生成函数统计j在块中ik在两边的块中的 有两个在块中或者三个都在暴力统计,实时维护两边权值出现次数 #include <iostream> #include <cstdio> #include <cstring> #include <algori…
3509: [CodeChef] COUNTARI Time Limit: 40 Sec  Memory Limit: 128 MBSubmit: 883  Solved: 250[Submit][Status][Discuss] Description 给定一个长度为N的数组A[],求有多少对i, j, k(1<=i<j<k<=N)满足A[k]-A[j]=A[j]-A[i]. Input 第一行一个整数N(N<=10^5).接下来一行N个数A[i](A[i]<=300…
题意: 求一个序列中顺序的长度为3的等差数列. SOL: 对于这种计数问题都是用个数的卷积来进行统计.然而对于这个题有顺序的限制,不好直接统计,于是竟然可以分块?惊为天人... 考虑分块以后的序列: 一个块内直接枚举统计三个或两个在块内的. 只有一个在当前块我们假设它是中间那个,对左右其它块做卷积. 但是还是感觉复杂度有点玄学啊... 我比较傻逼...一开始块内统计根本没有想清楚...最后做卷积硬生生把复杂度变成了 $\sqrt{N}*N*log(N)$... 改了一个晚上终于没忍住看标程...…
题目 Source http://vjudge.net/problem/142058 Description Given N integers A1, A2, …. AN, Dexter wants to know how many ways he can choose three numbers such that they are three consecutive terms of an arithmetic progression. Meaning that, how many trip…
第一次写法法塔,,,感到威力无穷啊 看了一上午算导就当我看懂了?PS:要是机房里能有个清净的看书环境就好了 FFT主要是用了巧妙的复数单位根,复数单位根在复平面上的对称性使得快速傅立叶变换的时间复杂度空降为O(nlogn)←个人的愚蠢理解请随意吐槽 具体的我就不说了,算导上都说得很清楚,说得好像有人会听我说什么似的 模板在这里↓ CodeVS 3123: #include<cmath> #include<cstdio> #include<cstring> #includ…
记本题数组长度为\(n\),权值大小为\(m\). 首先,暴力显然是\(O(n^2)\)的. 先瞄一眼tag,然后发现这是FFT. 显然,问题的关键在于要满足i,j,k之间的位置关系.于是考虑分治FFT.但遗憾的是,我们的分治FFT是对权值进行多项式乘法的,分治并不能使得FFT的规模减小.因此,分治做法在复杂度上就是错误的. 然后考虑分块.以下记块大小为\(K\). 考虑一下三种情况: i,j在同一块中,但k在另一块里. j,k在同一块中,但i在另一块里. i,j,k都在同一块中. i,j,k都…
BZOJ 3527 力 | 分治 题意 给出数组q,$E_i = \sum_{i < j} \frac{q_i}{(i - j) ^ 2} - \sum_{i > j} \frac{q_i}{(i - j) ^ 2} $. 题解 求出减号前面一部分(设为A(i)),再求出减号后面的一部分(设为B(i)). 具体怎么求呢?还是转换成多项式乘法. 设\(f(i) = q[i]\),翻转后成为\(f'(i)\). 设\(g(i) = \frac{1}{i^2}, g(0) = 0\). \[A(i)…
题目链接 BZOJ3509 题解 化一下式子,就是 \[2A[j] = A[i] + A[k]\] 所以我们对一个位置两边的数构成的生成函数相乘即可 但是由于这样做是\(O(n^2logn)\)的,我们考虑如何优化 显然可以分块做,我们不对所有数左右求卷积,只对\(B\)个块左右做,这样\(i\)和\(k\)都在块外的情况就可以统计出来 \(i\)或\(k\)在块内的情况可以暴力扫一遍计算 复杂度\(O(Bnlogn + nB)\) 经计算\(B = \sqrt{nlogn}\)最优 但考虑到\…
BZOJ 3160: 万径人踪灭 题目传送门 [题目大意] 给定一个长度为n的01串,求有多少个回文子序列? 回文子序列是指从原串中找出任意个,使得构成一个回文串,并且位置也是沿某一对称轴对称. 假如x是对称轴,若 i 和 j 是对称且di=dj,i,j可以视为可行的一组.可行组数记为f[x]. \(f[x]=\sum_{i=1}^{x-1}[d[x-i]==d[x+i]]\) 以x为对称轴的答案是2^(f[x])-1. 可以观察发现将d[i]=1的A[i]标为1,A与A做一次卷积,即可得出d[…
大题思路就是分块,将n个数分成sqrt(n)个块,然后 处理出一个w数组,w[i,j]代表第i个块到第j个块的答案 那么对于每组询问l,r如果l,r在同一个块中,直接暴力做就行了 如果不在同一个块中,l,r区间中整块的部分可以直接由w数组得到答案 然后多出来的部分暴力处理下出现次数,然后再预处理一个b数组,代表没 个数出现的位置,且每个数都连续,那么我们可以二分的找出在多余部分出现的 每个数在整区间内出现多少次,然后和多余部分出现的累加,判断奇偶更新答案 看了lyd的题解,写的挺好(其实这个题就…
多个询问l,r,求所有子区间异或和中最大是多少 强制在线 做法: 分块+可持久化trie 1.对于每块的左端点i,预处理出i到任意一个j,()i,j)间所有子区间异或和中最大为多少,复杂度O(\(n\sqrt n\)) 2.对于询问x,y: ①x,y属于同一块,O(\(\sqrt n log_2 n\))直接扫 ②x,y不属于同一块,找到x右边第一块的左端点,用预处理求出左端点到y,剩下的直接扫,O(\(\sqrt n log_2 n\)) 注意: 1.区间异或和转化为前缀和之后,要表示任意一个…
3160: 万径人踪灭 题意:求一个序列有多少不连续的回文子序列 一开始zz了直接用\(2^{r_i}-1\) 总-回文子串 后者用manacher处理 前者,考虑回文有两种对称形式(以元素/缝隙作为对称轴) f[i],i为奇数表示以缝隙对称,偶数表示以元素i>>1对称,对答案的贡献就是\(2^{f[i]}-1\) \[ f[i] = \sum_{j=1}^{i-1} [s_j = s_{i-j}] \] 就是裸卷积 因为只有a,b两个字符,可以先后令a或b=1分别求 #include <…
解析: 这东西其实就是指数型母函数? 所以刚开始读入的值我们都把它前面的系数置为1. 然后其实就是个多项式乘法了. 最大范围显然是读入的值中的最大值乘三,对于本题的话是12W? 用FFT优化的话,达到了O(nlogn),显然可过. 但是这里有一个问题,就是如何处理重复的部分. 重复的部分我们考虑用容斥原理来解决. 为了方便描述我们不妨设三个多项式. 第一个是仅取一个而构成的多项式.->x 第二个是仅取相同的两个而构成的多项式.->y 第三个是仅取相同的三个而构成的多项式.->z 对于本题…
分块: 先预处理,将原序列分成长度为len的许多块,计算从第i块到第j块的答案,(可以做到O(n*n/len)). 每次询问时,将询问的区间分成三部分,:左边,中间,右边,中间是尽量大的一个块区间,其答案已经计算得到,左右两边加起来最多有2*len个元素,暴力计算其对答案的影响.O(q*len*f(n)),f(n)是暴力加入一个元素的代价. 这道题f(n)是log(n) 总的复杂度:f(n) = O( n*n/len + q*len*log(n) ), 当len = n*(q*log(n))-1…
http://www.lydsy.com/JudgeOnline/problem.php?id=2179 fft裸题.... 为嘛我的那么慢....1000多ms.. #include <cstdio> #include <cstring> #include <cmath> #include <string> #include <iostream> #include <algorithm> #include <queue>…
题意:给定\(a[l...r]\),多次询问区间\([l,r]\)中的最大连续异或和\(a_i⊕a_{i+1}⊕...⊕a_{j},l≤i≤j≤r\) 一眼过去认为是不可做的,但题目给出\(n=1.2e4\),提供了分块暴力的余地 首先处理成前缀形式,对于询问\([l,r]\)既为\([l-1,r]\)中寻找两个数xor最大 维护\(f[i][j]\):第i个块到第j个数的任意异或最大值 这个只需\(O(30*n\sqrt{n})\)的代价即可预处理 对于每次询问,首个残缺的块暴力,其余块直接由…
题目链接 本质是维护斜率递增序列. 用分块的方法就是把序列分成sqrt(n)块,每个块分别用一个vector维护递增序列.查询的时候遍历所有的块,同时维护当前最大斜率,二分找到每个块中比当前最大斜率大的那个点.修改的时候只需要修改点所在的那个块即可.复杂度$O(m\sqrt nlogn)$ #include<bits/stdc++.h> using namespace std; typedef long long ll; typedef double db; ; int n,m,h[N],in…
中文题面 这道题就是LightOJ某题的升级版 前段时间我是直接用√k前暴力后分块的处理方式,然后直接套个等差求和 这次看到了dalao的证明再次让我知道我好菜啊 在这里做下笔记,学习一下对于整除运算的分析方法 关于\([\frac{k}{i}]×i,i∈[1,n]\)的处理 令\(x∈[1,k],g(x)=[k/[k/x]],f(x)=k/x\) 有\(g(x) = [k/[f(x)]] ≥ [k/f(x)] = x\) 得到\(g(x) ≥ x\),换为底 \([k/g(x)]≤[k/x]\…
Triple Time Limit: 20 Sec  Memory Limit: 64 MBSubmit: 847  Solved: 482[Submit][Status][Discuss] Description 我们讲一个悲伤的故事. 从前有一个贫穷的樵夫在河边砍柴. 这时候河里出现了一个水神,夺过了他的斧头,说: “这把斧头,是不是你的?” 樵夫一看:“是啊是啊!” 水神把斧头扔在一边,又拿起一个东西问: “这把斧头,是不是你的?” 樵夫看不清楚,但又怕真的是自己的斧头,只好又答:“是啊是…
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3771 把方案作为系数.值作为指数,两项相乘就是系数相乘.指数相加,符合意义. 考虑去重.先自己卷积自己3次(就是求出点值表达式后a[ i ]=a[ i ]*a[ i ]*a[ i ],因为卷积3次就是点值的3次方,然后iDFT回去即可),这是无限制的然后把至少两个斧头相同的方案减去:刚才求的方案其实是有序的,所以两个斧头相同的话,第三个斧头有3个位置,要减去的是 a^2 * a 的3倍(a…
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3160 似乎理解加深了. 用卷积算相同的位置:先把 a 赋成1. b 赋成0,卷积一遍:再把 a 赋成0. b 赋成1,卷积一遍:两个加起来就有了每个位置的值,它表示以该位置/2(/2的位置可以是裂缝)为对称轴的回文位置个数. 然后用马拉车把连续区间的情况去掉. 注意一下单个元素也要算上,因为有那种奇数的:马拉车里别忘了把单个元素减去. 因为FFT的两个数组是一样的,所以FFT一次,然后自己…
万径人踪灭 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1936  Solved: 1076[Submit][Status][Discuss] Description Input Output   Sample Input   Sample Output   HINT 题目大意:给定一个由'a'和'b'构成的字符串,求不连续回文子序列的个数 首先回文一定是将字符串倍增 由于求的是不连续回文子序列的个数 因此我们可以求出总回文子序列的个数,然后减…
直接暴力卷积+统计就可以了. 去重比较复杂. 其实也不复杂,抄吧! 反正AC了. #include <map> #include <cmath> #include <queue> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; #define F(i,j,k) for (in…
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3771 令多项式的系数是方案数,次数是值: 设 a(x) 为一个物品的多项式,即 a[w[i]].x = 1,b(x) 为两个物品重复的多项式,即 b[w[i]*2].x = 1,c(x) 为三个物品重复的多项式,即 c[w[i]*3].x = 1: 选恰好三个有序物品的答案就是 a(x)^3 - 3*a(x)*b(x)^2 + c(x),因为要无序,所以再除以 3! = 6: 选恰好两个有…
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3160 求出关于一个位置有多少对对称字母,如果 i 位置有 f[i] 对,对答案的贡献是 2^f[i] - 1: 然后减去连续的,用 manachar 求出回文长度,每个位置作为边界都是一种不合法情况: 求对称,首先把字符串中间穿插字符 '$',于是字符串的长度变成2倍: 考虑一对字母 s[x],s[y],如果 s[x] = s[y],其对称中心是 (x+y)/2: 放在加入字符后的字符串中…
思路: 注意到len<=10 按照权值max-min<=sqrt(n)*len 分块 记一下前缀和  每修改sqrt(n)次以后重新分块   修改的时候整块打标记  两边重构 (这题常数卡得要死   找同学要来fread才过) 查询的时候 就 二分答案 O(sqrt(n))判断 二分的上界要实时根据maxdeep变化才能过 //By SiriusRen #include<bits/stdc++.h> using namespace std; ; int n,m,op,xx,yy,l…