JZOJ 5849. 【NOIP提高组模拟2018.8.25】d
按照a排序后,枚举矩形i,将1~i-1都删掉后,从i~n中选取b的第m-(i-1)+1大,更新答案
1 #include "bits/stdc++.h" 2 using namespace std; 3 const int N = 1e5 + 10; 4 int n, m; 5 struct T { 6 int a, b; 7 } t[N]; 8 9 bool operator < (T a, T b) { 10 return a.a < b.a; 11 } 12 13 priority_queue<int> lrg; 14 priority_queue<int, vector<int>, greater<int> > sml; 15 16 void ins(int x) { 17 if(lrg.size() && x > lrg.top()) sml.push(x); 18 else lrg.push(x); 19 } 20 21 int getk(int k) { 22 // k = min(k, int(sml.size() + lrg.size())); 23 while(lrg.size() > k) { 24 sml.push(lrg.top()); 25 lrg.pop(); 26 } 27 while(lrg.size() < k) { 28 lrg.push(sml.top()); 29 sml.pop(); 30 } 31 return lrg.top(); 32 } 33 34 void sol() { 35 while(lrg.size()) lrg.pop(); 36 while(sml.size()) sml.pop(); 37 scanf("%d%d", &n, &m); 38 for(int i = 1 ; i <= n ; ++ i) { 39 scanf("%d%d", &t[i].a, &t[i].b); 40 } 41 long long ans = 0; 42 sort(t + 1, t + 1 + n); 43 for(int i = n, mn = t[n].b ; i ; -- i) { 44 // [i, n] 45 ins(t[i].b); 46 mn = min(mn, t[i].b); 47 int k = m - (i - 1); 48 if(k < 0) continue; 49 // cout << "k = " << k << endl; 50 if(k == 0) ans = max(ans, 1ll * t[i].a * mn); 51 else { 52 // vector<int> tmp; tmp.push_back(-1); 53 // for(int j = i ; j <= n ; ++ j) tmp.push_back(t[j].b); 54 // sort(tmp.begin(), tmp.end()); 55 // ans = max(ans, 1ll * t[i].a * tmp[k + 1]); 56 ans = max(ans, 1ll * t[i].a * getk(k + 1)); 57 } 58 } 59 printf("%lld\n", ans); 60 } 61 62 int main() { 63 freopen("d.in", "r", stdin); 64 freopen("d.out", "w", stdout); 65 int t; scanf("%d", &t); 66 while(t --) sol(); 67 }