P2352 队爷的新书
P2352 队爷的新书 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
题意大概是给n个区间,如果某个数属于若干区间的话,这些区间的这个数的和最大是多少。
毫无疑问,贪心来看这个数必然是某个区间的右端点。
那么接下来很容易想到按照右端点排一下序,来计算相应的和。
但n是1e5级别的,n^2会超时。
按照右端点排序有个很好的性质,那就是对于排序后第i个区间,前i-1个区间的左端点必然是小于等于它的。我们不妨排序左端点,找到左端点中共有多少数小于等于右端点,这些数当中包含右端点在i左边的i-1个区间,剩下的就是右端点在i右边或者重合的,换言之,就是右端点i被这些区间包含。
由于左端点也是有序的,我们可以用二分来做
查看代码
#include<iostream>
#include<vector>
#include<algorithm>
#define int long long
using namespace std;
int n;
signed main()
{
cin>>n;
vector<int>a(n),b(n);
for(int i=0;i<n;i++)cin>>a[i]>>b[i];
sort(a.begin(),a.end());
sort(b.begin(),b.end());
int ans=0;
for(int i=0;i<n;i++)
{
int l=0,r=n-1;
while(l<r)
{
int mid=l+r+1>>1;
if(a[mid]<=b[i])l=mid;
else r=mid-1;
}
ans=max(ans,(l-i+1)*b[i]);
}
cout<<ans;
return 0;
}
作者:qbning
-------------------------------------------
个性签名:曾经的我们空有一颗望海的心,却从没为前往大海做过真正的努力
如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,博主在此感谢!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】