Description

定义二元运算 opt 满足

现在给定一个长为 n 的数列 a 和一个长为 m 的数列 b ,接下来有 q 次询问。每次询问给定一个数字 c

你需要求出有多少对 (i, j) 使得 a_i opt b_j=c 。

Input

第一行是一个整数 T (1≤T≤10) ,表示测试数据的组数。

对于每组测试数据:

第一行是三个整数 n,m,q (1≤n,m,q≤50000) 。

第二行是 n 个整数,表示 a_1,a_2,?,a_n (0≤a_1,a_2,?,a_n≤50000) 。

第三行是 m 个整数,表示 b_1,b_2,?,b_m (0≤b_1,b_2,?,b_m≤50000) 。

第四行是 q 个整数,第 i 个整数 c_i (0≤c_i≤100000) 表示第 i 次查询的数。

Output

对于每次查询,输出一行,包含一个整数,表示满足条件的 (i, j) 对的个数。

Sample Input

2

2 1 5

1 3

2

1 2 3 4 5

2 2 5

1 3

2 4

1 2 3 4 5

Sample Output

1

0

1

0

0

1

0

1

0

1

Sol

首先一眼看上去有点像FFT,但是由于值域的限制我们不能直接做,考虑按权值分治,每次把A中小于mid的和B中大于mid的进行FFT,统计答案的时候记得加上l和mid+1,再把B反转,然后把A中大于mid的和B中小于mid的进行FFT,统计答案的时候记得右移一位。

细节:分治的时候len和memset的范围一定要按照当前区间长度来,否则T飞。

Code

#include <bits/stdc++.h>
#define pi acos(-1.0)
using namespace std;
int A[50005],B[50005],T,mx,x,n,m,q,len,i,j,k;long long ans[100005];
struct cp
{
double x,y;
cp(double x=0.0,double y=0.0):x(x),y(y){}
friend cp operator+(cp a,cp b){return cp(a.x+b.x,a.y+b.y);}
friend cp operator-(cp a,cp b){return cp(a.x-b.x,a.y-b.y);}
friend cp operator*(cp a,cp b){return cp(a.x*b.x-a.y*b.y,a.x*b.y+a.y*b.x);}
}C[131073],D[131073],w,wn,t;
void fft(cp *a,int n,int op)
{
for(i=k=0;i<n;i++){if(i>k) swap(a[i],a[k]);for(j=(n>>1);(k^=j)<j;j>>=1);}
for(k=2,wn=cp(cos(2*pi*op/k),sin(2*pi*op/k));k<=n;k<<=1,wn=cp(cos(2*pi*op/k),sin(2*pi*op/k)))
for(i=0,w=cp(1,0);i<n;i+=k,w=cp(1,0)) for(j=0;j<(k>>1);j++,w=w*wn)
t=a[i+j+(k>>1)]*w,a[i+j+(k>>1)]=a[i+j]-t,a[i+j]=a[i+j]+t;
if(op==-1) for(int i=0;i<n;i++) a[i].x/=n;
}
void solve(int l,int r)
{
if(l==r){ans[0]+=1ll*A[l]*B[l];return;}
int mid=(l+r)>>1;for(len=1;len<r-l+1;len<<=1);
memset(C,0,sizeof(cp)*len);memset(D,0,sizeof(cp)*len);
for(int i=l;i<=mid;i++) C[i-l].x=A[i];
for(int i=mid+1;i<=r;i++) D[i-mid-1].x=B[i];
fft(C,len,1);fft(D,len,1);
for(int i=0;i<len;i++) C[i]=C[i]*D[i];fft(C,len,-1);
for(int i=0;i<len;i++) ans[i+l+mid+1]+=1ll*(C[i].x+0.1);
memset(C,0,sizeof(cp)*len);memset(D,0,sizeof(cp)*len);
for(int i=mid+1;i<=r;i++) C[i-mid-1].x=A[i];
for(int i=l;i<=mid;i++) D[mid-i].x=B[i];
fft(C,len,1);fft(D,len,1);
for(int i=0;i<len;i++) C[i]=C[i]*D[i];fft(C,len,-1);
for(int i=0;i<len;i++) ans[i+1]+=1ll*(C[i].x+0.1);
solve(l,mid);solve(mid+1,r);
}
int main()
{
for(scanf("%d",&T);T--;)
{
memset(A,0,sizeof(A));memset(B,0,sizeof(B));memset(ans,0,sizeof(ans));
scanf("%d%d%d",&n,&m,&q);mx=0;
for(int i=1;i<=n;i++) scanf("%d",&x),A[x]++,mx=max(mx,x);
for(int i=1;i<=m;i++) scanf("%d",&x),B[x]++,mx=max(mx,x);
for(solve(0,mx);q--;) scanf("%d",&x),printf("%lld\n",ans[x]);
}
}

最新文章

  1. input=text数字问题
  2. Z.ExtensionMethods 一个强大的开源扩展库
  3. 电信行业的BI应用
  4. function中的ajax怎么返回一个数
  5. 【读书笔记】iOS网络-测试与操纵网络流量
  6. Java容器详解
  7. 大型分布式C++框架《四:netio之buffer管理器 下》
  8. javascript将毫秒还原为可读时间格式
  9. mongoDB &amp; Nodejs 访问mongoDB (二)
  10. 国际化:Java平台下的Locale类
  11. Hive中常用的查询命令
  12. 确认过眼神,你是喜欢Stream的人
  13. dubbo框架提供Main方法运行容器的几种方式(转)
  14. [报错]Could not get a resource from the pool
  15. Android资源重命名
  16. 【Alpha】第四次Scrum meeting
  17. 【Java】 大话数据结构(7) 循环队列和链队列
  18. http://www.gasi.ch/blog/inside-deep-zoom-2/
  19. CentOS中用Nexus搭建maven私服,为Hadoop编译提供本地镜像
  20. JS localStorage 存储变量

热门文章

  1. fiddler代理hosts配置
  2. How To Install Git on CentOS 7
  3. GDB常用命令简介
  4. 【原】Coursera—Andrew Ng机器学习—课程笔记 Lecture 5 Octave Tutorial—5.5 控制语句: for, while, if 语句
  5. 当property遇上category
  6. java基础之JDBC一:概述及步骤详解
  7. java基础之多线程五:实现Runnable的原理
  8. Luogu 3723 [AH2017/HNOI2017]礼物
  9. Part5核心初始化_lesson3---关闭看门狗
  10. c#事务的使用、示例及注意事项