結果
問題 |
No.945 YKC饅頭
|
ユーザー |
|
提出日時 | 2019-12-08 08:01:55 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 226 ms / 2,000 ms |
コード長 | 1,779 bytes |
コンパイル時間 | 1,022 ms |
コンパイル使用メモリ | 71,976 KB |
実行使用メモリ | 8,832 KB |
最終ジャッジ日時 | 2024-12-29 11:56:16 |
合計ジャッジ時間 | 9,580 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 74 |
ソースコード
#include <iostream> #include <vector> using namespace std; template<class A, int P, size_t S=1<<P> struct X { using U = struct { int t; A v; }; U xs[S<<1] = {}; int time = 0; size_t size() { return S; } void update(size_t lp, size_t rp, A v) { time++; _update(0, S>>1, lp, rp, v); } void _update(size_t d, size_t p, size_t lp, size_t rp, A v) { if (p == 0 || rp-lp+1 == (p<<1)) { xs[d].t = time; xs[d].v = v; return; } if ((rp&p)==0) { _update((d<<1)+1, p>>1, lp, rp, v); } else if ((lp&p)!=0) { _update((d<<1)+2, p>>1, p^lp, p^rp, v); } else { _update((d<<1)+1, p>>1, lp, p-1, v); _update((d<<1)+2, p>>1, 0, p^rp, v); } } A get(size_t i) { size_t d = 0; for (size_t p=S>>1, z; p!=0; p >>= 1) { z = d; if ((i&p)==0) { d=(d<<1)+1; } else { d=(d<<1)+2; i^=p; } if (xs[d].t < xs[z].t) { xs[d].t = xs[z].t; xs[d].v = xs[z].v; } } return xs[d].v; } }; using XX = X<char,21>; using D = struct { int lp, rp; char x; }; XX x; int main() { int n, m; cin >> n >> m; vector<D> vs(m); for (auto &v : vs) { cin >> v.lp >> v.rp >> v.x; } for (int i = m-1; i>=0; i--) { auto &v = vs[i]; x.update(v.lp, v.rp, v.x); } int yc = 0, kc = 0, cc = 0; for (int i = 1; i <= n; i++) { switch (x.get(i)) { case 'Y': yc++; break; case 'K': kc++; break; case 'C': cc++; break; } } cout << yc << " " << kc << " " << cc << endl; return 0; }