結果
| 問題 |
No.449 ゆきこーだーの雨と雪 (4)
|
| ユーザー |
ei1333333
|
| 提出日時 | 2016-11-18 23:45:32 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 737 ms / 5,000 ms |
| コード長 | 1,527 bytes |
| コンパイル時間 | 1,922 ms |
| コンパイル使用メモリ | 183,076 KB |
| 実行使用メモリ | 34,148 KB |
| 最終ジャッジ日時 | 2024-09-22 10:10:38 |
| 合計ジャッジ時間 | 17,015 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 43 |
ソースコード
#include<bits/stdc++.h>
using namespace std;
int f(int N, int K)
{
return (50 * N + (50 * N) / (0.8 + 0.2 * K));
}
struct BIT
{
vector< int > sum;
BIT(int sz)
{
sum.assign(++sz, 0);
}
int query(int k)
{
int ret = 0;
for(++k; k > 0; k -= k & -k) ret += sum[k];
return (ret);
}
void add(int k, int x)
{
for(++k; k < sum.size(); k += k & -k) sum[k] += x;
}
};
vector< pair< int, int > > nums;
int get(int sum, int idx)
{
return (lower_bound(begin(nums), end(nums), make_pair(sum, -idx)) - begin(nums));
}
int main()
{
int N, L[26], T, rank[26] = {};
string S[100000];
char P[100000];
cin >> N;
for(int i = 0; i < N; i++) {
cin >> L[i];
}
cin >> T;
map< string, int > last;
map< string, int > sum;
for(int i = 0; i < T; i++) {
cin >> S[i] >> P[i];
if(P[i] == '?') continue;
P[i] -= 'A';
last[S[i]] = i;
sum[S[i]] += f(L[P[i]], ++rank[P[i]]);
nums.emplace_back(sum[S[i]], -last[S[i]]);
}
last.clear();
sum.clear();
memset(rank, 0, sizeof(rank));
sort(begin(nums), end(nums));
nums.erase(unique(begin(nums), end(nums)), end(nums));
BIT tree(nums.size());
for(int i = 0; i < T; i++) {
if(P[i] == '?') {
cout << tree.query(nums.size() - 1) - tree.query(get(sum[S[i]], last[S[i]])) + 1 << endl;
} else {
if(last.count(S[i])) tree.add(get(sum[S[i]], last[S[i]]), -1);
last[S[i]] = i;
sum[S[i]] += f(L[P[i]], ++rank[P[i]]);
tree.add(get(sum[S[i]], last[S[i]]), +1);
}
}
}
ei1333333