ABC 355 D题Intersecting Intervals
题意
- 现在有n条线段,每条线段的左端点和右端点依次给出,求有多少对线段有交集。
思路
- 考虑正难则反的想法,我们考虑着n条线段全部两两相交的时候,那么答案就是(n-1)*n/2,现在我们要求出有多少对线段是不相交的。
- 当两条线段不相交的时候,显然有其中一条线段的左端点严格大于另一条线段的右端点的。所以对于上述问题,我们先对所有的右端点进行升序排序,然后O(n)遍历所有线段的左端点,通过lower_bound查找有多少右端点小于当前的左端点。
代码
int n;
cin>>n;
for(int i=1;i<=n;i++) cin>>l[i]>>r[i];
sort(r+1,r+1+n);
int ans=(n-1)*n/2;
for(int i=1;i<=n;i++)
{
int flag=lower_bound(r+1,r+1+n,l[i])-r-1;
//cout<<flag<<"qwq"<<endl;
ans-=flag;
}
cout<<ans<<endl;
return 0;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App