1 条题解

  • 0
    @ 2026-5-2 20:06:56

    由于是面积交,考虑枚举矩形的长并二分矩形的宽,设当前矩形长为 xx,宽为 yy,若 i=1n[xix][yiy]m\sum_{i=1}^{n}[x_i\ge x][y_i\ge y] \ge m 则此矩形合法。
    考虑将矩形按 yy 排序,对于第 ii 个矩形使用树状数组统计 iinnxxxix_i 小的矩形数 cntcnt,满足条件的矩形数为 ni+1cntn-i+1-cnt

    #include<bits/stdc++.h>
    #define int long long
    using namespace std;
    int n,m,ans,idx,b[200010],bit[200010];
    map<int,int>mp;
    int lowbit(int x){return x&-x;}
    void add(int x,int y){for(;x<=idx;x+=lowbit(x))bit[x]+=y;}
    int query(int x)
    {
    	int res=0;
    	for(;x;x-=lowbit(x))res+=bit[x];
    	return res;
    }
    struct node{int x,y;}a[200010];
    bool cmp(node x,node y){return x.y<y.y;}
    bool check(int x,int y)
    {
    	int cnt=n-x+1-query(mp[b[y]]-1);
    	return cnt>=m;
    }
    signed main()
    {
    	ios::sync_with_stdio(0);
    	cin.tie(0);
    	cout.tie(0);
    	cin>>n>>m;
    	for(int i=1;i<=n;i++)cin>>a[i].x>>a[i].y,b[i]=a[i].x;
    	sort(b+1,b+n+1);
    	for(int i=1;i<=n;i++)if(!mp[b[i]])mp[b[i]]=++idx;
    	sort(a+1,a+n+1,cmp);
    	for(int i=1;i<=n;i++)add(mp[a[i].x],1);
    //	for(int i=1;i<=n;i++)cout<<"V:"<<a[i].x<<' '<<a[i].y<<'\n';
    	for(int i=1;i<=n;i++)
    	{
    		int l=1,r=n;
    		while(l<r)
    		{
    			int mid=(l+r+1)/2;
    			if(check(i,mid))l=mid;
    			else r=mid-1;
    		}
    //		cout<<a[i].y<<' '<<b[l]<<' '<<query(mp[b[l]]-1)<<'\n';
    		if(check(i,l))ans=max(ans,a[i].y*b[l]);
    		add(mp[a[i].x],-1);
    	}
    	cout<<ans;
    	return 0;
    }
    /*
    Happy birthday to lrz!!!
    */
    
    • 1

    信息

    ID
    10325
    时间
    1000ms
    内存
    256MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者