A
void solve() {
int x, y;
cin >> x >> y;
while (y--) {
x *= 2;
}
cout << x << '\n';
}
B
void solve() {
int n;
cin >> n;
vector<pair<int, int>> a(n);
for (int i = 0; i < n; i++) {
cin >> a[i].first;
a[i].second = i + 1;
}
sort(a.begin(), a.end());
cout << a[0].second << ' ' << a[1].second << ' ' << a[2].second << '\n';
}
C
void solve() {
// 我只能说糖丸了,这么简单的题写成这种史
// 和我最开始的优化思路有点相同的,因为模具有周期性,所以位置i和位置i + 2*w的状态是相同的
// 所以我们只需要创建一个2 * w的数组就可以很好的存值了
// 然后我们通过一个长度为 w 滑动窗口就可以解题了
// 我为什么没写完呢?因为我想的是用二维数组来存,然后二维数组的行数为(n + 2 * w - 1) / (w * 2)
// 当w很大时,n为1,这个数组就会出错不啦不啦的,写起来就很麻烦,我就没写了
// 所以主要的问题就是二维数组太麻烦了,其实一维数组就可以很好的解决了
// 还有一个问题就是,我写的时候没有纸和笔,所以细节的地方不好想
int n, w;
cin >> n >> w;
int w2 = 2 * w; // 因为2 * w用的多,这个也是值得学习的一个点
vector<ll> a(w2);
for (int i = 1; i <= n; i++) {
int temp;
cin >> temp;
a[i % w2] += temp;
}
ll ans = accumulate(a.begin(), a.begin() + w, 0ll);
ll cur = ans;
// 滑动窗口
// 滑动窗口这里也有问题,就是不是窗口的右边到了终点就没了,是窗口要重新回到起点才结束
for (int i = 1; i < w2; i++) {
cur -= a[i - 1];
cur += a[(i + w - 1) % w2];
ans = min(cur, ans);
}
cout << ans << '\n';
}
D
void solve() {
int n, q;
cin >> n >> q;
vector<ll> a(n);
for (auto &i : a) cin >> i;
sort(a.begin(), a.end());
while (q--) {
ll x, y;
cin >> x >> y;
// 找到第y个大于等于x的不在数组a中的值
// 也就是说到这个数为止,一共有y个不在数组a中的数,且都大于等于x
// l设置为x,因为这个答案不可能比x小
ll l = x, r = 2e9;
while (l < r) {
ll mid = (l + r) / 2; // 向下取整
int len = upper_bound(a.begin(), a.end(), mid) - lower_bound(a.begin(), a.end(), x);
if (mid - x + 1 - len >= y) {
r = mid;
}
else {
l = mid + 1;
}
}
cout << l << '\n';
}
}
E
void solve() {
int n, k, x;
cin >> n >> k >> x;
vector<int> a(n);
for (auto &i : a) cin >> i;
sort(a.rbegin(), a.rend());
vector<int> diff(n);
for (int i = 0; i < n; i++) {
diff[i] = a[0] - a[i];
}
priority_queue<tuple<ll, int, int>> state;
cout << 1ll * a[0] * k << '\n';
// 当n为1是diff[1]会越界,我没考虑,但是依然AC了
state.emplace(1ll * a[0] * k - diff[1], 1, 1);
for (int i = 0; i < x; i++) {
auto [cur, idx, cnt] = state.top();
state.pop();
cout << cur << '\n';
if (idx + 1 < n) {
state.emplace(cur + diff[idx] - diff[idx + 1], idx + 1, cnt);
}
if (cnt < k) {
state.emplace(cur - diff[idx], idx, cnt + 1);
}
}
}