【BZOJ1067】【SCOI2007】降雨量(线段树)

链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1067

水题QwQ 但是细节相当烦啊!!

  1 #include <cstdio>
  2 #include <cstdlib>
  3 #include <iostream>
  4 #include <algorithm>
  5 #define MaxN 100010
  6 #define MaxM 4000010
  7 using namespace std;
  8 int n, m, tot = 0, cnt = 0, S = 0, root;
  9 int X[MaxN], Y[MaxN], sum[MaxN];
 10 int ls[MaxM], rs[MaxM], Max[MaxM];
 11 struct rec{
 12     int y, r;
 13 }da[MaxN], map[MaxN];
 14
 15 bool cmp(rec a, rec b){
 16     if (a.y == b.y) return a.r > b.r;
 17     return a.y < b.y;
 18 }
 19
 20 void Read_Data(){
 21     scanf("%d", &n);
 22     for (int i = 1; i <= n; i++) ++tot, scanf("%d%d", &da[tot].y, &da[tot].r);
 23     scanf("%d", &m);
 24     for (int i = 1; i <= m; i++) {
 25         scanf("%d%d", &X[i], &Y[i]);
 26         da[++tot] = (rec) {X[i], 0};
 27         da[++tot] = (rec) {Y[i], 0};
 28     }
 29     sort(da+1, da+1+tot, cmp);
 30     map[++cnt] = da[1]; sum[1] = da[1].r > 0;
 31     for (int i = 2; i <= tot; i++){
 32         if (da[i].y != da[i-1].y){
 33             ++cnt;
 34             map[cnt] = da[i];
 35             sum[cnt] = sum[cnt-1] + (map[cnt].r > 0);
 36         }
 37     }
 38 //    for (int i = 1; i <= cnt; i++) cout<<map[i].y<<" "<<map[i].r<<endl;
 39 }
 40
 41 void Build(int &x, int l, int r){
 42     x = ++S;
 43     if (l == r){
 44         Max[x] = map[l].r;
 45         return;
 46     }
 47     int mid = (l+r) >> 1;
 48     Build(ls[x], l, mid);
 49     Build(rs[x], mid+1, r);
 50     Max[x] = max(Max[ls[x]], Max[rs[x]]);
 51 }
 52
 53 int query(int x, int l, int r, int a, int b){
 54     if (l > r) return 0;
 55     if (a <= l && b >= r) return Max[x];
 56     int mid = (l+r) >> 1, t = 0;
 57     if (a <= mid) t = query(ls[x], l, mid, a, b);
 58     if (b > mid) t = max(t, query(rs[x], mid+1, r, a, b));
 59     return t;
 60 }
 61
 62 int query(int x, int y, int X, int Y){
 63     int MaxR = query(root, 1, cnt, x+1, y-1);
 64     int vx = map[x].r, vy = map[y].r;
 65 //    printf("x%d y%d X%d Y%d max%d sum%d vx%d vy%d\n", x, y, X, Y, MaxR, sum[y]-sum[x-1], vx, vy);
 66     if (!vy && !vx) return 1;
 67     if (!vy && MaxR < vx) return 1;
 68     if (!vx && MaxR < vy) return 1;
 69     if (map[y].r <= map[x].r && MaxR < map[y].r && sum[y]-sum[x-1] != Y-X+1 && vx && vy) return 1;
 70     if (map[y].r <= map[x].r && MaxR < map[y].r && sum[y]-sum[x-1] == Y-X+1 && vx && vy) return 2;
 71     return 0;
 72 }
 73
 74 int find(int x){
 75     int l = 1, r = cnt, mid;
 76     while (l < r){
 77         mid = (l+r) >> 1;
 78         if (x <= map[mid].y) r = mid;
 79         else l = mid+1;
 80     }
 81     return l;
 82 }
 83
 84 void Solve(){
 85     Build(root, 1, cnt);
 86     int x, y, t;
 87     for (int i = 1; i <= m; i++){
 88         x = find(X[i]), y = find(Y[i]);
 89         t = query(x, y, X[i], Y[i]);
 90         if (t == 0) printf("false\n");
 91         if (t == 1) printf("maybe\n");
 92         if (t == 2) printf("true\n");
 93     }
 94 }
 95
 96 int main(){
 97     freopen("bzoj1067.in", "r", stdin);
 98     freopen("bzoj1067.out", "w", stdout);
 99     Read_Data();
100     Solve();
101     return 0;
102 }
时间: 2024-10-05 21:25:27

【BZOJ1067】【SCOI2007】降雨量(线段树)的相关文章

bzoj1067 scoi2007 降雨量 RMQ+讨论

