[NOIP2018模拟赛]d

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\n",ans);
    }
    return 0;
}
D

 

posted @ 2018-10-12 15:52  SWHsz  阅读(134)  评论(0编辑  收藏  举报