結果
問題 | No.206 数の積集合を求めるクエリ |
ユーザー | cormoran |
提出日時 | 2016-08-16 23:12:59 |
言語 | C++14 (gcc 12.3.0 + boost 1.83.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 2,768 bytes |
コンパイル時間 | 1,235 ms |
コンパイル使用メモリ | 89,736 KB |
実行使用メモリ | 28,924 KB |
最終ジャッジ日時 | 2024-11-07 18:32:15 |
合計ジャッジ時間 | 7,292 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 2 ms
5,248 KB |
testcase_01 | AC | 2 ms
5,248 KB |
testcase_02 | AC | 2 ms
5,248 KB |
testcase_03 | AC | 2 ms
5,248 KB |
testcase_04 | AC | 2 ms
5,248 KB |
testcase_05 | AC | 2 ms
5,248 KB |
testcase_06 | AC | 8 ms
5,248 KB |
testcase_07 | AC | 8 ms
5,248 KB |
testcase_08 | AC | 8 ms
5,248 KB |
testcase_09 | AC | 9 ms
5,248 KB |
testcase_10 | WA | - |
testcase_11 | AC | 2 ms
5,248 KB |
testcase_12 | AC | 14 ms
5,248 KB |
testcase_13 | AC | 13 ms
5,248 KB |
testcase_14 | AC | 14 ms
5,248 KB |
testcase_15 | AC | 13 ms
5,248 KB |
testcase_16 | AC | 14 ms
5,248 KB |
testcase_17 | AC | 259 ms
28,920 KB |
testcase_18 | AC | 251 ms
28,792 KB |
testcase_19 | AC | 255 ms
28,924 KB |
testcase_20 | AC | 250 ms
28,916 KB |
testcase_21 | AC | 251 ms
28,788 KB |
testcase_22 | AC | 252 ms
28,920 KB |
testcase_23 | AC | 256 ms
28,792 KB |
testcase_24 | AC | 434 ms
28,796 KB |
testcase_25 | AC | 435 ms
28,796 KB |
testcase_26 | AC | 421 ms
28,792 KB |
testcase_27 | WA | - |
testcase_28 | AC | 432 ms
28,920 KB |
testcase_29 | AC | 428 ms
28,788 KB |
testcase_30 | WA | - |
ソースコード
#include<iostream> #include<vector> #include<cassert> #include<string> #include<algorithm> #include<cstdio> #include<cstdlib> #include<cmath> #include<complex> using namespace std; using ll = long long; #define rep(i, j) for(int i=0; i < (int)(j); i++) #define repeat(i, j, k) for(int i = (j); i < (int)(k); i++) #define all(v) v.begin(),v.end() #define debug(x) cerr << #x << " : " << x << endl // vector template<class T> istream& operator >> (istream &is , vector<T> &v) { for(T &a : v) is >> a; return is; } // pair template<class T, class U> ostream& operator << (ostream &os , const pair<T, U> &v) { return os << "<" << v.first << " " << v.second << ">"; } void fft_base(vector<complex<double>> &f, int sign) { int n = f.size(); if (n == 1) return; assert(n == pow(2, log2(n))); // f.size() must be 2^i vector<complex<double>> f0(n / 2), f1(n / 2); for (int i = 0; i < n / 2; i++) { f0[i] = f[2 * i + 0]; f1[i] = f[2 * i + 1]; } fft_base(f0, sign); fft_base(f1, sign); // zeta := exp{2pi * sqrt(-1) / n} const complex<double> zeta = polar(1.0, sign * 2 * M_PI / n); complex<double> pow_zeta = 1; for (int i = 0; i < n; i++) { f[i] = f0[i % (n / 2)] + pow_zeta * f1[i % (n / 2)]; pow_zeta *= zeta; } return; } vector<complex<double>> fft(vector<complex<double>> f) { int n = f.size(); n = pow(2, ceil(log2(n))); f.resize(n, 0); fft_base(f, 1); return f; } vector<complex<double>> ifft(vector<complex<double>> f) { int n = f.size(); n = pow(2, ceil(log2(n))); f.resize(n, 0); fft_base(f, -1); for (int i = 0; i < n; i++) f[i] /= n; return f; } //畳み込み template <typename RET_T, typename T> vector<RET_T> convolution(const vector<T> &A, const vector<T> &B) { int n = A.size() + B.size() + 1; n = pow(2, ceil(log2(n))); vector<complex<double>> f(n, 0), g(n, 0); for (int i = 0; i < (int)A.size(); i++) f[i] = A[i]; for (int i = 0; i < (int)B.size(); i++) g[i] = B[i]; f = fft(f); g = fft(g); vector<complex<double>> h(n); for (int i = 0; i < n; i++) h[i] = f[i] * g[i]; h = ifft(h); vector<RET_T> ret(n); for (int i = 0; i < n; i++) ret[i] = h[i].real(); return ret; } bool solve() { int L, M, N; cin >> L >> M >> N; vector<int> a(N + 1), b(N + 1); rep(i, L) { int A; cin >> A; a[A] = 1; } rep(i, M) { int B; cin >> B; b[N - B] = 1; } vector<double> c = convolution<double, int>(a, b); int Q; cin >> Q; rep(i, Q) { cout << round(c[N + i]) << endl; } return false; } int main() { cin.tie(0); ios::sync_with_stdio(false); while(solve()); return 0; }