• HYSBZ


    1067: [SCOI2007]降雨量

    Time Limit: 1 Sec  Memory Limit: 162 MB
    Submit: 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

    Sample Output

    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 }
  • 相关阅读:
    使用 udev 高效、动态地管理 Linux 设备文件
    【技术贴】visual stdio 2005下载地址,vs2005下载地址 vs2005正版破解 v
    【转】无法登陆SQL server 服务器的解决办法
    【技术贴】visual stdio 2005下载地址,vs2005下载地址 vs2005正版破解 v
    【技术贴】远程桌面连接 时“由于帐户限制 您无法登陆”的解决办法
    【转】桌面快捷方式打不开的解决办法
    【技术贴】从51下载的网站代码asp源码怎么运行?怎么打开?
    【转】Visual Studio 2005不能调试的错误
    【技术贴】asms文件,安装windows xp原版时,需要“asms”文件,H:\I386\asm
    【技术贴】asms文件,安装windows xp原版时,需要“asms”文件,H:\I386\asm
  • 原文地址:https://www.cnblogs.com/BIGTOM/p/8492982.html
Copyright © 2020-2023  润新知