結果
| 問題 |
No.206 数の積集合を求めるクエリ
|
| コンテスト | |
| ユーザー |
ei1333333
|
| 提出日時 | 2017-09-01 01:08:38 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 491 ms / 7,000 ms |
| コード長 | 1,334 bytes |
| コンパイル時間 | 2,495 ms |
| コンパイル使用メモリ | 200,588 KB |
| 最終ジャッジ日時 | 2025-01-05 02:35:27 |
|
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 28 |
ソースコード
#include<bits/stdc++.h>
using namespace std;
typedef complex< double > C;
const double PI = acos(-1);
vector< C > DFT(vector< C > &f, int dir)
{
if(f.size() == 1) return (f);
auto n = f.size(), mid = f.size() >> 1;
vector< C > f0(mid), f1(mid);
for(int i = 0; i < mid; i++) f0[i] = f[2 * i + 0];
for(int i = 0; i < mid; i++) f1[i] = f[2 * i + 1];
f0 = DFT(f0, dir), f1 = DFT(f1, dir);
C zeta = polar(1.0, 2 * PI * dir / n), pow_zeta(1.0);
for(int i = 0; i < n; i++) {
f[i] = f0[i < mid ? i : i - mid] + pow_zeta * f1[i < mid ? i : i - mid];
pow_zeta *= zeta;
}
return (f);
}
vector< C > Multiply(vector< C > &g, vector< C > &h)
{
int sz = 1;
while(sz <= g.size() + h.size()) sz *= 2;
g.resize(sz), h.resize(sz);
auto gg = DFT(g, 1), hh = DFT(h, 1);
vector< C > ff(sz);
for(int i = 0; i < sz; i++) ff[i] = gg[i] * hh[i];
auto get = DFT(ff, -1);
for(int i = 0; i < sz; i++) get[i] /= sz;
return (get);
}
int main()
{
int L, M, N;
cin >> L >> M >> N;
vector< C > a(N + 1), b(N + 1);
for(int i = 0; i < L; i++) {
int x;
cin >> x;
a[x] += 1.0;
}
for(int i = 0; i < M; i++) {
int x;
cin >> x;
b[N - x] += 1.0;
}
auto c = Multiply(a, b);
int Q;
cin >> Q;
for(int i = 0; i < Q; i++) {
cout << (int) (c[i + N].real() + 0.1) << endl;
}
}
ei1333333