BZOJ4836: [Lydsy1704月赛]二元运算
BZOJ4836: [Lydsy1704月赛]二元运算
https://lydsy.com/JudgeOnline/problem.php?id=4836
分析:
- 分开做,维护两个桶。
- 分治每次求\([l,mid]\)和\([mid+1,r]\)的贡献。
- 两次\(fft\)即可。
代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
typedef double f2;
const f2 pi=acos(-1);
typedef long long ll;
#define N 400050
int n,m,q,C[50050],D[50050];
ll ans[100050];
struct cp {
	f2 x,y;
	cp() {}
	cp(f2 x_,f2 y_) {x=x_,y=y_;}
	cp operator + (const cp &u) const {
		return cp(x+u.x, y+u.y);
	}
	cp operator - (const cp &u) const {
		return cp(x-u.x, y-u.y);
	}
	cp operator * (const cp &u) const {
		return cp(x*u.x-y*u.y, x*u.y+y*u.x);
	}
}a[N],b[N];
void fft(cp *a,int len,int flg) {
	int i,j,k,t;
	cp w,wn,tmp;
	for(i=k=0;i<len;i++) {
		if(i>k) swap(a[i],a[k]);
		for(j=len>>1;(k^=j)<j;j>>=1) ;
	}
	for(k=2;k<=len;k<<=1) {
		t=k>>1;
		wn=cp(cos(2*pi*flg/k),sin(2*pi*flg/k));
		for(i=0;i<len;i+=k) {
			w=cp(1,0);
			for(j=i;j<i+t;j++) {
				tmp=a[j+t]*w;
				a[j+t]=a[j]-tmp;
				a[j]=a[j]+tmp;
				w=w*wn;
			}
		}
	}
	if(flg==-1) {
		for(i=0;i<=len;i++) a[i].x/=len;
	}
}
void solve(int l,int r) {
	if(l==r) return ;
	int mid=(l+r)>>1;
	solve(l,mid); solve(mid+1,r);
	int i,n=mid-l+1,m=r-mid;
	int len=1;
	while(len<=(n+m)) len<<=1;
	for(i=0;i<n;i++) a[i].x=C[l+i];
	for(i=0;i<m;i++) b[i].x=D[mid+i+1];
	fft(a,len,1), fft(b,len,1);
	for(i=0;i<len;i++) a[i]=a[i]*b[i];
	fft(a,len,-1);
	for(i=0;i<n+m;i++) {
		ans[l+mid+i+1]+=ll(a[i].x+0.5);
	}
	for(i=0;i<len;i++) a[i]=b[i]=cp(0,0);
	int t=0;
	for(i=mid;i>=l;i--) a[t++].x=D[i];
	for(i=mid+1;i<=r;i++) b[i-mid-1].x=C[i];
	fft(a,len,1), fft(b,len,1);
	for(i=0;i<len;i++) a[i]=a[i]*b[i];
	fft(a,len,-1);
	for(i=1;i<=r-l;i++) {
		ans[i]+=ll(a[i-1].x+0.5);
	}
	for(i=0;i<len;i++) a[i]=b[i]=cp(0,0);
}
int main() {
	int T;
	scanf("%d",&T);
	while(T--) {
		memset(C,0,sizeof(C));
		memset(D,0,sizeof(D));
		memset(ans,0,sizeof(ans));
		scanf("%d%d%d",&n,&m,&q);
		int i,x;
		for(i=1;i<=n;i++) scanf("%d",&x),C[x]++;
		for(i=1;i<=m;i++) scanf("%d",&x),D[x]++;
		for(i=0;i<=50000;i++) {
			ans[0]+=ll(C[i])*D[i];
		}
		solve(0,50000);
		while(q--) {
			scanf("%d",&x);
			printf("%lld\n",ans[x]);
		}
	}
}
BZOJ4836: [Lydsy1704月赛]二元运算的更多相关文章
- BZOJ4836 [Lydsy1704月赛]二元运算 分治 多项式 FFT
		原文链接http://www.cnblogs.com/zhouzhendong/p/8830036.html 题目传送门 - BZOJ4836 题意 定义二元运算$opt$满足 $$x\ opt\ y ... 
- BZOJ4836: [Lydsy1704月赛]二元运算【分治FFT】【卡常(没卡过)】
		Description 定义二元运算 opt 满足 现在给定一个长为 n 的数列 a 和一个长为 m 的数列 b ,接下来有 q 次询问.每次询问给定一个数字 c 你需要求出有多少对 (i, j) 使 ... 
