結果
問題 | No.206 数の積集合を求めるクエリ |
ユーザー | kopricky |
提出日時 | 2017-07-23 07:10:54 |
言語 | C++11 (gcc 11.4.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 2,843 bytes |
コンパイル時間 | 1,655 ms |
コンパイル使用メモリ | 165,888 KB |
実行使用メモリ | 17,484 KB |
最終ジャッジ日時 | 2024-10-09 10:42:40 |
合計ジャッジ時間 | 5,100 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | WA | - |
testcase_01 | WA | - |
testcase_02 | WA | - |
testcase_03 | WA | - |
testcase_04 | WA | - |
testcase_05 | WA | - |
testcase_06 | WA | - |
testcase_07 | WA | - |
testcase_08 | WA | - |
testcase_09 | WA | - |
testcase_10 | WA | - |
testcase_11 | WA | - |
testcase_12 | WA | - |
testcase_13 | WA | - |
testcase_14 | WA | - |
testcase_15 | WA | - |
testcase_16 | WA | - |
testcase_17 | WA | - |
testcase_18 | WA | - |
testcase_19 | WA | - |
testcase_20 | WA | - |
testcase_21 | WA | - |
testcase_22 | WA | - |
testcase_23 | WA | - |
testcase_24 | WA | - |
testcase_25 | WA | - |
testcase_26 | WA | - |
testcase_27 | WA | - |
testcase_28 | WA | - |
testcase_29 | WA | - |
testcase_30 | WA | - |
コンパイルメッセージ
main.cpp: In function ‘int main()’: main.cpp:93:10: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 93 | scanf("%d%d%d",&l,&m,&n); | ~~~~~^~~~~~~~~~~~~~~~~~~ main.cpp:96:14: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 96 | scanf("%d",&a[i]); | ~~~~~^~~~~~~~~~~~ main.cpp:99:14: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 99 | scanf("%d",&b[i]); | ~~~~~^~~~~~~~~~~~ main.cpp:112:10: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 112 | scanf("%d",&q); | ~~~~~^~~~~~~~~
ソースコード
#include <bits/stdc++.h> #define ll long long #define INF 1000000005 #define MOD 1000000007 #define EPS 1e-10 #define rep(i,n) for(int i=0;i<(int)n;++i) #define each(a, b) for(auto (a): (b)) #define all(v) (v).begin(),(v).end() #define fi first #define se second #define pb push_back #define show(x) cout <<#x<<" = "<<(x)<<endl #define spair(p) cout <<#p<<": "<<p.fi<<" "<<p.se<<endl #define svec(v) cout<<#v<<":";rep(kbrni,v.size())cout<<" "<<v[kbrni];cout<<endl #define sset(s) cout<<#s<<":";each(kbrni,s)cout <<" "<<kbrni;cout<<endl using namespace std; typedef pair<int,int>P; typedef complex<double>C; const int MAX_N = 100005; const double PI = 4*atan(1.0); //aにはAiおよびBi(係数)が入っている vector<C> FFT(double theta, const vector<C>& a){ int n = (int)a.size(); vector<C> ret = a; for(int m=n; m>=2; m>>=1){ int mh = m>>1; rep(i,mh){ C w = exp(i*theta*C(0,1)); for(int j=i; j<n; j+=m){ int k = j+mh; C x = ret[j] - ret[k]; ret[j] += ret[k]; ret[k] = w*x; } } theta *= 2; } int i=0; for(int j=1; j<n-1; j++){ for(int k=n>>1; k>(i^=k); k>>= 1){ } if(j < i) swap(ret[i], ret[j]); } return ret; } //畳み込み template<class T> vector<T> Convolution(const vector<T> &lhs, const vector<T> &rhs){ int n = 1; while(n <= (int)(lhs.size() + rhs.size())){ n <<= 1; } vector<C> temp1(n); vector<C> temp2(n); for(int i=0; i<n; i++){ if(i < (int)lhs.size()){ temp1[i] = C(lhs[i], 0); if(i < (int)rhs.size()){ temp2[i] = C(rhs[i], 0); } }else if(i < (int)rhs.size()){ temp2[i] = C(rhs[i], 0); }else{ break; } } //FFTにかけて周波数分解 temp1 = FFT(2.0*PI/n, temp1); temp2 = FFT(2.0*PI/n, temp2); //周波数同士で掛け算 rep(i,n){ temp1[i] *= temp2[i]; } //逆FFTをかけて元に戻す temp1 = FFT(-2.0*PI/n, temp1); vector<T> ret(n); rep(i,n){ ret[i] = (T)(temp1[i].real()/n + 0.5); //T=intの時用 } svec(ret); return ret; } int main() { int l,m,n; scanf("%d%d%d",&l,&m,&n); vector<int> a(l),b(m); rep(i,l){ scanf("%d",&a[i]); } rep(i,m){ scanf("%d",&b[i]); b[i] = n-b[i]; } vector<int> u(*max_element(all(a))+1,0); vector<int> v(*max_element(all(b))+1,0); rep(i,l){ u[a[i]]++; } rep(i,m){ v[b[i]]++; } vector<int> res = Convolution(u,v); int q; scanf("%d",&q); rep(i,q){ if(n+i < res.size()){ printf("%d\n",res[n+i]); }else{ printf("0\n"); } } }