1067: [SCOI2007]降雨量
Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 6016 Solved: 1574
[Submit][Status][Discuss]
Description
我们常常会说这样的话:“X年是自Y年以来降雨量最多的”。它的含义是X年的降雨量不超过Y年,且对于任意
Y<Z<X,Z年的降雨量严格小于X年。例如2002,2003,2004和2005年的降雨量分别为4920,5901,2832和3890,
则可以说“2005年是自2003年以来最多的”,但不能说“2005年是自2002年以来最多的”由于有些年份的降雨量未
知,有的说法是可能正确也可以不正确的。
Input
输入仅一行包含一个正整数n,为已知的数据。以下n行每行两个整数yi和ri,为年份和降雨量,按照年份从小
到大排列,即yi<yi+1。下一行包含一个正整数m,为询问的次数。以下m行每行包含两个数Y和X,即询问“X年是
自Y年以来降雨量最多的。”这句话是必真、必假还是“有可能”。
Output
对于每一个询问,输出true,false或者maybe。
Sample Input
6
2002 4920
2003 5901
2004 2832
2005 3890
2007 5609
2008 3024
5
2002 2005
2003 2005
2002 2007
2003 2007
2005 2008
2002 4920
2003 5901
2004 2832
2005 3890
2007 5609
2008 3024
5
2002 2005
2003 2005
2002 2007
2003 2007
2005 2008
Sample Output
false
true
false
maybe
false
true
false
maybe
false
HINT
100%的数据满足:1<=n<=50000, 1<=m<=10000, -10^9<=yi<=10^9, 1<=ri<=10^9
Source
思路:线段树维护区间最小值,各种情况分类讨论一下就行了。
1 #include <iostream> 2 #include <fstream> 3 #include <sstream> 4 #include <cstdlib> 5 #include <cstdio> 6 #include <cmath> 7 #include <string> 8 #include <cstring> 9 #include <algorithm> 10 #include <queue> 11 #include <stack> 12 #include <vector> 13 #include <set> 14 #include <map> 15 #include <list> 16 #include <iomanip> 17 #include <cctype> 18 #include <cassert> 19 #include <bitset> 20 #include <ctime> 21 22 using namespace std; 23 24 #define pau system("pause") 25 #define ll long long 26 #define pii pair<int, int> 27 #define pb push_back 28 #define mp make_pair 29 #define clr(a, x) memset(a, x, sizeof(a)) 30 31 const double pi = acos(-1.0); 32 const int INF = 0x3f3f3f3f; 33 const int MOD = 1e9 + 7; 34 const double EPS = 1e-9; 35 36 /* 37 #include <ext/pb_ds/assoc_container.hpp> 38 #include <ext/pb_ds/tree_policy.hpp> 39 40 using namespace __gnu_pbds; 41 tree<pli, null_type, greater<pli>, rb_tree_tag, tree_order_statistics_node_update> T; 42 */ 43 44 int n, q; 45 struct gg { 46 int y, r; 47 gg () {} 48 gg (int y, int r) : y(y), r(r) {} 49 bool operator < (const gg &g) const { 50 return y == g.y ? r < g.r : y < g.y;} 51 } g[50015]; 52 int ma[200015]; 53 void pushup(int i) { 54 ma[i] = max(ma[i << 1], ma[i << 1 | 1]); 55 } 56 void build(int i, int l, int r) { 57 if (l == r) { 58 ma[i] = g[l].r; 59 return; 60 } 61 int mi = l + r >> 1; 62 build(i << 1, l, mi); 63 build(i << 1 | 1, mi + 1, r); 64 pushup(i); 65 } 66 int query(int i, int l, int r, int x, int y) { 67 if (x > y) return 0; 68 if (x <= l && r <= y) { 69 return ma[i]; 70 } 71 int mi = l + r >> 1, res1 = -MOD, res2 = -MOD; 72 if (x <= mi) res1 = query(i << 1, l, mi, x, y); 73 if (mi < y) res2 = query(i << 1 | 1, mi + 1, r, x, y); 74 return max(res1, res2); 75 } 76 int main() { 77 scanf("%d", &n); 78 for (int i = 1; i <= n; ++i) { 79 scanf("%d%d", &g[i].y, &g[i].r); 80 } 81 build(1, 1, n); 82 scanf("%d", &q); 83 while (q--) { 84 int x, y; 85 scanf("%d%d", &x, &y); 86 int p2 = lower_bound(g + 1, g + n + 1, gg(y, 0)) - g; 87 int p1 = lower_bound(g + 1, g + n + 1, gg(x, 0)) - g; 88 if (g[p2].y != y) { 89 if (g[p1].y != x) { 90 puts("maybe"); 91 } else { 92 int tma = query(1, 1, n, p1 + 1, p2 - 1); 93 if (tma >= g[p1].r) { 94 puts("false"); 95 } else { 96 puts("maybe"); 97 } 98 } 99 } else { 100 if (g[p1].y == x) { 101 int tma = query(1, 1, n, p1 + 1, p2 - 1); 102 if (tma >= g[p2].r || g[p1].r < g[p2].r) { 103 puts("false"); 104 } else if (p2 - p1 == y - x) { 105 puts("true"); 106 } else { 107 puts("maybe"); 108 } 109 } else { 110 int tma = query(1, 1, n, p1, p2 - 1); 111 if (tma >= g[p2].r) { 112 puts("false"); 113 } else { 114 puts("maybe"); 115 } 116 } 117 } 118 } 119 return 0; 120 }