1 条题解
-
0
由于是面积交,考虑枚举矩形的长并二分矩形的宽,设当前矩形长为 ,宽为 ,若 则此矩形合法。
考虑将矩形按 排序,对于第 个矩形使用树状数组统计 至 中 比 小的矩形数 ,满足条件的矩形数为 。#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
- 上传者