[Codechef November Challenge 2012] Arithmetic Progressions
题意:给定一个序列,求多少个三元组满足ai+ak=2*aj(i<j<k)。
题解:原来叉姐的讲义上有啊。。完全忘掉了。。
首先这个式子很明显是一个卷积。我们有了FFT的思路。但是肯定不能每一个数都去做一次。那怎么办呢?我们分块吧!(分块大法好)
对于每一个块我们统计出前面块的桶,同理我们也有后面块的桶,两个桶FFT一下我们就得到了以这个块内元素为j,i和k分别在前面的块与后面的块的方案了。然后我们还要解决两个在一个块,三个在一个块的问题。两个在一个块的我们直接去前后的桶里找,同一个块的直接n*n暴力。然后就做完啦!好妙啊!
这题被坑了好久。。因为空间莫名其妙的问题怎么都算不对(块开极端都可以,就是开中间不行),然后一个下午没有了。。
#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define N 205005
#define INF 1e9
#define Bl 70
#define LIM 60000
const double PI=acos(-); inline LL read(){
LL x=,f=; char a=getchar();
while(a<'' || a>'') {if(a=='-') f=-; a=getchar();}
while(a>='' && a<='') x=x*+a-'',a=getchar();
return x*f;
} namespace FFT{
int rev[N]; struct vec{
double r,i;
vec operator * (const vec& w){return (vec){r*w.r-i*w.i,i*w.r+r*w.i};}
vec operator + (const vec& w){return (vec){r+w.r,i+w.i};}
vec operator - (const vec& w){return (vec){r-w.r,i-w.i};}
}A[N],B[N]; inline void fft(vec* x,int len,int f){
for(int i=;i<=len;i++) if(i<rev[i]) swap(x[i],x[rev[i]]);
for(int lnow=;lnow<=len;lnow<<=){
vec w,w0=(vec){cos(2.0*PI/lnow*f),sin(2.0*PI/lnow*f)},t1,t2;
for(int i=;i<len;i+=lnow){
w=(vec){,};
for(int j=i;j<i+lnow/;j++){
t1=x[j]; t2=w*x[j+lnow/];
x[j]=t1+t2; x[j+lnow/]=t1-t2;
w=w*w0;
}
}
}
} inline void work(int a[],int b[],int l1,int l2,LL s[]){
int len,t;
for(len=,t=;len<=(l1+l2+);len<<=,t++); t=<<(t-);
for(int i=;i<=len;i++) rev[i]=rev[i>>]>>|(i&?t:);
for(int i=;i<=len;i++) B[i]=A[i]=(vec){,};
for(int i=;i<=l1;i++) A[i].r=a[i];
for(int i=;i<=l2;i++) B[i].r=b[i];
fft(A,len,); fft(B,len,);
for(int i=;i<=len;i++) A[i]=A[i]*B[i];
fft(A,len,-);
for(int i=;i<=l1+l2;i++)
s[i]=(LL)(1.0*A[i].r/len+0.5);
} } int n,block_size,block_num;
int bel[N],l[Bl+],r[Bl+],a[N];
LL tot,ans[*LIM+];
int lsum[LIM+],rsum[LIM+],cnt[*LIM+]; inline void brutal_force(int x){
for(int i=l[x];i<=r[x];i++) rsum[a[i]]--;
memset(ans,,sizeof(ans));
FFT::work(lsum,rsum,,,ans);
for(int i=l[x];i<=r[x];i++){
tot+=ans[*a[i]];
for(int j=l[x];j<i;j++)
if(*a[i]-a[j]>) tot+=rsum[*a[i]-a[j]];
for(int j=i+;j<=r[x];j++)
if(*a[i]-a[j]>) tot+=lsum[*a[i]-a[j]];
}
for(int i=l[x];i<=r[x];i++) lsum[a[i]]++;
memset(cnt,,sizeof(cnt));
for(int i=l[x];i<=r[x];i++){
tot+=cnt[a[i]];
for(int j=l[x];j<i;j++)
if(*a[i]-a[j]>) cnt[*a[i]-a[j]]++;
}
} int main(){
n=read(); block_size=;
block_num=(n-)/block_size+;
for(int i=;i<=n;i++) a[i]=read(),bel[i]=(i-)/block_size+;
for(int i=;i<=block_num;i++) l[i]=(i-)*block_size+,r[i]=min(n,i*block_size);
for(int i=;i<=n;i++) rsum[a[i]]++;
for(int i=;i<=block_num;i++) brutal_force(i);
printf("%lld\n",tot);
return ;
}
[Codechef November Challenge 2012] Arithmetic Progressions的更多相关文章
- 【分块+树状数组】codechef November Challenge 2014 .Chef and Churu
https://www.codechef.com/problems/FNCS [题意] [思路] 把n个函数分成√n块,预处理出每块中各个点(n个)被块中函数(√n个)覆盖的次数 查询时求前缀和,对于 ...
- CodeChef November Challenge 2013 部分题解
http://www.codechef.com/NOV13 还在比...我先放一部分题解吧... Uncle Johny 排序一遍 struct node{ int val; int pos; }a[ ...
- Codechef November Challenge 2019 Division 1
Preface 这场CC好难的说,后面的都不会做QAQ 还因为不会三进制位运算卷积被曲明姐姐欺负了,我真是太菜了QAQ PS:最后还是狗上了六星的说,期待两(三)场之内可以上七星 Physical E ...
- CodeChef November Challenge 2014
重点回忆下我觉得比较有意义的题目吧.水题就只贴代码了. Distinct Characters Subsequence 水. 代码: #include <cstdio> #include ...
- CodeChef November Challenge 2019 Division 1题解
传送门 AFO前的最后一场CC了--好好打吧-- \(SIMGAM\) 偶数行的必定两人平分,所以只要抢奇数行中间那个就行了 这题怎么被爆破了 //quming #include<bits/st ...
- [Educational Codeforces Round 16]D. Two Arithmetic Progressions
[Educational Codeforces Round 16]D. Two Arithmetic Progressions 试题描述 You are given two arithmetic pr ...
- Dirichlet's Theorem on Arithmetic Progressions 分类: POJ 2015-06-12 21:07 7人阅读 评论(0) 收藏
Dirichlet's Theorem on Arithmetic Progressions Time Limit: 1000MS Memory Limit: 65536K Total Submi ...
- 洛谷P1214 [USACO1.4]等差数列 Arithmetic Progressions
P1214 [USACO1.4]等差数列 Arithmetic Progressions• o 156通过o 463提交• 题目提供者该用户不存在• 标签USACO• 难度普及+/提高 提交 讨论 题 ...
- Codechef April Challenge 2019 游记
Codechef April Challenge 2019 游记 Subtree Removal 题目大意: 一棵\(n(n\le10^5)\)个结点的有根树,每个结点有一个权值\(w_i(|w_i\ ...
随机推荐
- 【剑指Offer面试题】 九度OJ1518:反转链表
与其非常快写出一段漏洞百出的代码,倒不如细致分析再写出鲁棒的代码. 提前想好測试用例(输入非空等等)进行測试改动代码. 题目链接地址: http://ac.jobdu.com/problem.php? ...
- Android无线测试之—UiAutomator UiDevice API介绍六
一.灭屏和唤醒屏幕相关知识: 1)灭屏:按电源键将屏幕熄灭 2)唤醒屏幕:在灭屏状态下按电源键唤醒屏幕 二.灭屏与唤屏相关的API: 返回值 方法名 描述 void wakeUp() 模拟按电源键,如 ...
- codevs2894、2837、1669、2503、3231
6.25动态规划之背包回顾 2894 Txx考试 时间限制: 1 s 空间限制: 32000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description Txx是一个 ...
- 【BZOJ2213】[Poi2011]Difference DP
[BZOJ2213][Poi2011]Difference Description A word consisting of lower-case letters of the English alp ...
- ul和li弄的图片列表
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 爬虫实战【5】送福利!Python获取妹子图上的内容
[插入图片,妹子图首页] 哈,只敢放到这个地步了. 今天给直男们送点福利,通过今天的代码,可以把你的硬盘装的满满的~ 下面就开始咯! 第一步:如何获取一张图片 假如我们知道某张图片的url,如何获取到 ...
- 微信小程序网络请求的setDate
我感觉这个无比的奇葩..... 因为之前react的时候,我习惯在请求成功的时候直接this.setDate.........但是,在微信小程序中,一定要将this换成一个变量...一定要!!!否则会 ...
- 二、Nuxt初始化项目
一.快速生成新项目 为了方便大家快速使用,Nuxt提供了一个starter模板,可以直接下载模板的压缩包,或者利用vue-cli来安装 1.压缩包链接:https://github.com/nuxt- ...
- linux 安装zip/unzip/g++/gdb/vi/vim等软件
近期公司新配置了一台64位云server.去部署的时候发现,没有安装zip/unzip压缩解压软件. 于是仅仅好自己安装这两个软件.linux最好用的还是yum. 两个指令就安装好了. 首先把软件安装 ...
- PAT 天梯赛 L1-020. 帅到没朋友 【STL】
题目链接 https://www.patest.cn/contests/gplt/L1-020 思路 对于每个 K >= 2 的朋友圈,里面的所有 ID 都用 MAP 标记一下 对于每个 K = ...