結果
問題 |
No.3167 [Cherry 7th Tune C] Cut in Queue
|
ユーザー |
![]() |
提出日時 | 2025-05-31 19:13:07 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 255 ms / 2,500 ms |
コード長 | 2,469 bytes |
コンパイル時間 | 958 ms |
コンパイル使用メモリ | 62,936 KB |
実行使用メモリ | 37,248 KB |
最終ジャッジ日時 | 2025-05-31 19:13:24 |
合計ジャッジ時間 | 13,316 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 43 |
コンパイルメッセージ
main.cpp: In function ‘int main()’: main.cpp:88:8: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 88 | scanf("%d", &n); | ~~~~~^~~~~~~~~~ main.cpp:89:36: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 89 | for (int i = 0; i < n; i++) scanf("%d", as + i), as[i]--; | ~~~~~^~~~~~~~~~~~~~ main.cpp:92:8: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 92 | scanf("%d", &qn); | ~~~~~^~~~~~~~~~~ main.cpp:95:10: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 95 | scanf("%d", &op); | ~~~~~^~~~~~~~~~~ main.cpp:96:23: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 96 | if (op != 2) scanf("%d", &a), a--; | ~~~~~^~~~~~~~~~
ソースコード
/* -*- coding: utf-8 -*- * * 3167.cc: No.3167 [Cherry 7th Tune C] Cut in Queue - yukicoder */ #include<cstdio> #include<vector> #include<list> #include<algorithm> #include<utility> using namespace std; /* constant */ const int MAX_N = 300000; const int MAX_QN = 300000; const int MAX_M = MAX_N + MAX_QN; /* typedef */ using lsti = list<int>; using litr = lsti::iterator; using pii = pair<int,int>; template <typename T> struct BIT { int n; vector<T> bits; BIT() {} BIT(int _n) { init(_n); } void init(int _n) { n = _n; bits.assign(n + 1, 0); } T sum(int x) { x = min(x, n); T s = 0; while (x > 0) { s += bits[x]; x -= (x & -x); } return s; } void add(int x, T v) { if (x <= 0) return; while (x <= n) { bits[x] += v; x += (x & -x); } } }; /* global variables */ int as[MAX_N]; pii ops[MAX_QN]; litr amp[MAX_M]; int aps[MAX_M], pas[MAX_M]; BIT<int> bit; /* subroutines */ int findat(int m, int k) { int j0 = 0, j1 = m + 1; while (j0 + 1 < j1) { int j = (j0 + j1) / 2; if (bit.sum(j) > k) j1 = j; else j0 = j; } return j0; } void printv(int m) { for (int i = 0; i < m; i++) if (bit.sum(i + 1) > bit.sum(i)) printf(" %d", pas[i] + 1); putchar('\n');} /* main */ int main() { int n; scanf("%d", &n); for (int i = 0; i < n; i++) scanf("%d", as + i), as[i]--; int qn; scanf("%d", &qn); for (int i = 0; i < qn; i++) { int op, a = -1; scanf("%d", &op); if (op != 2) scanf("%d", &a), a--; ops[i] = {op, a}; } lsti ls; for (int i = 0; i < n; i++) amp[as[i]] = ls.insert(ls.end(), as[i]); for (int i = 0, b = n; i < qn; i++) { auto [op, a] = ops[i]; if (op == 1) { auto lit = (a >= 0) ? amp[a] : ls.end(); amp[b] = ls.insert(lit, b); b++; } } //for (auto a: ls) printf(" %d", a + 1); putchar('\n'); int m = ls.size(), p = 0; for (auto a: ls) { aps[a] = p, pas[p] = a; p++; } bit.init(m); for (int i = 0; i < n; i++) bit.add(aps[as[i]] + 1, 1); for (int i = 0, b = n; i < qn; i++) { auto [op, a] = ops[i]; //printf(" %d,%d\n", op, a + 1); if (op == 1) { int p = aps[b++]; bit.add(p + 1, 1); //printv(m); } else if (op == 2) { int j = findat(m, 0); bit.add(j + 1, -1); //printv(m); } else { int j = findat(m, a); printf("%d\n", pas[j] + 1); } } return 0; }