题目描述

传送门

题解

离线离散化, 声明的年份和查找的年份一起建线段树。
线段树维护一下区间最大值,两个点之间是否有没有声明的年份打标记。
判断比较吃屎。
我大的分了两种情况:一个是需要在线段树中查询的,一个是直接判断的。
查询了之后,有好几种情况,分别按照是否出现、权值还有中间是否有相隔的年份来判断。

代码

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<map>
using namespace std;const int max_n=1e5+5;
const int max_tree=max_n*5;
const int INF=1e9;struct hp{int Maxn,Flag;
};
struct hq{int year,val;bool flag;
}a[max_n];
struct ho{int x,y;
}ask[max_n];
int n,m,N,x,y,lrange,rrange;
int year[max_n],val[max_n];
bool flag[max_n];
int maxn[max_tree],delta[max_tree];
map <int,int> hash;
map <int,bool> pd;inline int in(){int x=0,f=1; char ch=getchar();while (ch<'0'||ch>'9'){if (ch=='-') f=-1; ch=getchar();}while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();return x*f;
}inline int cmp(hq a,hq b){return a.year<b.year||(a.year==b.year&&a.val>b.val)||(a.year==b.year&&a.val==b.val&&a.flag>b.flag);
}inline void update(int now){maxn[now]=max(maxn[now<<1],maxn[now<<1|1]);delta[now]=delta[now<<1]&&delta[now<<1|1];
}inline void build(int now,int l,int r){int mid=(l+r)>>1;if (l==r){maxn[now]=val[l];delta[now]=flag[l];return;}build(now<<1,l,mid);build(now<<1|1,mid+1,r);update(now);
}inline hp query(int now,int l,int r,int lrange,int rrange){hp ans;int mid=(l+r)>>1;int MAXN=0;bool FLAG=true;if (lrange<=l&&r<=rrange)return ans=(hp){maxn[now],delta[now]};if (lrange<=mid){ans=query(now<<1,l,mid,lrange,rrange);MAXN=max(MAXN,ans.Maxn);FLAG=FLAG&&ans.Flag;}if (mid+1<=rrange){ans=query(now<<1|1,mid+1,r,lrange,rrange);MAXN=max(MAXN,ans.Maxn);FLAG=FLAG&&ans.Flag;}return ans=(hp){MAXN,FLAG};
}int main(){n=in();a[0].year=-INF;for (int i=1;i<=n;++i){a[i].year=in()+INF; a[i].val=in();pd[a[i].year]=true;if (a[i].year==a[i-1].year+1) a[i].flag=true;else a[i].flag=false;}m=in();for (int i=1;i<=m;++i){ask[i].y=in()+INF; ask[i].x=in()+INF;a[++n].year=ask[i].y;a[n].val=a[n].flag=0;a[++n].year=ask[i].x;a[n].val=a[n].flag=0;}sort(a+1,a+n+1,cmp);for (int i=1;i<=n;++i)if (a[i].year!=a[i-1].year){hash[a[i].year]=++N;val[N]=a[i].val;flag[N]=a[i].flag;}build(1,1,N);for (int i=1;i<=m;++i){y=ask[i].y; x=ask[i].x;lrange=hash[y]; rrange=hash[x];bool pd1=pd[y],pd2=pd[x];if (lrange>rrange){printf("false\n");continue;}if (lrange==rrange){if (pd1) printf("true\n");else printf("maybe\n");continue;}if (lrange+1==rrange){if (!pd1&&!pd2) printf("maybe\n");else if (!pd1||!pd2) printf("maybe\n");else{if (val[lrange]<val[rrange]) printf("false\n");else{if (y+1==x) printf("true\n");else printf("maybe\n");}}continue;}hp ans=query(1,1,N,lrange+1,rrange-1);if (!pd1&&!pd2){printf("maybe\n");continue;}if (!pd1){if (ans.Maxn>=val[rrange]) printf("false\n");else printf("maybe\n");continue;}if (!pd2){if (ans.Maxn>=val[lrange]) printf("false\n");else printf("maybe\n");continue;}if (val[lrange]<val[rrange]) printf("false\n");else if (ans.Maxn>=val[rrange]) printf("false\n");else{if (!(ans.Flag&&flag[rrange])) printf("maybe\n");else printf("true\n");}}
}

总结

手残脑残毁一生。。。

