我们有 n
个物品,每个物品有一个初始价值 v_i
。可以进行 k
次涨价操作,每次操作可以选择任意一个物品,将其价值平方(即 x = x * x
),但每个物品只能被涨价一次。然后有 m
次询问,每次询问给定 p
个物品的编号,要求计算这 p
个物品在最优涨价操作后的最大总价值。
输入格式
-
第一行:两个整数
n
和k
,分别表示物品数量和涨价次数。 -
第二行:
n
个整数,表示每个物品的初始价值v_1, v_2, ..., v_n
。 -
第三行:一个整数
m
,表示询问次数。 -
接下来的
m
行:每行一个整数p
,表示询问前p
个物品的总价值(即v[0], v[1], ..., v[p-1]
)。
输出格式
对于每个询问 p
,输出前 p
个物品在最优涨价操作后的最大总价值。
#include <iostream> #include <vector> #include <algorithm> using namespace std;int main() {int n, k;cin >> n >> k;vector<long long> v(n);for (int i = 0; i < n; ++i) {cin >> v[i];}// 按价值从大到小排序sort(v.begin(), v.end(), greater<long long>());// 对前k个物品进行涨价操作for (int i = 0; i < min(k, n); ++i) {v[i] = v[i] * v[i];}// 构建前缀和数组vector<long long> prefix(n + 1, 0);for (int i = 1; i <= n; ++i) {prefix[i] = prefix[i - 1] + v[i - 1];}int m;cin >> m;while (m--) {int p;cin >> p;cout << prefix[p] << endl;}return 0; }