結果
| 問題 |
No.206 数の積集合を求めるクエリ
|
| コンテスト | |
| ユーザー |
srjywrdnprkt
|
| 提出日時 | 2022-12-31 03:29:15 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 365 ms / 7,000 ms |
| コード長 | 2,198 bytes |
| コンパイル時間 | 1,093 ms |
| コンパイル使用メモリ | 116,372 KB |
| 最終ジャッジ日時 | 2025-02-09 22:21:37 |
|
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 28 |
ソースコード
#include <iostream>
#include <vector>
#include <cmath>
#include <map>
#include <set>
#include <iomanip>
#include <queue>
#include <algorithm>
#include <numeric>
#include <deque>
#include <complex>
#include <cassert>
using namespace std;
//https://atcoder.jp/contests/atc001/tasks/fft_c
template <typename T>
vector<complex<T>> fft(vector<complex<T>> a, bool inv = false){
int N = a.size();
int h = 0;
for (int i=0; (1<<i)<N; i++) h++;
for (int i=0; i<N; i++){
int j=0;
for (int k=0; k<h; k++) j |= (i>>k & 1) << (h-1-k);
if (i < j) swap(a[i], a[j]);
}
for (int b=1; b<N; b*=2){
for (int j=0; j<b; j++){
complex<T> w = polar(1.0, (2.0*M_PI) / (2.0*b) * j * (inv ? 1 : -1));
for (int k=0; k<N; k += b*2){
complex<T> s = a[j+k];
complex<T> t = a[j+k+b] * w;
a[j+k] = s + t;
a[j+k+b] = s - t;
}
}
}
if (inv){
for (int i=0; i<N; i++) a[i] /= N;
}
return a;
}
template <typename T>
vector<complex<T>> fft(vector<T> a, bool inv = false){
vector<complex<T>> a_complex(a.size());
for (int i=0; i<a.size(); i++) a_complex[i] = complex<T>(a[i], 0);
return fft(a_complex, inv);
}
//convolution c[k] = sum(i=0, k) a[i]b[k-j]
template <typename T>
vector<T> convolution(vector<T> a, vector<T> b){
int s = a.size() + b.size() - 1;
int t = 1;
while(t < s) t *= 2;
a.resize(t); b.resize(t);
vector<complex<T>> A = fft(a); //DFT
vector<complex<T>> B = fft(b); //DFT
for (int i=0; i<t; i++) A[i] *= B[i];
A = fft(A, true); //IDFT
a.resize(s);
for (int i=0; i<s; i++) a[i] = A[i].real();
return a;
}
int main(){
int L, M, N, A, B, Q;
cin >> L >> M >> N;
vector<long double> a(N+1), b(N+1);
for (int i=0; i<L; i++){
cin >> A;
a[A] = 1;
}
for (int i=0; i<M; i++){
cin >> B;
b[B] = 1;
}
reverse(b.begin(), b.end());
vector<long double> c = convolution(a, b);
cin >> Q;
for (int i=0; i<Q; i++){
cout << (int) (c[N+i] + 0.5) << endl;
}
return 0;
}
srjywrdnprkt