C-School_牛客小白月赛54 (nowcoder.com)
题意:
D 国的时间制度很奇怪,一天有 h 小时,一小时有 m 分。
位于 D 国的 E 校给学生发放了校卡。
这种校卡具有通话功能,但是在某些时间段,校卡是不能通话的。
共有 n个不能通话时间段,第 i 段从 ai 时bi 分到 ci 时 di 分不可通话(包含)。
同时,会有 q组询问,每次询问包含两个整数 x,y,询问的是 x 时 y 分是否可以打电话。如果可以则输出 Yes,否则输出 No。
思路:
考虑差分即可
但是可能会爆空间,因此用的是差分的升级版
一个vector存起点
一个vector存终点
差分数组中前缀和为0
就等价于询问的该点前面+和-的数量相等,即左端点和右端点的数量相等
在vector中lowerbound差分数组中的坐标
pos1==pos2就相当于前缀和为0
#include <bits/stdc++.h>
using namespace std;
#define int long long
vector<int> v1,v2;
signed main(){
int n,h,m,q,h1,m1,h2,m2,hx,mx;
scanf("%lld%lld%lld%lld",&n,&h,&m,&q);
for(int i=1;i<=n;i++){
scanf("%lld%lld%lld%lld",&h1,&m1,&h2,&m2);
v1.push_back(h1*m+m1);
v2.push_back(h2*m+m2);
}
sort(v1.begin(),v1.end());
sort(v2.begin(),v2.end());
while(q--){
scanf("%lld%lld",&hx,&mx);
int pos1=lower_bound(v1.begin(),v1.end(),hx*m+mx)-v1.begin();
int pos2=lower_bound(v2.begin(),v2.end(),hx*m+mx)-v2.begin();
if(pos1==pos2) puts("Yes");
else puts("No");
}
return 0;
}