結果
| 問題 |
No.1651 Removing Cards
|
| コンテスト | |
| ユーザー |
startcpp
|
| 提出日時 | 2021-08-20 21:57:16 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 607 ms / 2,000 ms |
| コード長 | 926 bytes |
| コンパイル時間 | 737 ms |
| コンパイル使用メモリ | 86,656 KB |
| 実行使用メモリ | 8,284 KB |
| 最終ジャッジ日時 | 2024-10-14 03:32:07 |
| 合計ジャッジ時間 | 14,449 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 32 |
ソースコード
#include <iostream>
#include <string>
#include <algorithm>
#include <functional>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <cstdio>
#include <cmath>
#include <cassert>
#include <tuple>
#define rep(i, n) for(i = 0; i < n; i++)
#define int long long
using namespace std;
int K, q;
int ns[100000];
vector<int> a;
int f(int pos) {
int ng = 0, ok = 3 * (1e+18), mid;
while (ok - ng >= 2) {
mid = (ng + ok) / 2;
//前のフェーズで人0~mid-1がいるとき、rem人生き残る
int rem = mid - (mid + K - 1) / K;
if (rem >= pos + 1) ok = mid;
else ng = mid;
}
return ok - 1;
}
signed main() {
int i;
cin >> K >> q;
rep(i, q) cin >> ns[i];
int pos = 0;
while (pos <= (int)(1e+18)) {
a.push_back(pos);
pos = f(pos);
}
rep(i, q) {
int iter = lower_bound(a.begin(), a.end(), ns[i]) - a.begin();
cout << a[iter - 1] + 1 << endl;
}
return 0;
}
startcpp