Code:

#include<bits/stdc++.h>
#define ll long long
#define maxn 500000
#define setIO(s) freopen(s".in","r",stdin)
using namespace std;
const double pi=acos(-1.0);
struct cpx
{
double x,y;
cpx(double a=0,double b=0) {x=a,y=b; }
cpx operator+(const cpx b) { return cpx(x+b.x,y+b.y); }
cpx operator-(const cpx b) { return cpx(x-b.x,y-b.y); }
cpx operator*(const cpx b) { return cpx(x*b.x-y*b.y,x*b.y+y*b.x); }
}A[maxn],B[maxn];
void FFT(cpx *a,int n,int flag)
{
for(int i=0,k=0;i<n;++i)
{
if(i>k) swap(a[i],a[k]);
for(int j=n>>1;(k^=j)<j;j>>=1);
}
for(int mid=1;mid<n;mid<<=1)
{
cpx wn(cos(pi/mid), flag*sin(pi/mid)),x,y;
for(int i=0;i<n;i+=(mid<<1))
{
cpx w(1,0);
for(int j=0;j<mid;++j,w=w*wn) x=a[i+j],y=w*a[i+j+mid],a[i+j]=x+y,a[i+j+mid]=x-y;
}
}
if(flag==-1) for(int i=0;i<n;++i) a[i].x/=(double)n;
}
int n,m;
int arr[maxn],brr[maxn],bucka[maxn],buckb[maxn];
ll answer[maxn];
void solve(int l,int r)
{
if(l==r) { answer[0]+=1ll*bucka[l]*buckb[l]; return; }
int mid=(l+r)>>1,len,a=0,b=0;
for(len=1;len<=(r-l+1);len<<=1);
for(int i=0;i<=len;++i) A[i].x=B[i].x=A[i].y=B[i].y=0;
for(int i=l;i<=mid;++i) A[a++].x=bucka[i];
for(int i=mid+1;i<=r;++i) B[b++].x=buckb[i];
FFT(A,len,1),FFT(B,len,1);
for(int i=0;i<len;++i) A[i]=A[i]*B[i];
FFT(A,len,-1);
for(int i=mid+1+l;i<=mid+r;++i) answer[i]+=(ll)(A[i-mid-1-l].x+0.5);
for(int i=0;i<=len;++i) A[i].x=A[i].y=B[i].x=B[i].y=0;
for(int i=mid+1;i<=r;++i) A[i-mid-1].x=bucka[i];
for(int i=l;i<=mid;++i) B[mid-i]=buckb[i];
FFT(A,len,1),FFT(B,len,1);
for(int i=0;i<len;++i) A[i]=A[i]*B[i];
FFT(A,len,-1);
for(int i=0;i<=r-l;++i) answer[i+1]+=(ll)(A[i].x+0.5);
solve(l,mid), solve(mid+1,r);
}
void work()
{
memset(bucka,0,sizeof(bucka));
memset(buckb,0,sizeof(buckb));
memset(answer,0,sizeof(answer));
int q,Max=0;
scanf("%d%d%d",&n,&m,&q);
for(int i=1;i<=n;++i) scanf("%d",&arr[i]),Max=max(Max,arr[i]);
for(int i=1;i<=m;++i) scanf("%d",&brr[i]),Max=max(Max,brr[i]);
for(int i=1;i<=n;++i) bucka[arr[i]]++;
for(int i=1;i<=m;++i) buckb[brr[i]]++;
solve(0,Max);
for(int i=1;i<=q;++i)
{
int x;
scanf("%d",&x);
printf("%lld\n",answer[x]);
}
}
int main()
{
// setIO("input");
int T;
scanf("%d",&T);
for(int i=1;i<=T;++i) work();
return 0;
}

  

