845C - Two TVs(扫描线)

本文提供了两种解决TwoTVs问题的方法:一种使用扫描线算法,通过记录每个时间段的开始和结束来判断是否超过三个时间段重叠;另一种通过排序并直接比较时间范围来避免三个时间段的重叠。

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

845C - Two TVs

 

 

题解是用扫描线

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int maxn=2e5+10;
 4 
 5 struct Node{
 6     int x,v;
 7     bool operator<(const Node& a)const{
 8         if(x==a.x) return v>a.v;  // 先处理结束的点
 9         return x<a.x;
10     }
11 }p[maxn<<1];
12 
13 int main(){
14     int n;
15     scanf("%d",&n);
16     int x,y;
17     int cnt=0;
18     for(int i=0;i<n;i++){
19         scanf("%d%d",&x,&y);
20         p[cnt++]=Node{x,1};
21         p[cnt++]=Node{y,-1};
22     }
23     sort(p,p+cnt);
24     int ans=0;
25     for(int i=0;i<cnt;i++){
26         if(p[i].v==1) ans++;
27         else ans--;
28         if(ans==3) break;
29     }
30     if(ans==3) puts("NO");
31     else puts("YES");
32 }
View Code

 

 我觉得我写的也差不多就是扫描线~

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int maxn=2e5+10;
 4 struct node{
 5     int s,e;
 6     bool operator<(const node& a)const{
 7         return s<a.s||s==a.s&&e<a.e;
 8     }
 9 }p[maxn];
10 int n;
11 
12 int main(){
13     scanf("%d",&n);
14     for(int i=0;i<n;i++)scanf("%d%d",&p[i].s,&p[i].e);
15     sort(p,p+n);
16     int last2=p[0].e,last1=p[1].e;
17 
18     for(int i=2;i<n;i++){
19         if(p[i].s<=last1&&p[i].s<=last2) {
20             puts("NO");
21             return 0;
22         }else if(p[i].s>last2){
23             last2=p[i].e;
24             continue;
25         }else if(p[i].s>last1){
26             last1=p[i].e;
27             continue;
28         }
29     }
30     puts("YES");
31     return 0;
32 }
View Code

 

转载于:https://www.cnblogs.com/yijiull/p/7423876.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值