给你n个二元组,选出不多于k个满足第一维的min乘上第二维的sum最大。
傻逼题,按第一维排个序然后对顶堆求第二维前k大之和就没了。


1 #include <bits/stdc++.h> 2 3 typedef long long LL; 4 const int N = 300010; 5 6 std::priority_queue<int> Q1, Q2; 7 struct Node { 8 int a, t; 9 inline bool operator <(const Node &w) const { 10 return a < w.a; 11 } 12 }node[N]; 13 int k; 14 LL sum; 15 16 inline void insert(int x) { 17 if(!Q2.size() || x > Q2.top()) { 18 Q1.push(-x); 19 sum += x; 20 } 21 else Q2.push(x); 22 while(Q1.size() > k) { 23 Q2.push(-Q1.top()); 24 sum += Q1.top(); 25 Q1.pop(); 26 } 27 while(Q1.size() < k && Q2.size()) { 28 Q1.push(-Q2.top()); 29 sum += Q2.top(); 30 Q2.pop(); 31 } 32 return; 33 } 34 35 int main() { 36 int n; 37 scanf("%d%d", &n, &k); 38 for(int i = 1; i <= n; i++) { 39 scanf("%d%d", &node[i].t, &node[i].a); 40 } 41 std::sort(node + 1, node + n + 1); 42 43 LL ans = 0; 44 for(int i = n; i >= 1; i--) { 45 insert(node[i].t); 46 ans = std::max(ans, 1ll * node[i].a * sum); 47 } 48 49 printf("%lld\n", ans); 50 return 0; 51 }