很水的题目 滚回来之后的第一道题 竟然做了1个多小时 最近的状态极其不好,这样下去有可能省队都进不了... 这个题算是RMQ的基础题了 写他就是为了练习RMQ的 首先预处理出来区间Max 我们注意到10^9的区间显然太大了,但是其中有用的点非常少,所以我们要离散出来 当然题目中其实已经给你排好序了... 所以在st 表建好以后,就每次读入然后二分找对应的离散后的相应坐标,然后o(1)就可以完成询问 具体的情况比较多 不过都听好想的 如果wa了看代码吧 #include <iostream> #

BZOJ1067: [SCOI2007]降雨量

1067: [SCOI2007]降雨量 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 4185  Solved: 1119[Submit][Status][Discuss] Description 我们常常会说这样的话:“X年是自Y年以来降雨量最多的”.它的含义是X年的降雨量不超过Y年,且对于任意Y<Z<X,Z年的降雨量严格小于X年.例如2002,2003,2004和2005年的降雨量分别为4920,5901,2832和3890,则可以说“200

BZOJ 1067 降雨量 线段树

传送门 这题也是醉了 估计考点是特判 不是数据结构 考察if和else的运用 主要是考虑几种情况的分类 看代码吧 对了 我写的是线段树 因为我懒 懒得搞ST #include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> #define N 50000+5 #define M 200000+5 using namespace std; int year[N],a[

【BZOJ1067】【POJ2637】WorstWeather Ever【SCOI2007】降雨量 线段树+恶心讨论

转载请注明出处谢谢:http://blog.csdn.net/vmurder/article/details/42918883 题意:自己去BZOJ上看. 但是总之询问就是要求 // 它的含义是X年的降雨量不超过Y年,且对于任意Y<Z<X,Z年的降雨量严格小于X年 // 左>=右>中 题解:然后首先离散化一下,然后把确定的年加到线段树中,乱搞一下就过了. 但是,,,讨论太恶心了!! 详情参照代码,写得很清晰(不清晰怎么A这道题) 代码: #include <cstdio>

bzoj1067——SCOI2007降雨量(线段树,细节题)

题目描述 我们常常会说这样的话:"X年是自Y年以来降雨量最多的".它的含义是X年的降雨量不超过Y年,且对于任意\(Y<Z<X\),Z年的降雨量严格小于X年.例如2002,2003,2004和2005年的降雨量分别为4920,5901,2832和3890,则可以说"2005年是自2003年以来最多的",但不能说"2005年是自2002年以来最多的"由于有些年份的降雨量未知,有的说法是可能正确也可以不正确的. 输入输出格式 输入格式: 输

【SCOI2007】【BZOJ1067】降雨量

BZOJ首页讨论区hot的题目→_←终于A掉他了 1067: [SCOI2007]降雨量 Time Limit: 1 Sec Memory Limit: 162 MB Submit: 2340 Solved: 609 [Submit][Status][Discuss] Description 我们常常会说这样的话:"X年是自Y年以来降雨量最多的".它的含义是X年的降雨量不超过Y年,且对于任意Y<Z<X,Z年的降雨量严格小于X年.例如2002,2003,2004和2005年的

1067: [SCOI2007]降雨量

1067: [SCOI2007]降雨量 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 2148  Solved: 554[Submit][Status] Description 我们常常会说这样的话:“X年是自Y年以来降雨量最多的”.它的含义是X年的降雨量不超过Y年,且对于任意Y<Z<X,Z年的降雨量严格小于X年.例如2002,2003,2004和2005年的降雨量分别为4920,5901,2832和3890,则可以说“2005年是自2003年以

[BZOJ 1067][SCOI2007]降雨量

题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1067 题解: 咳咳.这次因为遇到了一些比较有成就感的事情所以来发博. 听说这题要用线段树??开玩笑.当然不. 首先我们想想,如果我们知道了X年份的降雨量的时候,向前找已知降雨量比X大或等于的第一个年份(我们设为Z1),如果Y年份比Z1小则Y到X这个区间一定包含Z1,那么此命题为FALSE;如果我们知道Y年份降雨量,则向后找已知降雨量大于或等于Y的第一个年份Z2,如果X>Z2那么Y到X这个区间

[SCOI2007]降雨量

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行每行两个整数y

SCOI2007 降雨量 [ST表]

题面传送门 biubiubiu 题目描述 我们常常会说这样的话:"X年是自Y年以来降雨量最多的".它的含义是X年的降雨量不超过Y年,且对于任意 Y<Z<X,Z年的降雨量严格小于X年.例如2002,2003,2004和2005年的降雨量分别为4920,5901,2832和 3890,则可以说"2005年是自2003年以来最多的",但不能说"2005年是自2002年以来最多的"由于有些年份的降雨 量未知,有的说法是可能正确也可以不正确的.