[BZOJ1067][SCOI2007]降雨量(线段树)相关推荐

  1. BZOJ1067: [SCOI2007]降雨量(线段树)

    题意:传送门 题解:这个题超级繁琐,参考传送门,传送门,我觉得本题的重点在于如何在线段树上加信息,使得中间漏掉的年份得以知道,有两种方法,通过维护区间和,提前建树时将不相邻年份设为0,还有一种方法是加 ...

  2. [SCOI2007]降雨量 线段树和区间最值(RMQ)问题

    题目链接P2471 [SCOI2007]降雨量 听说博客观看效果更佳    这道题是比较经典的 RMQRMQRMQ 问题,找到X和Y年间的最值来进行判断真假 , 用线段树维护是比较简单好写的.然而这只 ...

  3. P2471 [SCOI2007]降雨量(线段树)

    题目描述 我们常常会说这样的话:"X 年是自 Y 年以来降雨量最多的".它的含义是 X 年的降雨量不超过 Y 年,且对于任意 Y<Z<X,Z 年的降雨量严格小于 X 年 ...

  4. (线段树)洛谷 P2471 [SCOI2007]降雨量

    原题地址 https://www.luogu.com.cn/problem/P2471 解题思路 准备 好像只有我维护了两棵线段树? 先定义一个 rain\textit{rain}rain 数组存放降 ...

  5. 1067: [SCOI2007]降雨量

    1067: [SCOI2007]降雨量 Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 2148  Solved: 554 [Submit][Statu ...

  6. scoi2007降雨量

    1067: [SCOI2007]降雨量 Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 1096  Solved: 241 [Submit][Statu ...

  7. 【数据结构2-2】线段树与树状数组 题解

    头一次老老实实写完一个官方题单,发篇题解纪念一下-- 文章目录 P3372 [模板]线段树 1 P3373 [模板]线段树 2 P4588 [TJOI2018]数学计算 P1502 窗口的星星 P24 ...

  8. 1067: [SCOI2007]降雨量 - BZOJ

    Description 我们常常会说这样的话:"X年是自Y年以来降雨量最多的".它的含义是X年的降雨量不超过Y年,且对于任意Y<Z<X,Z年的降雨量严格小于X年.例如2 ...

  9. 二逼平衡树——树套树(线段树套Splay平衡树)

    题面 Bzoj3196 解析 线段树和Splay两棵树套在一起,常数直逼inf,但最终侥幸过了 思路还是比较简单, 在原数组维护一个下标线段树,再在每一个线段树节点,维护一个对应区间的权值Splay. ...

最新文章

  1. xBIM 实战01 在浏览器中加载IFC模型文件
  2. 浙江大学计算机考研408上岸,2016年跨考上岸浙江大学计算机研究生,初试412分经验谈!...
  3. android go解析json,Go 关于Json通用解析
  4. oracle windows 优化工具,使用Windows工具管理Nt上的Oracle数据库
  5. 一种本地和云端相结合的语音识别系统及方法与流程
  6. leetcode 367 Valid Perfect Square
  7. 360 android 应用市场,360应用市场
  8. windows 超简单实现多用户远程桌面,RDP WRAPPER
  9. ubuntu安装QQ教程
  10. 常见中文字体-英文名
  11. java抽签_java制作一个简单的抽签程序
  12. MaxScale 2.5
  13. 植物大战僵尸存档任务C1-01
  14. 杭电一学生还没毕业年薪已过百万,带十几人的研发团队
  15. 中国青年报:COS 有义务回应公众质疑
  16. Spring3—AOP
  17. Hadoop 之上的数据建模 - Data Vault 2.0
  18. 最新~涵盖全微服务操作的Spring Cloud 文档竟出自Alibaba
  19. 如何办理ITSS资质
  20. cad详图怎么画_室内设计CAD节点大样图如何绘制

热门文章

  1. IBM裁员传闻引他人挖角 公司发言人否认裁员规模
  2. B2B从销售到深度协作
  3. 一个屌丝程序猿的人生(一百零四)
  4. 2022国赛中职网搭 windows组策略
  5. 为什么你建出的模型不好看?
  6. C语言输出教学日历表
  7. openjudge 拯救行动
  8. 网易为什么成门户唯一常青树?从几个产品说起
  9. LC91 Decode Ways
  10. 机房动力环境集中监控系统