- bzoj 4836 [Lydsy1704月赛]二元运算 分治FFT+生成函数
		[Lydsy1704月赛]二元运算 Time Limit: 8 Sec Memory Limit: 128 MBSubmit: 577 Solved: 201[Submit][Status][Di ... 
- BZOJ 4836: [Lydsy1704月赛]二元运算 分治FFT
		Code: #include<bits/stdc++.h> #define ll long long #define maxn 500000 #define setIO(s) freope ... 
- BZOJ4833: [Lydsy1704月赛]最小公倍佩尔数(min-max容斥&莫比乌斯反演)(线性多项式多个数求LCM)
		4833: [Lydsy1704月赛]最小公倍佩尔数 Time Limit: 8 Sec Memory Limit: 128 MBSubmit: 240 Solved: 118[Submit][S ... 
- bzoj 4836: [Lydsy2017年4月月赛]二元运算  -- 分治+FFT
		4836: [Lydsy2017年4月月赛]二元运算 Time Limit: 8 Sec Memory Limit: 128 MB Description 定义二元运算 opt 满足 现在给定一 ... 
- BZOJ4831: [Lydsy1704月赛]序列操作(非常nice的DP& 贪心)
		4831: [Lydsy1704月赛]序列操作 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 250 Solved: 93[Submit][Statu ... 
- bzoj 4831 [Lydsy1704月赛]序列操作 dp
		[Lydsy1704月赛]序列操作 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 203 Solved: 69[Submit][Status][Dis ... 
- [Lydsy1704月赛]  最小公倍佩尔数
		4833: [Lydsy1704月赛]最小公倍佩尔数 Time Limit: 8 Sec Memory Limit: 128 MBSubmit: 202 Solved: 99[Submit][St ... 
随机推荐
- MySQL系列:innodb源代码分析之线程并发同步机制
			innodb是一个多线程并发的存储引擎,内部的读写都是用多线程来实现的,所以innodb内部实现了一个比較高效的并发同步机制. innodb并没有直接使用系统提供的锁(latch)同步结构,而是对其进 ... 
- Nginx与Apache的Rewrite规则的区别
			一.Nginx Rewrite规则相关指令 Nginx Rewrite规则相关指令有if.rewrite.set.return.break等,其中rewrite是最关键的指令.一个简单的Nginx R ... 
- 小程序框架MpVue踩坑日记(一)
			小程序也做了几个小功能模块了,总觉得需要总结一下,踩坑什么的还是得记录一下啊. 好吧,其实是为了方便回顾 首先,说到小程序框架,大家都知道wepy,不过,我是没用过 美团开发团队到mpvue到是个实在 ... 
- python 基础 1.5 python数据类型(二)--列表常用方法示例
			#/usr/bin/python #coding=utf-8 #@Time :2017/10/12 23:30 #@Auther :liuzhenchuan #@File :列表.py lis ... 
- 八大排序的python实现
			以下是八大排序的python实现,供以后参考,日后扩展 一.插入排序 #-*- coding:utf-8 -*- ''' 描述 插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一 ... 
- 一些重要的地址:md5在线解密破解
			md5在线解密破解:https://www.cmd5.com/ 
- 九度OJ 1169:比较奇偶数个数 (基础题)
			时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:9459 解决:3146 题目描述: 第一行输入一个数,为n,第二行输入n个数,这n个数中,如果偶数比奇数多,输出NO,否则输出YES. 输入 ... 
- zendstudio 13.0
			官网原版下载 http://downloads.zend.com/studio-eclipse/13.0.0/ZendStudio-13.0.0-win32.win32.x86.exe 破解补丁: 链 ... 
- JavaScript及jQuery学习小结
			最近几天学习了很多关于JavaScript和jQuery的文章,稍作梳理后,总结如下. 1.jQuery入门系列 环境搭建 只需引用一个jQuery库文件,即可完成jQuery的环境搭建. 选择器 j ... 
- x86 寻址学习
			x86 寻址方式众多,什么直接寻址.间接寻址.基址寻址.基址变址寻址等等让人眼花缭乱,而 AT&T 语法对内存寻址方式做了一个很好的统一,其格式为 section:displacement(b ... 
