思路:
判断在venue a中冲突的任意两个lecture在venue b中是否也冲突。
实现:
1 #include<bits/stdc++.h> 2 using namespace std; 3 bool check(vector<vector<int>>&a,vector<vector<int>>&b){ 4 int n=a.size(); 5 vector<int>v; 6 for(int i=0;i<n;i++){ 7 v.push_back(a[i][0]); 8 v.push_back(a[i][1]); 9 } 10 sort(v.begin(),v.end()); 11 v.erase(unique(v.begin(),v.end()),v.end()); 12 map<int,int>mp; 13 int m=v.size(); 14 for(int i=0;i<m;i++){ 15 mp[v[i]]=i; 16 } 17 vector<vector<int>>bb(m,vector<int>()); 18 vector<vector<int>>ee(m,vector<int>()); 19 for(int i=0;i<n;i++){ 20 int begin=mp[a[i][0]]; 21 int end=mp[a[i][1]]; 22 bb[begin].push_back(i); 23 ee[end].push_back(i); 24 } 25 multiset<int>stb,ste; 26 for(int i=0;i<m;i++){ 27 if(i){ 28 for(int j=0;j<ee[i-1].size();j++){ 29 int id=ee[i-1][j]; 30 int begin=b[id][0],end=b[id][1]; 31 auto tmp=stb.find(begin); 32 if(tmp!=stb.end()){ 33 stb.erase(tmp); 34 } 35 tmp=ste.find(end); 36 if(tmp!=ste.end()){ 37 ste.erase(tmp); 38 } 39 } 40 } 41 for(int j=0;j<bb[i].size();j++){ 42 int id=bb[i][j]; 43 int begin=b[id][0],end=b[id][1]; 44 if(!stb.empty()){ 45 int maxb=*stb.rbegin(); 46 int mine=*ste.begin(); 47 if(begin>mine or end<maxb){ 48 return false; 49 } 50 } 51 stb.insert(begin); 52 ste.insert(end); 53 } 54 } 55 return true; 56 } 57 int main(){ 58 int n; 59 while(cin>>n){ 60 vector<vector<int>>a(n,vector<int>(2,0)),b(n,vector<int>(2,0)); 61 for(int i=0;i<n;i++)cin>>a[i][0]>>a[i][1]>>b[i][0]>>b[i][1]; 62 if(check(a,b) and check(b,a)){ 63 cout<<"YES"<<endl; 64 } 65 else{ 66 cout<<"NO"<<endl; 67 } 68 } 69 return 0; 70 }