結果
問題 | No.387 ハンコ |
ユーザー | yosupot |
提出日時 | 2018-11-07 15:52:33 |
言語 | C++17 (gcc 12.3.0 + boost 1.83.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 3,634 bytes |
コンパイル時間 | 1,869 ms |
コンパイル使用メモリ | 210,752 KB |
実行使用メモリ | 7,808 KB |
最終ジャッジ日時 | 2024-11-20 20:44:37 |
合計ジャッジ時間 | 9,346 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | WA | - |
testcase_01 | AC | 937 ms
7,808 KB |
testcase_02 | WA | - |
testcase_03 | WA | - |
testcase_04 | AC | 133 ms
6,816 KB |
testcase_05 | AC | 375 ms
7,040 KB |
testcase_06 | WA | - |
testcase_07 | AC | 909 ms
6,820 KB |
testcase_08 | AC | 922 ms
6,816 KB |
ソースコード
#include <bits/stdc++.h> using namespace std; using uint = unsigned int; using ll = long long; using ull = unsigned long long; constexpr ll TEN(int n) { return (n == 0) ? 1 : 10 * TEN(n - 1); } template<class T> using V = vector<T>; template<class T> using VV = V<V<T>>; struct BitVec { size_t n; V<ull> d; explicit BitVec(size_t _n = 0) : n(_n), d((n + 63) / 64) {} size_t size() const { return n; } bool operator[](size_t i) const { return bool((d[i / 64] >> (i % 64)) & 1); } void set(size_t i, bool f) { if (f) d[i / 64] |= (1ULL << (i % 64)); else d[i / 64] &= ~(1ULL << (i % 64)); } void reset() { fill(d.begin(), d.end(), 0); } void push_back(bool f) { if (n % 64 == 0) d.push_back(0); set(n, f); n++; } void swap_elms(size_t a, size_t b) { bool f = (*this)[a]; set(a, (*this)[b]); set(b, f); } template <class OP> BitVec& op1(OP op) { for (auto& x: d) x = op(x); return *this; } template <class OP> BitVec& op2(const BitVec& r, OP op) { assert(n == r.n); for (size_t i = 0; i < d.size(); i++) d[i] = op(d[i], r.d[i]); return *this; } BitVec& operator&=(const BitVec& r) { return op2(r, bit_and<ull>()); } BitVec& operator|=(const BitVec& r) { return op2(r, bit_or<ull>()); } BitVec& operator^=(const BitVec& r) { return op2(r, bit_xor<ull>()); } BitVec& operator<<=(const size_t& s) { ptrdiff_t block = s / 64, rem = s % 64; if (d.size() <= block) { reset(); return *this; } for (ptrdiff_t i = d.size() - 1; i >= block; i--) { if (rem == 0) d[i] = d[i - block]; else { ull u = (d[i - block] << rem); if (i > block) u |= (d[i - block - 1]) >> (64 - rem); d[i] = u; } } fill(d.begin(), d.begin() + block, 0); return *this; } BitVec& operator>>=(const size_t& s) { size_t block = s / 64, rem = s % 64; for (size_t i = 0; i < d.size() - block; i++) { if (rem == 0) d[i] = d[i + block]; else { ull u = (d[i + block] << rem); if (i + block + 1 < d.size()) u |= (d[i + block + 1]) >> (64 - rem); d[i] = u; } } for (size_t i = d.size() - block; i < d.size(); i++) d[i] = 0; return *this; } BitVec operator&(const BitVec& r) const { return BitVec(*this) &= r; } BitVec operator|(const BitVec& r) const { return BitVec(*this) |= r; } BitVec operator^(const BitVec& r) const { return BitVec(*this) ^= r; } BitVec operator<<(const size_t& s) const { return BitVec(*this) <<= s; } BitVec operator>>(const size_t& s) const { return BitVec(*this) >>= s; } }; int main() { int n; scanf("%d", &n); VV<int> g(100000); for (int i = 0; i < n; i++) { int a; scanf("%d", &a); g[a].push_back(i); } BitVec mp(2*n - 1); for (int i = 0; i < n; i++) { int x; scanf("%d", &x); if (x == 1) { mp.set(i, true); } } BitVec ans(2*n - 1); for (int i = 0; i < 100000; i++) { BitVec res(2*n - 1); for (int d: g[i]) { res |= mp << d; } ans ^= res; } for (int i = 0; i < 2*n-1; i++) { if (ans[i]) { printf("ODD\n"); } else { printf("EVEN\n"); } } return 0; }