Submission #42196
ソースコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 | #include<bits/stdc++.h> using namespace std; typedef pair< int , int > P; const int INF = 300005; const int SIZE = 530005; int n; P seg[SIZE]; int bit[SIZE]={}; int sel[200005]={}; //seg tree void init(); void updata( int i, int x); P find(P a, int node, int left, int right); //BIT void add( int i, int x); int sum( int i); int main() { ios_base::sync_with_stdio( false ); cin.tie(NULL); int k, m; string buff, ans; cin >> buff >> k; if (m == 1) cout << buff << endl; else if (m == 2){ if (k == 0) cout << buff << endl; else { cout << min(buff[0], buff[1]) << max(buff[0], buff[1]) << endl; } } else { n = m = buff.size(); init(); for ( int i=0;i<buff.size();i++){ updata(i, ( int )buff[i]- 'a' ); } /* for(int i=0;i<buff.size();i++){ cout << seg[i+n].first << ' '; } cout << endl; */ //cout << n << endl; //cout << find(P(1, 5), 0, 0, n).second << endl; int count=0; int index = k; //if(index > m) index = m; while (k > 0){ if (index > (m-1)) index = m-1; P ch = find(P(0, index), 0, 0, n-1); //1 ~ K+1!!!!!!!!!!!! if (ch.first == INF) break ; //cout << ch.second << endl; ans += ( char )ch.first+ 'a' ; count++; k-=(ch.second+1)-sum(ch.second+1)-1; add(ch.second+1, 1); sel[ch.second] = 1; updata(ch.second, INF); if (k <= 0 || count == m || ans.size() == buff.size()) break ; if (k >= (m-1)) index = m-1; else { int left=1 ,right = m, judge = k; for ( int j=0;j<20 && left < right;j++){ int midle = (left+right)/2; int result = midle-sum(midle)-1; if (result < judge) left = midle+1; else if (result > judge) right = midle-1; //midle-1 ? else { left = midle; break ; } } index = left-1; } } for ( int i=0;i<buff.size();i++){ if (sel[i] == 0) ans += buff[i]; } cout << ans << endl; } return 0; } //seg tree void init() { int l=1; while (l < n){ l<<=1; } n = l; for ( int i=0;i<=2*n;i++) seg[i] = P(INF, INF); return ; } void updata( int i, int x) { i += n-1; seg[i] = P(x, i-(n-1)); while (i > 0){ i = (i-1)/2; seg[i] = min(seg[i*2+1], seg[i*2+2]); } return ; } P find(P a, int node, int left, int right) { if (right < a.first || left > a.second) return (P(INF, INF)); if (a.first <= left && a.second >= right) return (seg[node]); int midle = (left+right) / 2; P cost1 = find(a, node*2+1, left, midle); P cost2 = find(a, node*2+2, midle+1, right); return (min(cost1, cost2)); } //BIT void add( int i, int x) { if (i == 0) return ; while (i < SIZE){ bit[i] += x; i += i&(-i); } return ; } int sum( int i) { if (i == 0) return 0; int s=0; while (i > 0){ s += bit[i]; i -= i&(-i); } return s; } |
ステータス
項目 | データ |
---|---|
問題 | 0963 - 人気のユーザ名 |
ユーザー名 | ei1612 |
投稿日時 | 2018-08-29 10:49:20 |
言語 | C++17 |
状態 | Accepted |
得点 | 14 |
ソースコード長 | 3011 Byte |
最大実行時間 | 70 ms |
最大メモリ使用量 | 8372 KB |
セット
セット | 得点 | Cases | |
---|---|---|---|
1 | ALL | 14 / 14 | * |
テストケース
ファイル名 | 状態 | 実行時間 | メモリ使用量 | # |
---|---|---|---|---|
in1.txt | AC | 21 ms | 2652 KB |
1
|
in2.txt | AC | 21 ms | 2900 KB |
1
|
in3.txt | AC | 18 ms | 3808 KB |
1
|
in4.txt | AC | 19 ms | 4204 KB |
1
|
in5.txt | AC | 22 ms | 3988 KB |
1
|
in6.txt | AC | 22 ms | 4028 KB |
1
|
in7.txt | AC | 24 ms | 4068 KB |
1
|
in8.txt | AC | 18 ms | 4108 KB |
1
|
in9.txt | AC | 17 ms | 4144 KB |
1
|
in10.txt | AC | 19 ms | 2688 KB |
1
|
in11.txt | AC | 15 ms | 2476 KB |
1
|
in12.txt | AC | 24 ms | 2520 KB |
1
|
in13.txt | AC | 27 ms | 2560 KB |
1
|
in14.txt | AC | 17 ms | 2600 KB |
1
|
in15.txt | AC | 18 ms | 2640 KB |
1
|
in16.txt | AC | 21 ms | 2724 KB |
1
|
in17.txt | AC | 28 ms | 5188 KB |
1
|
in18.txt | AC | 25 ms | 5280 KB |
1
|
in19.txt | AC | 26 ms | 5368 KB |
1
|
in20.txt | AC | 38 ms | 6140 KB |
1
|
in21.txt | AC | 70 ms | 8036 KB |
1
|
in22.txt | AC | 42 ms | 6872 KB |
1
|
in23.txt | AC | 42 ms | 7144 KB |
1
|
in24.txt | AC | 40 ms | 8100 KB |
1
|
in25.txt | AC | 22 ms | 3884 KB |
1
|
in26.txt | AC | 19 ms | 3924 KB |
1
|
in27.txt | AC | 18 ms | 3956 KB |
1
|
in28.txt | AC | 20 ms | 3988 KB |
1
|
in29.txt | AC | 22 ms | 4028 KB |
1
|
in30.txt | AC | 16 ms | 3848 KB |
1
|
in31.txt | AC | 41 ms | 8372 KB |
1
|
in32.txt | AC | 35 ms | 7332 KB |
1
|