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 }
View Code

相关文章: