http://codeforces.com/contest/1284/problem/D
把区间对的第二维放入以第一维为下标的数轴中(如1 2 3 4,就把区间[3,4]放入位置1和位置2),如此同个位置的所有区间必须两两相交,即检验第一维相交➡第二维相交。同理检验第二维相交➡第一维相交。“放入”可用差分的方式。检验:新加入一个区间[x,y],必须满足y>=s_max,且x<=e_min,其中s和e是起点和终点。可用multiset维护加入、检测、删除。
1 #include <bits/stdc++.h> 2 using namespace std; 3 #define LL long long 4 5 int n; 6 #define maxn 200011 7 struct AAA{int c,d,x,y;}a[maxn]; 8 struct EVE 9 { 10 int pos,x,y; bool ty; 11 bool operator < (const EVE &b) const 12 {return pos<b.pos || (pos==b.pos && ty<b.ty);} 13 }eve[maxn<<1]; int leve=0; 14 multiset<int> muls,mult; 15 16 #define IT multiset<int>::iterator 17 int main() 18 { 19 scanf("%d",&n); 20 for (int i=1;i<=n;i++) 21 { 22 scanf("%d%d%d%d",&a[i].c,&a[i].d,&a[i].x,&a[i].y); 23 eve[++leve]=(EVE){a[i].c,a[i].x,a[i].y,1}; 24 eve[++leve]=(EVE){a[i].d+1,a[i].x,a[i].y,0}; 25 } 26 sort(eve+1,eve+1+leve); 27 28 muls.clear(); mult.clear(); 29 for (int i=1;i<=leve;i++) 30 { 31 if (!eve[i].ty) muls.erase(muls.lower_bound(eve[i].x)),mult.erase(mult.lower_bound(eve[i].y)); 32 else 33 { 34 if (!muls.empty()) 35 { 36 IT it=muls.end(); it--; 37 if (eve[i].y<(*it)) {puts("NO"); return 0;} 38 it=mult.begin(); 39 if (eve[i].x>(*it)) {puts("NO"); return 0;} 40 } 41 muls.insert(eve[i].x),mult.insert(eve[i].y); 42 } 43 } 44 45 leve=0; 46 for (int i=1;i<=n;i++) 47 { 48 eve[++leve]=(EVE){a[i].x,a[i].c,a[i].d,1}; 49 eve[++leve]=(EVE){a[i].y+1,a[i].c,a[i].d,0}; 50 } 51 sort(eve+1,eve+1+leve); 52 53 muls.clear(); mult.clear(); 54 for (int i=1;i<=leve;i++) 55 { 56 if (!eve[i].ty) muls.erase(muls.lower_bound(eve[i].x)),mult.erase(mult.lower_bound(eve[i].y)); 57 else 58 { 59 if (!muls.empty()) 60 { 61 IT it=muls.end(); it--; 62 if (eve[i].y<(*it)) {puts("NO"); return 0;} 63 it=mult.begin(); 64 if (eve[i].x>(*it)) {puts("NO"); return 0;} 65 } 66 muls.insert(eve[i].x),mult.insert(eve[i].y); 67 } 68 } 69 70 puts("YES"); 71 return 0; 72 }