BZOJ 4836: [Lydsy1704月赛]二元运算 分治FFT的更多相关文章

  1. bzoj 4836 [Lydsy1704月赛]二元运算 分治FFT+生成函数

    [Lydsy1704月赛]二元运算 Time Limit: 8 Sec  Memory Limit: 128 MBSubmit: 577  Solved: 201[Submit][Status][Di ...

  2. bzoj 4836: [Lydsy2017年4月月赛]二元运算 -- 分治+FFT

    4836: [Lydsy2017年4月月赛]二元运算 Time Limit: 8 Sec  Memory Limit: 128 MB Description 定义二元运算 opt 满足   现在给定一 ...

  3. BZOJ4836 [Lydsy1704月赛]二元运算 分治 多项式 FFT

    原文链接http://www.cnblogs.com/zhouzhendong/p/8830036.html 题目传送门 - BZOJ4836 题意 定义二元运算$opt$满足 $$x\ opt\ y ...

  4. 【bzoj4836】[Lydsy2017年4月月赛]二元运算 分治+FFT

    题目描述 定义二元运算 opt 满足   现在给定一个长为 n 的数列 a 和一个长为 m 的数列 b ,接下来有 q 次询问.每次询问给定一个数字 c  你需要求出有多少对 (i, j) 使得 a_ ...

  5. [BZOJ4836]二元运算(分治FFT)

    4836: [Lydsy1704月赛]二元运算 Time Limit: 8 Sec  Memory Limit: 128 MBSubmit: 578  Solved: 202[Submit][Stat ...

  6. BZOJ4836: [Lydsy1704月赛]二元运算

    BZOJ4836: [Lydsy1704月赛]二元运算 https://lydsy.com/JudgeOnline/problem.php?id=4836 分析: 分开做,维护两个桶. 分治每次求\( ...

  7. BZOJ4836: [Lydsy1704月赛]二元运算【分治FFT】【卡常(没卡过)】

    Description 定义二元运算 opt 满足 现在给定一个长为 n 的数列 a 和一个长为 m 的数列 b ,接下来有 q 次询问.每次询问给定一个数字 c 你需要求出有多少对 (i, j) 使 ...

  8. BZOJ 4555: [Tjoi2016&Heoi2016]求和 [分治FFT 组合计数 | 多项式求逆]

    4555: [Tjoi2016&Heoi2016]求和 题意:求\[ \sum_{i=0}^n \sum_{j=0}^i S(i,j)\cdot 2^j\cdot j! \\ S是第二类斯特林 ...

  9. bzoj 4831 [Lydsy1704月赛]序列操作 dp

    [Lydsy1704月赛]序列操作 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 203  Solved: 69[Submit][Status][Dis ...

随机推荐

  1. free pascal 修改字符集,会导致 dos 不能显示 汉字。 处理方法如下

    http://www.cnblogs.com/yjken/p/3917932.html 让windows系统的DOS窗口也可以显示utf8字符集   C:\Users\Administrator> ...

  2. Numpy 基础函数

    日后用的着的时候再说,存下来.方便日后查看 NumPy数组使你可以将许多种数据处理任务表述为简洁的数组表达式(否则需要编写循环).用数组表达式代替循环的做法,通常被称为矢量化. 原来一直不明白什么叫矢 ...

  3. Newtonsoft.Json源码中的C#预处理指令

    cs文件中包含以指令: #if !(NET35 || NET20 || PORTABLE40) 记事本打开[Newtonsoft.Json.Net20.csproj]可看到以下代码: <Defi ...

  4. C#实现京东登录密码加密POST

    1.京东登录登录密码 function getEntryptPwd(pwd) { var pubKey = $('#pubKey').val(); if (!pwd || !pubKey || !Sy ...

  5. 如何快速查找到多个字典中的公共键(Key)---Python数据结构与算法相关问题与解决技巧

    如何快速查找到多个字典中的公共键(Key)-?   实际案例: 西班牙足球甲级联赛,每轮球员进球统计: 第1轮: { '苏亚雷斯':1,'梅西':2,'本泽马':1,...} 第2轮: { '苏亚雷斯 ...

  6. Python工具库(感谢backlion整理)

    漏洞及渗透练习平台: WebGoat漏洞练习平台: https://github.com/WebGoat/WebGoat webgoat-legacy漏洞练习平台: https://github.co ...

  7. Spring003--Spring事务管理(mooc)

    Spring事务管理 一.事务回顾 1.1.什么是事务 事务指的是逻辑上的一组操作,这组操作要么全部成功,要么全部失败. 异常情况发生,需要保证:[1]张三将钱转出,李四收到钱.[2]张三钱未成功转出 ...

  8. VLAN 基础设置及Aceess接口

    实验内容 本实验模拟企业网络场景.公司内网是一一个大的局域网,二层交换机S1放置在一楼,在一楼办公的部门有IT部和人事部;二层交换机S2放置在二楼,在二楼办公的部门有市场部和研发部.由于交换机组成的是 ...

  9. Linux内核模块(Module)初解

    #include <linux/init.h> // __init __exit #include <linux/module.h> // module_init module ...

  10. 实现简单的计算器(设计UI)

    要点说明: 1.一个textedit控件,其余全部是button控件,button布局方式:栅格布局(Grid layout) 2.对窗体的Title进行修改(默认是工程名) 3.在ui文件中设计的U ...