結果
問題 | No.1471 Sort Queries |
ユーザー | 小野寺健 |
提出日時 | 2021-04-25 16:21:11 |
言語 | C++14 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 93 ms / 2,000 ms |
コード長 | 1,548 bytes |
コンパイル時間 | 762 ms |
コンパイル使用メモリ | 76,828 KB |
実行使用メモリ | 10,880 KB |
最終ジャッジ日時 | 2024-07-04 09:29:49 |
合計ジャッジ時間 | 3,012 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 5 ms
9,728 KB |
testcase_01 | AC | 6 ms
9,728 KB |
testcase_02 | AC | 4 ms
9,600 KB |
testcase_03 | AC | 5 ms
9,600 KB |
testcase_04 | AC | 5 ms
9,728 KB |
testcase_05 | AC | 5 ms
9,600 KB |
testcase_06 | AC | 4 ms
9,728 KB |
testcase_07 | AC | 5 ms
9,728 KB |
testcase_08 | AC | 5 ms
9,720 KB |
testcase_09 | AC | 5 ms
9,728 KB |
testcase_10 | AC | 5 ms
9,600 KB |
testcase_11 | AC | 5 ms
9,600 KB |
testcase_12 | AC | 5 ms
9,728 KB |
testcase_13 | AC | 21 ms
10,112 KB |
testcase_14 | AC | 20 ms
10,168 KB |
testcase_15 | AC | 30 ms
10,112 KB |
testcase_16 | AC | 16 ms
9,728 KB |
testcase_17 | AC | 16 ms
10,112 KB |
testcase_18 | AC | 13 ms
9,984 KB |
testcase_19 | AC | 17 ms
9,984 KB |
testcase_20 | AC | 30 ms
10,112 KB |
testcase_21 | AC | 19 ms
10,112 KB |
testcase_22 | AC | 15 ms
9,984 KB |
testcase_23 | AC | 43 ms
10,496 KB |
testcase_24 | AC | 42 ms
10,624 KB |
testcase_25 | AC | 61 ms
10,624 KB |
testcase_26 | AC | 45 ms
10,368 KB |
testcase_27 | AC | 50 ms
10,752 KB |
testcase_28 | AC | 51 ms
10,752 KB |
testcase_29 | AC | 43 ms
10,376 KB |
testcase_30 | AC | 41 ms
10,580 KB |
testcase_31 | AC | 63 ms
10,496 KB |
testcase_32 | AC | 64 ms
10,368 KB |
testcase_33 | AC | 93 ms
10,880 KB |
testcase_34 | AC | 78 ms
10,752 KB |
testcase_35 | AC | 78 ms
10,752 KB |
testcase_36 | AC | 19 ms
10,752 KB |
testcase_37 | AC | 19 ms
10,752 KB |
testcase_38 | AC | 59 ms
10,880 KB |
testcase_39 | AC | 74 ms
10,880 KB |
ソースコード
#include <vector> #include <iostream> #include <algorithm> #include <string> using namespace std; #define MAX_N 10000 #define MAX_M 10000 const int ST_SIZE = (1 << 18) - 1; int N, M; char A[MAX_N]; int I[MAX_M], J[MAX_M], K[MAX_M]; char nums[MAX_N]; vector<int> dat[ST_SIZE]; void init(int k, int l, int r) { if (r - l == 1) { dat[k].push_back(A[l]); } else { int lch = k * 2 + 1, rch = k * 2 + 2; init(lch, l, (l + r) / 2); init(rch, (l + r) / 2, r); dat[k].resize(r - l); merge(dat[lch].begin(), dat[lch].end(), dat[rch].begin(), dat[rch].end(), dat[k].begin()); } } int query(int i, int j, char x, int k, int l, int r) { // printf("query(%d, %d, %d, %d, %d, %d)\n", i, j, x, k, l, r); if (j <= l || r <= i) { return 0; } else if (i <= l && r <= j) { return upper_bound(dat[k].begin(), dat[k].end(), x) - dat[k].begin(); } else { int lc = query(i, j, x, k * 2 + 1, l, (l + r) / 2); int rc = query(i, j, x, k * 2 + 2, (l + r) / 2, r); return lc + rc; } } void solve() { for (int i=0; i < N; i++) nums[i] = A[i]; sort(nums, nums + N); init(0, 0, N); for (int i = 0; i < M; i++) { int l = I[i] - 1, r = J[i], k = K[i]; int lb = -1, ub = N - 1; while (ub - lb > 1) { int md = (ub + lb) / 2; int c = query(l, r, nums[md], 0, 0, N); if (c >= k) ub = md; else lb = md; } printf("%c\n", nums[ub]); } } int main() { cin >> N >> M; string str; cin >> str; for (int i = 0; i < N; i++) { A[i] = str[i]; } for (int i = 0; i < M; i++) { cin >> I[i] >> J[i] >> K[i]; } solve(); }