結果
| 問題 |
No.2490 Escalator
|
| コンテスト | |
| ユーザー |
square1001
|
| 提出日時 | 2023-09-29 21:30:29 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,724 bytes |
| コンパイル時間 | 2,094 ms |
| コンパイル使用メモリ | 205,328 KB |
| 最終ジャッジ日時 | 2025-02-17 03:07:58 |
|
ジャッジサーバーID (参考情報) |
judge2 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 21 WA * 52 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
const long double pi = acos(-1.0);
alignas(64) complex<long double> pw[263168];
void fft(int d, vector<complex<long double> > &v) {
// d = dimensions (i.e. size(v) = 2^d)
if(d == 0) return;
int n = (1 << d);
for(int i = 0, j = 1; j < n - 1; ++j) {
for(int k = n >> 1; k > (i ^= k); k >>= 1);
if(i < j) swap(v[i], v[j]);
}
complex<long double> t;
for(int i = 0; i < d; ++i) {
for(int j = 0; j < n; j += 2 << i) {
for(int k = j; k < (j | (1 << i)); ++k) {
t = v[k | (1 << i)] * pw[(k - j) | (1 << i)];
v[k | (1 << i)] = v[k] - t;
v[k] += t;
}
}
}
}
void fft_inverse(int d, vector<complex<long double> > &v) {
// d = dimensions (i.e. size(v) = 2^d)
if(d == 0) return;
int n = (1 << d);
for(int i = 0, j = 1; j < n - 1; ++j) {
for(int k = n >> 1; k > (i ^= k); k >>= 1);
if(i < j) swap(v[i], v[j]);
}
complex<long double> t;
for(int i = 0; i < d; ++i) {
for(int j = 0; j < n; j += 2 << i) {
t = v[j | (1 << i)];
v[j | (1 << i)] = v[j] - t;
v[j] += t;
for(int k = j + 1; k < (j | (1 << i)); ++k) {
t = v[k | (1 << i)] * pw[(2 << i) - (k - j)];
v[k | (1 << i)] = v[k] + t;
v[k] -= t;
}
}
}
for(int i = 0; i < n; ++i) {
v[i] /= n;
}
}
vector<long double> convolve(int n, const vector<long double>& va, const vector<long double>& vb) {
int d = 0;
while((1 << d) < 2 * n) ++d;
for(int i = 0; i < d; ++i) {
complex<long double> r = polar(1.0L, pi / (1 << i));
pw[1 << i] = 1.0;
for(int j = (1 << i) + 1; j < 2 << i; ++j) {
pw[j] = pw[j - 1] * r;
}
}
vector<complex<long double> > a(1 << d), b(1 << d);
for(int i = 0; i < n; ++i) {
a[i] = va[i];
b[i] = vb[i];
}
fft(d, a);
fft(d, b);
for(int i = 0; i < 1 << d; ++i) {
a[i] *= b[i];
}
fft_inverse(d, a);
vector<long double> res(2 * n - 1);
for (int i = 0; i <= 2 * n - 2; i++) {
res[i] = a[i].real();
}
return res;
}
int main() {
cin.tie(0);
ios_base::sync_with_stdio(false);
int N;
cin >> N;
vector<int> A(2 * N);
for (int i = 0; i < 2 * N; i++) {
cin >> A[i];
if (A[i] != -1) {
A[i] -= 1;
}
}
mt19937_64 mt(1);
uniform_real_distribution<long double> p(1.0, 2.0);
vector<long double> g(2 * N);
for (int i = 0; i < 2 * N; i++) {
g[i] = p(mt);
}
vector<long double> sa(2 * N), sb(2 * N);
for (int i = 0; i < 2 * N; i++) {
if (A[i] != -1) {
sa[i] = g[A[i]];
sb[i] = 1.0L / g[A[i]];
}
}
vector<long double> res = convolve(2 * N, sa, sb);
res.resize(4 * N);
bool ans = false;
for (int i = 0; i < 2 * N; i++) {
long double z = res[i] + res[i + 2 * N];
long double f = round(z);
if (abs(z - f) < 1.0e-9L) {
ans = true;
}
}
cout << (ans ? "Yes" : "No") << endl;
return 0;
}
square1001