首页 > 其他分享 >P2471 [SCOI2007] 降雨量 题解

P2471 [SCOI2007] 降雨量 题解

时间:2024-09-09 13:35:51浏览次数:9  
标签:ch ed P2471 st ans && 题解 SCOI2007 text

题目传送门

分析

分讨题。

首先发现是 RMQ 问题(区间最值),可以用线段树或 ST 表来维护(代码为线段树 ,因为我忘记 ST 表怎么写了)。

然后发现有些年份不明确导致区间判断似乎不好搞。

但事实上只要判断下标差是否等于年份差即可得出该区间有无不明确年份。

其次考虑“必真”,“必假”,“有可能”三种结果的优先级。

稍微想想就会发现 \(\text{False} \gt \text{Maybe} \gt \text{True}\)。

于是先考虑 \(\text{False}\)。

  1. 如果 \(X\) 明确,且 \(Y + 1 \sim X - 1\) 区间内存在 \(Z, r_Z \ge r_X\)。
  2. 如果 \(Y\) 明确,且 \(Y + 1 \sim X - 1\) 区间内存在 \(Z, r_Z \ge r_Y\)。
  3. 如果 \(X, Y\) 明确,且 \(r_X \gt r_Y\)。

然后考虑 \(\text{Maybe}\)(此时必然不满足上述条件)。

  1. 如果 \(X, Y\) 明确,且 \(Y + 1 \sim X - 1\) 区间内存在 \(Z\) 不明确。

  2. 如果 \(X\) 不明确。

  3. 如果 \(Y\) 不明确。

以上条件不满足的自然是 \(\text{True}\) 了。

点击查看代码
/*
--------------------------------
|        code by FRZ_29        |
|          code  time          |
|          2024/09/09          |
|           12:15:58           |
|            星期一             |
--------------------------------
                                */

#include <iostream>
#include <climits>
#include <cstdio>
#include <ctime>

using namespace std;

void RD() {}
template<typename T, typename... U> void RD(T &x, U&... arg) {
    x = 0; int f = 1;
    char ch = getchar();
    while (ch < '0' || ch > '9') { if (ch == '-') f = -1; ch = getchar(); }
    while (ch >= '0' && ch <= '9') x = (x << 3) + (x << 1) + ch - '0', ch = getchar();
    x *= f; RD(arg...);
}

const int N = 5e4 + 5;

#define LS (rt << 1)
#define RS (rt << 1 | 1)
#define MID (l + r >> 1)
#define PRINT(x) cout << #x << " = " << x << "\n"
#define LF(i, __l, __r) for (int i = __l; i <= __r; i++)
#define RF(i, __r, __l) for (int i = __r; i >= __l; i--)

int n, y[N], _r[N], Max[N << 2], m;

void up(int rt) {
    Max[rt] = max(Max[LS], Max[RS]);
}

void build(int rt, int l, int r) {
    if (l == r) {
        Max[rt] = _r[l];
        return;
    }

    build(LS, l, MID), build(RS, MID + 1, r);
    up(rt);
}

int query(int rt, int l, int r, int L, int R) {
    if (L <= l && r <= R) return Max[rt];
    int ans = 0;
    if (MID >= L) ans = max(ans, query(LS, l, MID, L, R));
    if (MID < R) ans = max(ans, query(RS, MID + 1, r, L, R));
    return ans;
}

int main() {
   freopen("read.in", "r", stdin);
   freopen("out.out", "w", stdout);
//    time_t st = clock();
    RD(n);
    LF(i, 1, n) RD(y[i], _r[i]);
    build(1, 1, n);
    RD(m);
    while (m--) {
        int X, Y, ans = 0; RD(X, Y);
        int st = lower_bound(y + 1, y + n + 1, X) - y,
            ed = lower_bound(y + 1, y + n + 1, Y) - y;
        bool is_st = y[st] == X, is_ed = y[ed] == Y;
        if (!is_st) st--;
        if (st + 1 <= ed - 1) ans = query(1, 1, n, st + 1, ed - 1);
        if ((ans >= _r[ed] && is_ed) || (ans >= _r[st] && is_st) || (_r[st] < _r[ed] && is_st && is_ed)) puts("false");
        else if ((ed - st != y[ed] - y[st] && is_ed && is_st) || !is_st || !is_ed) puts("maybe");
        else puts("true");
    }
//    printf("\n%dms", clock() - st)
    return 0;
}

/* ps:FRZ弱爆了 */

标签:ch,ed,P2471,st,ans,&&,题解,SCOI2007,text
From: https://www.cnblogs.com/FRZ29/p/18404380

