結果
問題 | No.945 YKC饅頭 |
ユーザー | iiljj |
提出日時 | 2020-02-08 11:23:46 |
言語 | C++14 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 110 ms / 2,000 ms |
コード長 | 8,645 bytes |
コンパイル時間 | 1,962 ms |
コンパイル使用メモリ | 178,116 KB |
実行使用メモリ | 19,156 KB |
最終ジャッジ日時 | 2024-09-25 08:46:31 |
合計ジャッジ時間 | 7,306 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 2 ms
6,812 KB |
testcase_01 | AC | 2 ms
6,944 KB |
testcase_02 | AC | 2 ms
6,940 KB |
testcase_03 | AC | 2 ms
6,940 KB |
testcase_04 | AC | 2 ms
6,940 KB |
testcase_05 | AC | 2 ms
6,940 KB |
testcase_06 | AC | 2 ms
6,944 KB |
testcase_07 | AC | 2 ms
6,940 KB |
testcase_08 | AC | 2 ms
6,944 KB |
testcase_09 | AC | 3 ms
6,944 KB |
testcase_10 | AC | 2 ms
6,940 KB |
testcase_11 | AC | 2 ms
6,944 KB |
testcase_12 | AC | 3 ms
6,944 KB |
testcase_13 | AC | 3 ms
6,940 KB |
testcase_14 | AC | 2 ms
6,944 KB |
testcase_15 | AC | 2 ms
6,944 KB |
testcase_16 | AC | 2 ms
6,940 KB |
testcase_17 | AC | 3 ms
6,944 KB |
testcase_18 | AC | 3 ms
6,940 KB |
testcase_19 | AC | 2 ms
6,940 KB |
testcase_20 | AC | 2 ms
6,944 KB |
testcase_21 | AC | 2 ms
6,944 KB |
testcase_22 | AC | 2 ms
6,944 KB |
testcase_23 | AC | 3 ms
6,944 KB |
testcase_24 | AC | 2 ms
6,940 KB |
testcase_25 | AC | 2 ms
6,944 KB |
testcase_26 | AC | 2 ms
6,940 KB |
testcase_27 | AC | 2 ms
6,944 KB |
testcase_28 | AC | 2 ms
6,940 KB |
testcase_29 | AC | 2 ms
6,940 KB |
testcase_30 | AC | 2 ms
6,940 KB |
testcase_31 | AC | 6 ms
6,944 KB |
testcase_32 | AC | 3 ms
6,940 KB |
testcase_33 | AC | 18 ms
6,940 KB |
testcase_34 | AC | 41 ms
11,064 KB |
testcase_35 | AC | 92 ms
16,800 KB |
testcase_36 | AC | 60 ms
16,832 KB |
testcase_37 | AC | 55 ms
17,156 KB |
testcase_38 | AC | 47 ms
11,548 KB |
testcase_39 | AC | 12 ms
6,940 KB |
testcase_40 | AC | 10 ms
6,944 KB |
testcase_41 | AC | 4 ms
6,944 KB |
testcase_42 | AC | 66 ms
18,104 KB |
testcase_43 | AC | 54 ms
17,288 KB |
testcase_44 | AC | 53 ms
11,668 KB |
testcase_45 | AC | 68 ms
18,208 KB |
testcase_46 | AC | 3 ms
6,940 KB |
testcase_47 | AC | 43 ms
11,568 KB |
testcase_48 | AC | 12 ms
6,944 KB |
testcase_49 | AC | 22 ms
6,940 KB |
testcase_50 | AC | 72 ms
17,704 KB |
testcase_51 | AC | 103 ms
17,844 KB |
testcase_52 | AC | 110 ms
17,920 KB |
testcase_53 | AC | 90 ms
18,332 KB |
testcase_54 | AC | 82 ms
19,156 KB |
testcase_55 | AC | 110 ms
18,404 KB |
testcase_56 | AC | 3 ms
6,944 KB |
testcase_57 | AC | 2 ms
6,940 KB |
testcase_58 | AC | 50 ms
7,436 KB |
testcase_59 | AC | 61 ms
8,536 KB |
testcase_60 | AC | 22 ms
6,944 KB |
testcase_61 | AC | 53 ms
7,684 KB |
testcase_62 | AC | 51 ms
7,468 KB |
testcase_63 | AC | 3 ms
6,940 KB |
testcase_64 | AC | 24 ms
6,940 KB |
testcase_65 | AC | 19 ms
6,940 KB |
testcase_66 | AC | 18 ms
6,944 KB |
testcase_67 | AC | 37 ms
6,940 KB |
testcase_68 | AC | 23 ms
6,940 KB |
testcase_69 | AC | 9 ms
6,940 KB |
testcase_70 | AC | 10 ms
6,944 KB |
testcase_71 | AC | 10 ms
6,940 KB |
testcase_72 | AC | 29 ms
6,940 KB |
testcase_73 | AC | 58 ms
7,952 KB |
ソースコード
/* #region Head */ #include <bits/stdc++.h> using namespace std; using ll = long long; using ull = unsigned long long; using pll = pair<ll, ll>; using vll = vector<ll>; using vvll = vector<vll>; using vd = vector<double>; using vvd = vector<vd>; using vs = vector<string>; using vvs = vector<vs>; #define REP(i, m, n) for (ll i = (m), i##_len = (ll)(n); i < i##_len; ++(i)) #define REPM(i, m, n) for (ll i = (m), i##_max = (ll)(n); i <= i##_max; ++(i)) #define REPR(i, m, n) for (ll i = (m), i##_min = (ll)(n); i >= i##_min; --(i)) #define REPD(i, m, n, d) for (ll i = (m), i##_len = (ll)(n); i < i##_len; i += (d)) #define REPMD(i, m, n, d) for (ll i = (m), i##_max = (ll)(n); i <= i##_max; i += (d)) #define REPI(itr, ds) for (auto itr = ds.begin(); itr != ds.end(); itr++) #define ALL(x) begin(x), end(x) #define SIZE(x) ((ll)(x).size()) constexpr ll INF = 1'010'000'000'000'000'017LL; constexpr ll MOD = 1'000'000'007LL; // 1e9 + 7 constexpr double EPS = 1e-12; constexpr double PI = 3.14159265358979323846; // vector入力 template <typename T> istream &operator>>(istream &is, vector<T> &vec) { for (T &x : vec) is >> x; return is; } // vector出力 template <typename T> ostream &operator<<(ostream &os, vector<T> &vec) { ll len = SIZE(vec); os << "{"; for (int i = 0; i < len; i++) os << vec[i] << (i == len - 1 ? "" : ", "); os << "}"; return os; } // pair入力 template <typename T, typename U> istream &operator>>(istream &is, pair<T, U> &pair_var) { is >> pair_var.first >> pair_var.second; return is; } // pair出力 template <typename T, typename U> ostream &operator<<(ostream &os, pair<T, U> &pair_var) { os << "(" << pair_var.first << ", " << pair_var.second << ")"; 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; } namespace aux { template <std::size_t...> struct seq { }; template <std::size_t N, std::size_t... Is> struct gen_seq : gen_seq<N - 1, N - 1, Is...> { }; template <std::size_t... Is> struct gen_seq<0, Is...> : seq<Is...> { }; template <class Ch, class Tr, class Tuple, std::size_t... Is> void print_tuple(std::basic_ostream<Ch, Tr> &os, Tuple const &t, seq<Is...>) { using swallow = int[]; (void)swallow{0, (void(os << (Is == 0 ? "" : ", ") << std::get<Is>(t)), 0)...}; } } // namespace aux template <class Ch, class Tr, class... Args> auto operator<<(std::basic_ostream<Ch, Tr> &os, std::tuple<Args...> const &t) -> std::basic_ostream<Ch, Tr> & { os << "("; aux::print_tuple(os, t, aux::gen_seq<sizeof...(Args)>()); return os << ")"; } // dump #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(move(tail)...); } // _max の終端. template <class Head> ll _max(Head &&head) { return head; } // 最大値を求める.max({}) の代わり.これにしないと vscode が壊れる. template <class Head, class... Tail> ll _max(Head &&head, Tail &&... tail) { return max((ll)head, _max((tail)...)); } // _min の終端. template <class Head> ll _min(Head &&head) { return head; } // 最小値を求める.min({}) の代わり.これにしないと vscode が壊れる. template <class Head, class... Tail> ll _min(Head &&head, Tail &&... tail) { return min((ll)head, _min((tail)...)); } // chmax (更新「される」かもしれない値が前) template <typename T, typename U, typename Comp = less<>> bool chmax(T &xmax, const U &x, Comp comp = {}) { if (comp(xmax, x)) { xmax = x; return true; } return false; } // chmin (更新「される」かもしれない値が前) template <typename T, typename U, typename Comp = less<>> bool chmin(T &xmin, const U &x, Comp comp = {}) { if (comp(x, xmin)) { xmin = x; return true; } return false; } // container 内の最初の element のインデックスを探す template <class Container> ll indexof(const Container &container, const typename Container::value_type &element) { auto iter = find(container.begin(), container.end(), element); size_t index = distance(container.begin(), iter); if (index == container.size()) { index = -1; } return index; } // ローカル用 #define DEBUG_ #ifdef DEBUG_ #define DEB #define dump(...) \ DUMPOUT << " " << string(#__VA_ARGS__) << ": " \ << "[" << to_string(__LINE__) << ":" << __FUNCTION__ << "]" \ << endl \ << " ", \ dump_func(__VA_ARGS__) #else #define DEB if (false) #define dump(...) #endif struct AtCoderInitialize { static constexpr int IOS_PREC = 15; static constexpr bool AUTOFLUSH = false; AtCoderInitialize() { ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); cout << fixed << setprecision(IOS_PREC); if (AUTOFLUSH) cout << unitbuf; } } ATCODER_INITIALIZE; /* #endregion */ struct trial { ll idx; ll left; ll right; char chr; // sort ではこちらを利用 left, idx, ... が若い順に bool operator<(const trial &rhs) const { if (left != rhs.left) return left < rhs.left; else return idx < rhs.idx; // return right == rhs.right ? chr < rhs.chr : (left == rhs.left ? idx < rhs.idx : left < rhs.left); } // queue ではこちらを利用 idx, left, ... が若い順に bool operator>(const trial &rhs) const { return idx > rhs.idx; // idx は絶対に被らない // return right == rhs.right ? chr > rhs.chr : (idx == rhs.idx ? left > rhs.left : idx > rhs.idx); } }; /** Y理事長は,最近yuki饅頭を皿に並べることに夢中である. yuki饅頭には,'Y','K','C'の3種類の刻印の入った饅頭が存在する. Y理事長は,以下のルールのもと,左から順に1, 2, ..., Nの番号のついたN枚の皿にM回の操作を施して饅頭を並べていく. ・i(1 <= i <= M)回目の操作では,2つの整数L_iとR_iと饅頭の種類T_iが与えられる.これは,左からL_i, L_i+1, ..., R_i番目の皿にT_iの刻印の入った饅頭を置くことを表す. ・但し,各操作について,ある皿にすでに饅頭が置かれている場合,その皿には饅頭を新たに置くことはしない. M回の操作の結果,最終的にどの刻印の饅頭が全体でいくつ置かれたかを求めよ. ・1 <= N, M <= 200000 (= 2 × 10^5) ・1 <= L_i <= R_i <= N(1 <= i <= M) ・T_i(1 <= i <= M)は'Y','K','C'のいずれかである. */ void solve() { ll n, m; cin >> n >> m; vector<trial> lrt(m); char y = 'Y', k = 'K', c = 'C'; ll l, r; char t; REP(i, 0, m) { cin >> l >> r >> t; lrt[i] = {i, l, r, t}; // make_tuple 使うと壊れる } sort(ALL(lrt)); // REP(i, 0, m) // { // dump(lrt[i].left, lrt[i].idx, lrt[i].right, lrt[i].chr); // } // dump(lrt); ll ptr = 0; vll cnt('Z', 0); priority_queue<trial, vector<trial>, greater<trial>> que; REPM(i, 1, n) // 前の皿からループ { while (ptr < m && lrt[ptr].left == i) { // dump(i, ptr); que.push(lrt[ptr]); ptr++; } while (!que.empty()) { trial t0 = que.top(); if (i <= t0.right) { // dump(i, t0.chr); cnt[t0.chr]++; break; } else { que.pop(); } } } cout << cnt[y] << " " << cnt[k] << " " << cnt[c] << endl; } /** * エントリポイント. * @return 0. */ int main() { solve(); return 0; }