結果
問題 | No.2421 entersys? |
ユーザー | toshihoge |
提出日時 | 2023-08-12 14:29:26 |
言語 | C++14 (gcc 12.3.0 + boost 1.83.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 14,566 bytes |
コンパイル時間 | 4,778 ms |
コンパイル使用メモリ | 213,544 KB |
実行使用メモリ | 166,464 KB |
最終ジャッジ日時 | 2024-11-19 19:46:28 |
合計ジャッジ時間 | 36,870 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
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 | AC | 1,526 ms
132,156 KB |
testcase_23 | WA | - |
testcase_24 | WA | - |
testcase_25 | WA | - |
testcase_26 | WA | - |
testcase_27 | WA | - |
testcase_28 | WA | - |
ソースコード
#include <algorithm> #include <atcoder/all> #include <chrono> #include <complex> #include <functional> #include <ios> #include <iostream> #include <limits> #include <map> #include <queue> #include <random> #include <set> #include <unordered_map> #include <unordered_set> #include <vector> using namespace std; using namespace atcoder; typedef long long ll; typedef unsigned long long ull; typedef pair<int, int> pii; typedef pair<ll, ll> pll; typedef vector<int> vi; typedef vector<vi> vvi; typedef vector<ll> vll; typedef vector<vll> vvll; typedef vector<ull> vull; typedef vector<vull> vvull; typedef vector<string> vstring; typedef complex<double> cd; typedef complex<int> ci; typedef complex<ll> cll; string toYN(bool b) { return b ? "Yes" : "No"; } // https://ei1333.github.io/luzhiled/snippets/other/random-number-generator.html struct RandomNumberGenerator { mt19937 mt; RandomNumberGenerator() : mt(chrono::steady_clock::now().time_since_epoch().count()) {} int operator()(int a, int b) { // [a, b) uniform_int_distribution<int> dist(a, b - 1); return dist(mt); } int operator()(int b) { // [0, b) return (*this)(0, b); } }; // loop macro #define REP(i, n) for (int i = 0; i < (int)(n); i++) // read helper template <typename T> inline void read(int n, std::vector<T> &array) { array = std::vector<T>(n); REP(i, n) { cin >> array[i]; } } template <typename T> inline void read(int n, int m, std::vector<std::vector<T>> &matrix) { matrix = std::vector<std::vector<T>>(n, std::vector<T>(m)); REP(i, n) { REP(j, m) { cin >> matrix[i][j]; } } } // write helper template <typename T> inline void write(std::vector<T> array) { for (const T &t : array) { cout << t << endl; } } template <typename T> inline void writeOneLine(std::vector<T> array) { bool first = true; for (const T &t : array) { if (!first) { cout << " "; } cout << t; first = false; } cout << endl; } // vector helper // test by iterator_macro_test.cpp template <typename T> inline typename vector<T>::const_iterator moreThan( const std::vector<T> &sortedVector, const T &key) { return upper_bound(sortedVector.begin(), sortedVector.end(), key); } template <typename T> inline typename vector<T>::const_iterator moreThanEq( const std::vector<T> &sortedVector, const T &key) { return lower_bound(sortedVector.begin(), sortedVector.end(), key); } template <typename T> inline typename vector<T>::const_iterator lessThan( const std::vector<T> &sortedVector, const T &key) { typename vector<T>::const_iterator it = lower_bound(sortedVector.begin(), sortedVector.end(), key); return it == sortedVector.begin() ? sortedVector.end() : --it; } template <typename T> inline typename vector<T>::const_iterator lessThanEq( const std::vector<T> &sortedVector, const T &key) { typename vector<T>::const_iterator it = upper_bound(sortedVector.begin(), sortedVector.end(), key); return it == sortedVector.begin() ? sortedVector.end() : --it; } // set helper // test by iterator_macro_test.cpp template <typename T> inline typename set<T>::const_iterator moreThan(const set<T> &container, const T &key) { return container.upper_bound(key); } template <typename T> inline typename set<T>::const_iterator moreThanEq(const set<T> &container, const T &key) { return container.lower_bound(key); } template <typename T> inline typename set<T>::const_iterator lessThan(const set<T> &container, const T &key) { typename set<T>::const_iterator it = container.lower_bound(key); return it == container.begin() ? container.end() : --it; } template <typename T> inline typename set<T>::const_iterator lessThanEq(const set<T> &container, const T &key) { typename set<T>::const_iterator it = container.upper_bound(key); return it == container.begin() ? container.end() : --it; } // multiset helper template <typename T> inline typename multiset<T>::const_iterator moreThan( const multiset<T> &container, T key) { return container.upper_bound(key); } template <typename T> inline typename multiset<T>::const_iterator moreThanEq( const multiset<T> &container, T key) { return container.lower_bound(key); } template <typename T> inline typename multiset<T>::const_iterator lessThan( const multiset<T> &container, T key) { typename set<T>::const_iterator it = container.lower_bound(key); return it == container.begin() ? container.end() : --it; } template <typename T> inline typename multiset<T>::const_iterator lessThanEq( const multiset<T> &container, T key) { typename set<T>::const_iterator it = container.upper_bound(key); return it == container.begin() ? container.end() : --it; } // map helper // test by iterator_macro_test.cpp template <typename Key, typename Value> inline typename map<Key, Value>::const_iterator moreThan( const map<Key, Value> &container, const Key &key) { return container.upper_bound(key); } template <typename Key, typename Value> inline typename map<Key, Value>::const_iterator moreThanEq( const map<Key, Value> &container, const Key &key) { return container.lower_bound(key); } template <typename Key, typename Value> inline typename map<Key, Value>::const_iterator lessThan( const map<Key, Value> &container, const Key &key) { typename map<Key, Value>::const_iterator it = container.lower_bound(key); return it == container.begin() ? container.end() : --it; } template <typename Key, typename Value> inline typename map<Key, Value>::const_iterator lessThanEq( const map<Key, Value> &container, const Key &key) { typename map<Key, Value>::const_iterator it = container.upper_bound(key); return it == container.begin() ? container.end() : --it; } // https://qiita.com/ganyariya/items/df35d253726269bda436 // // Usage: unordered_map<pair<int, int>, int, HashPair> mp; struct HashPair { template <class T1, class T2> size_t operator()(const pair<T1, T2> &p) const { auto hash1 = hash<T1>{}(p.first); auto hash2 = hash<T2>{}(p.second); size_t seed = 0; seed ^= hash1 + 0x9e3779b9 + (seed << 6) + (seed >> 2); seed ^= hash2 + 0x9e3779b9 + (seed << 6) + (seed >> 2); return seed; } }; // debug macro // https://www.creativ.xyz/dump-cpp-652/ // // test by dump_macro_test.cpp #define repi(itr, ds) for (auto itr = ds.begin(); itr != ds.end(); itr++) // vector template <typename T> istream &operator>>(istream &is, vector<T> &vec) { for (T &x : vec) is >> x; return is; } // pair template <typename T, typename U> ostream &operator<<(ostream &os, const pair<T, U> &pair_var) { os << "(" << pair_var.first << ", " << pair_var.second << ")"; return os; } // vector template <typename T> ostream &operator<<(ostream &os, const vector<T> &vec) { os << "{"; for (unsigned int i = 0; i < vec.size(); i++) { os << vec[i] << (i + 1 == vec.size() ? "" : ", "); } os << "}"; return os; } // deque template <typename T> ostream &operator<<(ostream &os, const deque<T> &vec) { os << "{"; for (unsigned int i = 0; i < vec.size(); i++) { os << vec[i] << (i + 1 == vec.size() ? "" : ", "); } os << "}"; return os; } // map template <typename T, typename U> ostream &operator<<(ostream &os, map<T, U> &map_var) { os << "{"; repi(itr, map_var) { os << *itr; itr++; if (itr != map_var.end()) os << ", "; itr--; } os << "}"; return os; } // set template <typename T> ostream &operator<<(ostream &os, set<T> &set_var) { os << "{"; repi(itr, set_var) { os << *itr; itr++; if (itr != set_var.end()) os << ", "; itr--; } os << "}"; return os; } // unordered_map template <typename T, typename U> ostream &operator<<(ostream &os, unordered_map<T, U> &map_var) { os << "{"; repi(itr, map_var) { os << *itr << ", "; } os << "}"; return os; } // unordered_map with HashFunction template <typename T, typename U, typename F> ostream &operator<<(ostream &os, unordered_map<T, U, F> &map_var) { os << "{"; repi(itr, map_var) { os << *itr << ", "; } os << "}"; return os; } // unordered_set template <typename T> ostream &operator<<(ostream &os, unordered_set<T> &set_var) { os << "{"; repi(itr, set_var) { os << *itr << ", "; } os << "}"; return os; } // unordered_set with HashFunction template <typename T, typename F> ostream &operator<<(ostream &os, unordered_set<T, F> &set_var) { os << "{"; repi(itr, set_var) { os << *itr << ", "; } os << "}"; return os; } // dynamic_modint ostream &operator<<(ostream &os, const modint &modint_value) { os << modint_value.val(); return os; } // static_modint template <int T> ostream &operator<<(ostream &os, const static_modint<T> &modint_value) { os << modint_value.val(); return os; } #define DUMPOUT cerr void dump_func() { DUMPOUT << endl; } template <class Head, class... Tail> void dump_func(Head &&head, Tail &&...tail) { DUMPOUT << head; if (sizeof...(Tail) > 0) { DUMPOUT << ", "; } dump_func(std::move(tail)...); } #ifdef DEBUG_ #define DEB #define dump(...) \ DUMPOUT << " " << string(#__VA_ARGS__) << ": " \ << "[" << to_string(__LINE__) << ":" << __FUNCTION__ << "]" << endl \ << " ", \ dump_func(__VA_ARGS__) // vector<vector<T>> template <typename T> void dumpVV(const vector<vector<T>> &vec) { DUMPOUT << "{" << endl; for (int i = 0; i < vec.size(); i++) { DUMPOUT << " " << vec[i] << endl; } DUMPOUT << "}" << endl; } template <class S, S (*op)(S, S), S (*e)()> void dumpSegtree(const segtree<S, op, e> &segtree, int size) { DUMPOUT << "{"; for (int i = 0; i < size; i++) { if (i > 0) { DUMPOUT << ", "; } DUMPOUT << segtree.get(i); } DUMPOUT << "}" << endl; } template <class S, S (*op)(S, S), S (*e)(), class F, S (*mapping)(F, S), F (*composition)(F, F), F (*id)()> void dumpLazySegtree( lazy_segtree<S, op, e, F, mapping, composition, id> &lazySegtree, int size) { DUMPOUT << "{"; for (int i = 0; i < size; i++) { if (i > 0) { DUMPOUT << ", "; } DUMPOUT << lazySegtree.get(i); } DUMPOUT << "}" << endl; } #else #define DEB if (false) #define dump(...) // vector<vector<T>> template <typename T> void dumpVV(const vector<vector<T>> &vec) { // Do nothing } template <class S, S (*op)(S, S), S (*e)()> void dumpSegtree(const segtree<S, op, e> &segtree, int size) { // Do nothing } template <class S, S (*op)(S, S), S (*e)(), class F, S (*mapping)(F, S), F (*composition)(F, F), F (*id)()> void dumpLazySegtree( lazy_segtree<S, op, e, F, mapping, composition, id> &lazySegtree, int size) { // Do nothing } #endif typedef tuple<int, string, ll, ll> query; int op(int a, int b) { return a + b; } int e() { return 0; } const int EXIT_EVENT = 0; const int ENTER_EVENT = 1; class Solver { private: const int n; const vstring xs; const vll ls, rs; const int q; const vector<query> qs; map<string, int> xToIdMapping; map<ll, int> tToIdMapping; lazy_segtree<int, op, e, int, op, op, e> seg; vector<map<ll, int>> eventMatrix; void insertEvent(const string &name, ll l, ll r) { int id = xToIdMapping[name]; eventMatrix[id][10 * l - 1] = ENTER_EVENT; eventMatrix[id][10 * r + 1] = EXIT_EVENT; int tId1 = tToIdMapping[10 * l - 1]; int tId2 = tToIdMapping[10 * r + 1]; seg.apply(tId1, tId2 + 1, 1); } public: Solver(int n, const vstring &xs, const vll &ls, const vll &rs, int q, const vector<query> &qs) : n(n), xs(xs), ls(ls), rs(rs), q(q), qs(qs) {} vstring solve() { xToIdMapping = map<string, int>(); for (const auto &x : xs) { if (!xToIdMapping.count(x)) { int nextId = xToIdMapping.size(); xToIdMapping[x] = nextId; } } for (const auto &p : qs) { string x = get<1>(p); if (!xToIdMapping.count(x)) { int nextId = xToIdMapping.size(); xToIdMapping[x] = nextId; } } set<ll> tSet; for (ll l : ls) { tSet.insert(10 * l - 1); tSet.insert(10 * l); } for (ll r : rs) { tSet.insert(10 * r); tSet.insert(10 * r + 1); } for (const auto &p : qs) { ll l = get<2>(p); ll r = get<3>(p); tSet.insert(10 * l - 1); tSet.insert(10 * l); tSet.insert(10 * r); tSet.insert(10 * r + 1); } tToIdMapping = map<ll, int>(); for (ll t : tSet) { int nextId = tToIdMapping.size(); tToIdMapping[t] = nextId; } seg = lazy_segtree<int, op, e, int, op, op, e>(tToIdMapping.size()); eventMatrix = vector<map<ll, int>>(xToIdMapping.size()); for (int i = 0; i < eventMatrix.size(); i++) { eventMatrix[i][0] = EXIT_EVENT; eventMatrix[i][1e11] = ENTER_EVENT; } for (int i = 0; i < n; i++) { insertEvent(xs[i], ls[i], rs[i]); } vector<string> answers; for (int i = 0; i < q; i++) { int qType = get<0>(qs[i]); if (qType == 1) { string x = get<1>(qs[i]); ll t = get<2>(qs[i]); int id = xToIdMapping[x]; auto it = moreThan(eventMatrix[id], 10 * t); answers.push_back(it->second == EXIT_EVENT ? "YES" : "NO"); } else if (qType == 2) { ll t = get<2>(qs[i]); int id = tToIdMapping[10 * t]; answers.push_back(to_string(seg.get(id))); } else if (qType == 3) { string x = get<1>(qs[i]); ll l = get<2>(qs[i]); ll r = get<3>(qs[i]); insertEvent(x, l, r); } } return answers; } }; int main(void) { ios::sync_with_stdio(false); cin.tie(nullptr); // Implement here, int n; cin >> n; vstring xs(n); vll ls(n), rs(n); for (int i = 0; i < n; i++) { cin >> xs[i] >> ls[i] >> rs[i]; } int q; cin >> q; vector<query> qs; for (int i = 0; i < q; i++) { int type; cin >> type; if (type == 1) { string x; int t; cin >> x >> t; qs.push_back(query(1, x, t, 0)); } else if (type == 2) { int t; cin >> t; qs.push_back(query(2, "", t, 0)); } else if (type == 3) { string x; int l, r; cin >> x >> l >> r; qs.push_back(query(3, x, l, r)); } } write(Solver(n, xs, ls, rs, q, qs).solve()); }