d题大概是让有n个矩阵,可以随意平移,问删除m个矩阵后最大的面积交是多少。
其实思路很显然。
肯定删x个a最小的和m-x个b最小的。
然后我们先删m个a最小的,然后逐渐少删a,开始删b,用个堆维护b的最小值。
然后就可以了。
代码并没有测。

#include <iostream> #include <queue> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int N=1e5+5; typedef long long ll; int T,n,m; struct Node{ int x,y; }a[N]; priority_queue<int,vector<int>,greater<int> >q; bool cmp1(Node x,Node y) {return x.x<y.x;} bool cmp2(Node x,Node y) {return x.y<y.y;} int main() { scanf("%d",&T); while(T--) { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) scanf("%d%d",&a[i].x,&a[i].y); if(m>=n-1) { ll ans=0; for(int i=1;i<=n;i++) ans=max(ans,1ll*a[i].x*a[i].y); continue; } while(!q.empty()) q.pop(); sort(a+1,a+1+n,cmp1); for(int i=m+1;i<=n;i++) q.push(a[i].y); ll ans=1ll*a[m+1].x*q.top(); for(int i=m;i;i--) { q.push(a[i].y); if(a[i].x*q.top()>ans) ans=1ll*a[i].x*q.top(); } printf("%lld ",ans); } return 0; }