結果
| 問題 |
No.206 数の積集合を求めるクエリ
|
| コンテスト | |
| ユーザー |
furuya1223
|
| 提出日時 | 2017-08-27 18:14:58 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 338 ms / 7,000 ms |
| コード長 | 3,033 bytes |
| コンパイル時間 | 1,883 ms |
| コンパイル使用メモリ | 176,036 KB |
| 実行使用メモリ | 30,536 KB |
| 最終ジャッジ日時 | 2024-11-06 06:55:41 |
| 合計ジャッジ時間 | 7,216 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 28 |
ソースコード
#include "bits/stdc++.h"
#include <sys/timeb.h>
#include <fstream>
using namespace std;
#define repl(i,a,b) for(int i=(int)(a);i<(int)(b);i++)
#define rep(i,n) repl(i,0,n)
#define replrev(i,a,b) for(int i=(int)(b)-1;i>=(int)(a);i--)
#define reprev(i,n) replrev(i,0,n)
#define repi(itr,ds) for(auto itr=ds.begin();itr!=ds.end();itr++)
#define all(a) a.begin(),a.end()
#define mp make_pair
#define mt make_tuple
#define INF 2000000000
#define INFL 1000000000000000000LL
#define EPS (1e-8)
#define MOD 1000000007
#define PI 3.141592653589793
#define RMAX 4294967295
typedef long long ll;
typedef pair<int, int> P;
typedef vector<int> vi;
typedef vector<ll> vll;
typedef vector<bool> vb;
typedef vector<char> vc;
typedef vector<string> vs;
typedef vector<double> vd;
typedef vector<P> vP;
typedef vector<vector<int> > vvi;
typedef vector<vector<bool> > vvb;
typedef vector<vector<ll> > vvll;
typedef vector<vector<char> > vvc;
typedef vector<vector<string> > vvs;
typedef vector<vector<double> > vvd;
typedef vector<vector<P> > vvP;
typedef complex<double> comp;
typedef vector<complex<double>> vcomp;
typedef priority_queue<int, vector<int>, greater<int> > pqli;
typedef priority_queue<ll, vector<ll>, greater<ll> > pqlll;
typedef priority_queue<P, vector<P>, greater<P> > pqlP;
//*
// シンプルな構文解析用
typedef string::const_iterator State;
class ParseError {};
//*/
struct Edge {
int from, to, cost;
bool operator<(Edge e) {
return cost < e.cost;
}
};
typedef vector<Edge> Edges;
typedef vector<Edges> Graph;
vector<complex<double>> fft(vector<complex<double>> a, bool rev = 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 i = 1; i < n; i *= 2) {
for (int j = 0; j < i; j++) {
complex<double> w = polar(1.0, 2 * PI / (i * 2) * (rev ? -1 : 1) * j);
for (int k = 0; k < n; k += i * 2) {
complex<double> s = a[j + k + 0];
complex<double> t = a[j + k + i] * w;
a[j + k + 0] = s + t;
a[j + k + i] = s - t;
}
}
}
if (rev) for (int i = 0; i < n; i++) a[i] /= n;
return a;
}
vector<int> mul(vector<int> a, vector<int> b) {
int s = a.size() + b.size() - 1;
int t = 1;
while (t < s) t *= 2;
vector<complex<double>> A(t), B(t);
for (int i = 0; i < a.size(); i++) A[i].real(a[i]);
for (int i = 0; i < b.size(); i++) B[i].real(b[i]);
A = fft(A);
B = fft(B);
for (int i = 0; i < t; i++) A[i] *= B[i];
A = fft(A, true);
a.resize(s);
for (int i = 0; i < s; i++) a[i] = round(A[i].real());
return a;
}
int main() {
int L, M, N;
cin >> L >> M >> N;
vector<int> a(N + 1, 0), b(N + 1, 0);
for (int i = 1; i <= L; i++) {
int na;
scanf("%d", &na);
na--;
a[na] = 1;
}
for (int i = 1; i <= M; i++) {
int nb;
scanf("%d", &nb);
nb--;
b[N - 1 - nb] = 1;
}
int Q;
cin >> Q;
a.resize(N + Q);
a = mul(a, b);
for (int i = N - 1; i < N - 1 + Q; i++) {
printf("%d\n", a[i]);
}
}
furuya1223