1 /*
2 贪心:官方题解:
3 首先我们考虑如何选择最左边的一个区间
4 假设最左边的区间标号是i, 那选择的另外两个区间的左端点必定要大于Ri
5 若存在i之外的j, 满足Rj<Ri, 那么另外两个区间的选择余地必定不会减少
6 因此,为了使另外两个区间有尽可能多的选择,我们选择一个右端点最小的区间作为最左边的区间是最好的
7 同理,我们选择一个左端点最大的区间作为最右边的区间,也将提供最多的选择
8 确定了这两个区间之后,只需判断是否存在一个区间位于它们中间且不交叉即可
9 本题的取模值十分特殊,用unsigned int的自然溢出可以达到同样的效果
10 时间复杂度O(N)
11 解题关键:if (mn_r < node[i].l && node[i].r < mx_l),存在这样的一个区间满足条件就YES!
12 反思:首先没有想到贪心的投机方法,用暴力DFS搜索超时,unsigned int的范围: 0 ~ 4294967295 这个取模自然溢出也是醉了:)
13 补充:HDOJ 2037 今年暑假不AC 升级版
14 */
15 #include <cstdio>
16 #include <iostream>
17 #include <algorithm>
18 #include <cstring>
19 #include <string>
20 #include <map>
21 #include <vector>
22 #include <set>
23 #include <cmath>
24 #include <queue>
25 using namespace std;
26 const int MAXN = 10000000 + 10;
27 const long long INF = 0x3f3f3f3f;
28 struct Node
29 {
30 unsigned int l, r;
31 }node[MAXN];
32
33 int main(void) //赛码 1001 Movie
34 {
35 //freopen ("A.in", "r", stdin);
36
37 int t, n;
38 unsigned int a, b, c, d;
39 scanf ("%d", &t);
40 while (t--)
41 {
42 scanf ("%d%d%d%d%d%d%d", &n, &node[1].l, &node[1].r, &a, &b, &c, &d);
43
44 for (int i=2; i<=n; ++i)
45 {
46 node[i].l = node[i-1].l * a + b;
47 node[i].r = node[i-1].r * c + d;
48 }
49 for (int i=1; i<=n; i++)
50 {
51 if (node[i].l > node[i].r) swap (node[i].l, node[i].r);
52 }
53
54 unsigned int mn_r = 4294967295UL, mx_l = 0;
55 for (int i=1; i<=n; ++i)
56 {
57 if (mn_r > node[i].r) mn_r = node[i].r;
58 if (mx_l < node[i].l) mx_l = node[i].l;
59 }
60
61 if (mn_r > mx_l)
62 {
63 puts ("NO"); continue;
64 }
65
66 bool flag = false;
67 for (int i=1; i<=n; ++i)
68 {
69 if (mn_r < node[i].l && node[i].r < mx_l)
70 {
71 flag = true; puts ("YES"); break;
72 }
73 }
74 if (!flag) puts ("NO");
75 }
76
77 return 0;
78 }
1 /* 2 贪心水题 3 */ 4 #include <cstdio> 5 #include <iostream> 6 #include <algorithm> 7 using namespace std; 8 9 const int MAXN = 1e2 + 10; 10 const int INF = 0x3f3f3f3f; 11 struct Node 12 { 13 int l, r; 14 }node[MAXN]; 15 16 bool cmp(Node x, Node y) 17 { 18 if (x.r == y.r) return x.l < y.l; 19 20 return x.r < y.r; 21 } 22 23 int main(void) //HDOJ 2037 今年暑假不AC 24 { 25 //freopen ("HDOJ_2037.in", "r", stdin); 26 27 int n; 28 while (scanf ("%d", &n) == 1) 29 { 30 if (n == 0) break; 31 32 if (n == 1) 33 { 34 puts ("1"); continue; 35 } 36 37 for (int i=1; i<=n; ++i) 38 { 39 scanf ("%d%d", &node[i].l, &node[i].r); 40 if (node[i].l > node[i].r) swap (node[i].l, node[i].r); 41 } 42 43 sort (node+1, node+1+n, cmp); 44 45 int cnt = 1; 46 int tmp = node[1].r; 47 for (int i=2; i<=n; ++i) 48 { 49 if (node[i].l >= tmp) 50 { 51 tmp = node[i].r; ++cnt; 52 } 53 } 54 55 printf ("%d ", cnt); 56 } 57 58 return 0; 59 }