[二分][树状数组] Jzoj P5849 d

本文深入探讨了一种解决矩阵覆盖问题的高效算法。通过将所有矩阵左上角移动至坐标原点并进行横坐标排序,利用树状数组记录纵坐标,实现对矩阵覆盖范围的快速查询与更新。文章详细介绍了算法流程,包括使用二分查找优化y坐标选择,以及如何通过遍历x坐标更新最大覆盖面积。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Description
 
Input
Output
 
Sample Input
见下发文件
Sample Output
见下发文件
 
 
Data Constraint

 

 

题解

  • 这题,题目说可以任意移动矩阵,那么就可以把所有矩阵的左上角移到(0,0)
  • 这样的话,其实就可以不用管了这个东西了
  • 然后,我们可以先将横坐标排序,然后把y坐标加进树状数组,权值为1
  • 枚举x坐标,然后二分y坐标mid,然后将y坐标小于mid的全部删掉+重复的有没有大于m
  • 最后更新ans

代码

 1 #include <cstdio>
 2 #include <algorithm>
 3 using namespace std;
 4 int t,n,m,sz[100010];
 5 struct edge {int x,y;}e[100010];
 6 bool cmp(edge a,edge b) { return (a.x<b.x)||(a.x==b.x&&a.y<b.y); }
 7 void insert(int x,int d) { for (;x<=100000;x+=x&-x) sz[x]+=d; }
 8 int query(int x)
 9 {
10     int r=0;
11     for (;x;x-=x&-x) r+=sz[x];
12     return r;
13 }
14 bool check(int x,int y) { return (query(y-1)+x<=m)?1:0; }
15 int main()
16 {
17     freopen("d.in","r",stdin);
18     freopen("d.out","w",stdout);
19     scanf("%d",&t);
20     while (t--)
21     {
22         scanf("%d%d",&n,&m);
23         int mxx=0,p=0,mxy=0; long long ans=0;
24         for (int i=1;i<=n;i++) scanf("%d%d",&e[i].x,&e[i].y),mxx=max(mxx,e[i].x),mxy=max(mxy,e[i].y);
25         sort(e+1,e+n+1,cmp);
26         for (int i=1;i<=n;i++) insert(e[i].y,1);
27         for (int i=1;i<=n;i++)
28         {
29             int k=i,l=1,r=mxy,mx=0;
30             while (e[k].x==e[k+1].x&&k<n) k++;
31             while (l<=r)
32             {
33                 int mid=(l+r)>>1;
34                 if (check(p,mid)) mx=mid,l=mid+1; else r=mid-1;
35             }
36             for (int j=i;j<=k;j++) insert(e[j].y,-1),p++; 
37             ans=max(ans,1ll*e[i].x*mx);
38             i=k;
39         }
40         printf("%lld\n",ans);
41     }
42 }

 

转载于:https://www.cnblogs.com/Comfortable/p/9648826.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值