相关文章

  • 【洛谷 P1996】约瑟夫问题 题解(数组+模拟+循环)
    约瑟夫问题题目描述个人围成一圈,从第一个人开始报数,数到的人出列,再由下一个人重新从开始报数,数到的人再出圈,依次类推,直到所有的人都出圈,请输出依次出圈人的编号。注意:本题和《深入浅出-基础篇》上例题的表述稍有不同。书上表述是给出淘汰名小朋友,而该题是全部出圈。输入......
  • 题解 GZOI2023D2B【乒乓球】
    4s,512M题目描述Alice和Bob在打乒乓球,乒乓球比赛的规则是这样的:一场比赛中两位选手将进行若干局比赛,选手只需要赢得\(X\)局比赛就宣告其胜利;每局比赛中两位选手将进行若干盘比赛,选手只需要赢得\(Y\)盘比赛就宣告其胜利;每盘比赛中两位选手将进行乒乓球对决,有且仅有一位选......
  • AtCoder Beginner Contest 274 A~E 题解
    吐槽:这比赛名字为啥没有英文版。。。A-BattingAverage题目大意给定整数\(A,B\),输出\(\fracBA\),保留三位小数。\(1\leA\le10\)\(0\leB\leA\)分析签到题,使用printf或cout格式化输出即可。代码#include<cstdio>usingnamespacestd;intmain(){ inta,b; sc......
  • TOYOTA MOTOR CORPORATION Programming Contest 2023#1 (AtCoder Beginner Contest 29
    好久没写题解了,这就来水一篇。A-JobInterview题目大意给定一个长为\(N\)的字符串\(S\),由o、-、x组成。判断\(S\)是否符合下列条件:\(S\)中至少有一个o。\(S\)中没有x。\(1\leN\le100\)分析签到题。直接按题意模拟即可。代码#include<cstdio>usingn......
  • AtCoder Beginner Contest 318 G - Typical Path Problem 题解
    G-TypicalPathProblem题目大意给定一张\(N\)个点、\(M\)条边的简单无向图\(G\)和三个整数\(A,B,C\)。是否存在一条从顶点\(A\)到\(C\),且经过\(B\)的简单路径?数据范围:\(3\leN\le2\times10^5\)\(N-1\leM\le\min(\frac{N(N-1)}2,2\times10^5)\)\(1\leA......
  • UNIQUE VISION Programming Contest 2023 Christmas (AtCoder Beginner Contest 334)
    A-ChristmasPresent题目大意给定两个正整数\(B,G\)(\(1\leB,G\le1000\)且\(B\neG\)),判断哪个更大。分析模拟即可。代码#include<cstdio>usingnamespacestd;intmain(){ intb,g; scanf("%d%d",&b,&g); puts(b>g?"Bat":&qu......
  • 洛谷 P9754 [CSP-S 2023] 结构体 题解
    题目传送门洛谷博客CSDNCSP-S2023T3结构体题解基本思路本题主要考查编码能力,所以直接给出基本思路:由于可以递归式的创建元素,最多可以同时存在\(100^{100}\)个不同的基础类型的元素。即使算上最大地址的限制,元素的数量也能达到\(10^{18}\)。显然,依次构造每个元素,在空......
  • AT_agc027_f [AGC027F] Grafting 题解
    笑点解析:NOIP模拟赛把这题放在T3。因为每一个点只能动一次,答案一定\(\len\),所以我们分两种情况讨论:当答案小于\(n\)答案如果小于\(n\),那么一定有一个点是一直没有被动过的。我们枚举这个点,将无根树转化为两棵以这个点为根的有根树。我们将第一棵树和第二棵树同构的部分......
  • AtCoder Beginner Contest 254 A~E 题解
    A-LastTwoDigits题目大意给定正整数\(N\),求\(N\)的后两位。\(100\leN\le999\)输入格式\(N\)输出格式输出\(N\)的后两位,注意输出可能有前导0。样例\(N\)输出\(254\)54\(101\)01分析题目已经规定\(N\)是三位数,因此无需使用整数输入,直接将输入看成......
  • AtCoder Beginner Contest 258 A~Ex 题解
    D-Trophy题目大意有一个游戏,由\(N\)个关卡组成。第\(i\)个关卡由一个数对\((A_i,B_i)\)组成。要通过一个关卡,你必须先花\(A_i\)的时间看一次介绍。然后,用\(B_i\)的时间打通这个关卡。若想多次通过同一个关卡,则第一次需要看介绍,后面无需再看(即如果想打通第\(i\)关\(N\)次,则所......