4836: [Lydsy2017年4月月赛]二元运算

Time Limit: 8 Sec  Memory Limit: 128 MB

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

HINT

 

Source

可能我的常数真的巨大。。。

转载一个姜大爷的题解http://blog.csdn.net/neither_nor/article/details/70889246

#include<map>
#include<cmath>
#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define inf 1000000007
#define ll long long
#define PI acos(-1)
#define M 400010
inline int rd()
{
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
#define db double
struct cl{
db x,y;
cl(){}
cl(db _x,db _y){x=_x;y=_y;}
friend cl operator +(const cl &x,const cl &y){return cl(x.x+y.x,x.y+y.y);}
friend cl operator -(const cl &x,const cl &y){return cl(x.x-y.x,x.y-y.y);}
friend cl operator *(const cl &x,const cl &y){return cl(x.x*y.x-x.y*y.y,x.x*y.y+x.y*y.x);}
friend cl operator /(const cl &x,const db &y){return cl(x.x/y,x.y/y);}
cl con(){return cl(x,-y);}
};
cl a[M],b[M];
int n,L,R[M];
int A[M],B[M],mx,T;
ll ans[M];
void fft(cl *x,int f,int n)
{
for(int i=;i<n;i++) if(i<R[i]) swap(x[i],x[R[i]]);
for(int i=;i<n;i<<=)
{
cl wn(cos(PI/i),f*sin(PI/i));
for(int j=;j<n;j+=(i<<))
{
cl w(,),X,Y;
for(int k=;k<i;k++,w=w*wn)
{
X=x[j+k];Y=w*x[j+k+i];
x[j+k]=X+Y;x[j+k+i]=X-Y;
}
}
}
if(f==-) for(int i=;i<n;++i) x[i]=x[i]/n;
}
void cal(int l,int r,int n,int L)
{
if(l==r)
{
ans[]+=(ll)A[l]*B[l];
return ;
}
register int i,j,mid=l+r>>;
for(i=;i<n;++i) R[i]=(R[i>>]>>)|((i&)<<L);
for(i=;i<n;++i) a[i]=b[i]=cl(,);
for(i=l;i<=mid;++i) a[i-l].x=A[i];
for(i=mid+;i<=r;++i) a[i-mid-].y=B[i];
fft(a,,n);
for(i=;i<n;i++)
{
j=(n-i)&(n-);
b[i]=(a[i]*a[i]-(a[j]*a[j]).con())*cl(,-0.25);
}
fft(b,-,n);
for(i=;i<n;++i) ans[l+mid++i]+=(ll)(b[i].x+0.1); for(i=;i<n;++i) a[i]=b[i]=cl(,);
for(i=mid+;i<=r;i++) a[i-mid-].x=A[i];
for(i=l;i<=mid;i++) a[mid-i].y=B[i];
fft(a,,n);
for(i=;i<n;i++)
{
j=(n-i)&(n-);
b[i]=(a[i]*a[i]-(a[j]*a[j]).con())*cl(,-0.25);
}
fft(b,-,n);
for(i=;i<n;++i) ans[+i]+=(ll)(b[i].x+0.1); cal(l,mid,n>>,L-);
cal(mid+,r,n>>,L-);
}
int main()
{
register int n1,n2,q,i,x;
T=rd();
while(T--)
{
n1=rd();n2=rd();q=rd();mx=;
memset(A,,sizeof(A));
memset(B,,sizeof(B));
memset(ans,,sizeof(ans));
for(i=;i^n1;++i)
{
x=rd();A[x]++;
mx=max(mx,x);
}
for(i=;i^n2;i++)
{
x=rd();B[x]++;
mx=max(mx,x);
}
for(n=,L=-;n<(mx<<);n<<=) L++;
cal(,n-,n,L);
while(q--)
{
x=rd();
printf("%lld\n",ans[x]);
}
}
return ;
}

bzoj 4836: [Lydsy2017年4月月赛]二元运算 -- 分治+FFT的更多相关文章

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

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

  2. BZOJ 4881: [Lydsy2017年5月月赛]线段游戏

    4881: [Lydsy2017年5月月赛]线段游戏 Time Limit: 3 Sec  Memory Limit: 256 MBSubmit: 164  Solved: 81[Submit][St ...

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

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

  4. bzoj4836 [Lydsy2017年4月月赛]二元运算

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

  5. bzoj 4885: [Lydsy2017年5月月赛]长方体

    Description 给定一个a*b*c的长方体,定义其表面上两个点的距离为沿着长方体的表面走的最短路径的长度,请找到距离最远的点对,你需要保证找到的两个点里至少有一个是长方体顶点. Input 第 ...

  6. BZOJ 4883 [Lydsy2017年5月月赛]棋盘上的守卫(最小生成环套树森林)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4883 [题目大意] 在一个n*m的棋盘上要放置若干个守卫. 对于n行来说,每行必须恰好 ...

  7. BZOJ 4884 [Lydsy2017年5月月赛]太空猫(单调DP)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4884 [题目大意] 太空猫(SpaceCat)是一款画面精致.玩法有趣的休闲游戏, 你 ...

  8. BZOJ 4836: [Lydsy1704月赛]二元运算 分治FFT

    Code: #include<bits/stdc++.h> #define ll long long #define maxn 500000 #define setIO(s) freope ...

  9. 【BZOJ 4832 】 4832: [Lydsy2017年4月月赛]抵制克苏恩 (期望DP)

    4832: [Lydsy2017年4月月赛]抵制克苏恩 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 275  Solved: 87 Descripti ...

随机推荐

  1. php菜刀分析学习

    这里以eval为例 我们知道, php中的eval能把字符串当代码执行: eval('phpcode'); 注意, 这里的代码要有分号结尾, 我们测试: 我们创建一个最简单的SHELL: <?p ...

  2. 摘: 给Shapre命名

    有两种解决方式: 在 VBA 中将slide中的Shape命名,改变shape.name即可. 另外一种方式就是有点投机取巧:你可以点击shap,右键选择web/alternativetext做些标记 ...

  3. pycharm双击无响应,打不开问题解决办法

    之前好好的pycharm,突然双击打不开了,怎么办? 亲测有效方案: 第一步:进入如下路径,找到cmd.exe,右键选择“以管理员身份运行”: 第二步:在打开的cmd窗口中,输入 netsh wins ...

  4. Mysql 主主复制失败恢复【转】

    Mysql 主主复制失败 Mysql 主主复制失败 故障描述 架构信息 节点信息 故障分析 同步AIPPRD2的从环境 同步AIPPRD1的从环境 故障描述 原因描述 因为机柜PDU老化, 导致整个机 ...

  5. .NET 处理视频-MediaInfo 获取视频信息

    获取视频信息的组件很多,本节介绍的是:MediaFile. 第一步.添加 MediaInfoDotNet 在项目上右键,选择“管理 NuGet 程序包”,浏览以选中 MediaInfoDotNet,然 ...

  6. 函数参数 f_arg, *args, **kwargs

    当需要给函数传参时,可以通过运用不同的形参来传递,达到参数不同的使用目的. 简单来说:f_arg就是传递的第一个参数,类似于C++中的普通参数: *args 传递的是一个参数的list: **kwar ...

  7. NFS挂载报如下错误信息:mount.nfs: Stale NFS file handle解决

    1)用fuser杀掉占用那个目录的进程 linux:~ # fuser -k /home/msgplus/msgplus/remote_dir 2)强制umount linux:~ # umount ...

  8. Ubuntu 10.04 分辨率调整

    最近学长们看了我的本本都在问我,显卡驱动是不是出现什么问题了···分辨率这么差.当时我的分辨率是1024X768,于是我就想修改我的屏幕分辨率改成1280X800.本来很简单的事情,我做起来却非常的曲 ...

  9. lumen 框架的特殊使用

    1. 配置代码格式管理工具: composer require squizlabs/php_codesniffer, 使用 php artisan cs 检查代码格式: 2.单元测试用例编写 1./d ...

  10. navigator.geolocation详解

    https://blog.csdn.net/qq_27626333/article/details/51815467 PositionOptions: JSON对象,监听设备位置信息参数 naviga ...