Hello 2020D(多重集)

如果有一对时间对在某一场馆有时间重合而这一对时间对在另一场馆没有时间重合,则输出NO,否则输出YES。

 1 #define HAVE_STRUCT_TIMESPEC
 2 #include<bits/stdc++.h>
 3 using namespace std;
 4 vector<pair<pair<int,int>,pair<int,int> > >v1,v2;
 5 int check(const vector<pair<pair<int,int>,pair<int,int> > >&v){//常引用,既提高了效率,也不会让参数在函数中被改动
 6     multiset<int>l,r;//保留了某一场馆时间重合的场次下另一场馆的时间对。
 7     for(int i=0;i<v.size();++i){
 8         pair<pair<int,int>,pair<int,int> >it=v[i];
 9         pair<int,int>temp=it.first;
10         pair<int,int>temp2=it.second;
11         if(temp.second==0){
12             l.erase(l.find(temp2.first));
13             r.erase(r.find(temp2.second));
14         }
15         else{
16             multiset<int>::iterator x=r.lower_bound(temp2.first);
17             if(x!=r.begin())//如果有比当前开始时间更小的结束时间,说明这一场馆可以有一对没有时间重合的时间对且另一场馆这一对时间重合。
18                 return 0;
19             multiset<int>::iterator y=l.upper_bound(temp2.second);
20             if(y!=l.end())//如果有比当前结束时间更大的开始时间,说明这一场馆可以有一对没有时间重合的时间对且另一场馆这一对时间重合。
21                 return 0;
22             l.insert(temp2.first);
23             r.insert(temp2.second);
24         }
25     }
26     return 1;
27 }
28 int main(){
29     ios::sync_with_stdio(false);
30     cin.tie(NULL);
31     cout.tie(NULL);
32     int n;
33     cin>>n;
34     int a,b,c,d;
35     for(int i=1;i<=n;++i){
36         cin>>a>>b>>c>>d;
37         v1.push_back(make_pair(make_pair(a,-1),make_pair(c,d)));//相同的开始时间和结束时间要让开始时间排在前面,因为开始时间和结束时间相同的这一对是时间重合的,把开始时间的标记打得比结束时间小,可以保留更多A场馆重合的场次的B场馆的时间对。
38         v1.push_back(make_pair(make_pair(b,0),make_pair(c,d)));
39         v2.push_back(make_pair(make_pair(c,-1),make_pair(a,b)));
40         v2.push_back(make_pair(make_pair(d,0),make_pair(a,b)));
41     }
42     sort(v1.begin(),v1.end());
43     sort(v2.begin(),v2.end());
44     if(!check(v1)||!check(v2))
45         cout<<"NO";
46     else
47         cout<<"YES";
48     return 0;
49 }

猜你喜欢

转载自www.cnblogs.com/ldudxy/p/12162070.html