[BZOJ1067][SCOI2007]降雨量(线段树)
题目描述
传送门
题解
离线离散化, 声明的年份和查找的年份一起建线段树。
线段树维护一下区间最大值,两个点之间是否有没有声明的年份打标记。
判断比较吃屎。
我大的分了两种情况:一个是需要在线段树中查询的,一个是直接判断的。
查询了之后,有好几种情况,分别按照是否出现、权值还有中间是否有相隔的年份来判断。
代码
#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]降雨量(线段树)相关推荐
- BZOJ1067: [SCOI2007]降雨量(线段树)
题意:传送门 题解:这个题超级繁琐,参考传送门,传送门,我觉得本题的重点在于如何在线段树上加信息,使得中间漏掉的年份得以知道,有两种方法,通过维护区间和,提前建树时将不相邻年份设为0,还有一种方法是加 ...
- [SCOI2007]降雨量 线段树和区间最值(RMQ)问题
题目链接P2471 [SCOI2007]降雨量 听说博客观看效果更佳 这道题是比较经典的 RMQRMQRMQ 问题,找到X和Y年间的最值来进行判断真假 , 用线段树维护是比较简单好写的.然而这只 ...
- P2471 [SCOI2007]降雨量(线段树)
题目描述 我们常常会说这样的话:"X 年是自 Y 年以来降雨量最多的".它的含义是 X 年的降雨量不超过 Y 年,且对于任意 Y<Z<X,Z 年的降雨量严格小于 X 年 ...
- (线段树)洛谷 P2471 [SCOI2007]降雨量
原题地址 https://www.luogu.com.cn/problem/P2471 解题思路 准备 好像只有我维护了两棵线段树? 先定义一个 rain\textit{rain}rain 数组存放降 ...
- 1067: [SCOI2007]降雨量
1067: [SCOI2007]降雨量 Time Limit: 1 Sec Memory Limit: 162 MB Submit: 2148 Solved: 554 [Submit][Statu ...
- scoi2007降雨量
1067: [SCOI2007]降雨量 Time Limit: 1 Sec Memory Limit: 162 MB Submit: 1096 Solved: 241 [Submit][Statu ...
- 【数据结构2-2】线段树与树状数组 题解
头一次老老实实写完一个官方题单,发篇题解纪念一下-- 文章目录 P3372 [模板]线段树 1 P3373 [模板]线段树 2 P4588 [TJOI2018]数学计算 P1502 窗口的星星 P24 ...
- 1067: [SCOI2007]降雨量 - BZOJ
Description 我们常常会说这样的话:"X年是自Y年以来降雨量最多的".它的含义是X年的降雨量不超过Y年,且对于任意Y<Z<X,Z年的降雨量严格小于X年.例如2 ...
- 二逼平衡树——树套树(线段树套Splay平衡树)
题面 Bzoj3196 解析 线段树和Splay两棵树套在一起,常数直逼inf,但最终侥幸过了 思路还是比较简单, 在原数组维护一个下标线段树,再在每一个线段树节点,维护一个对应区间的权值Splay. ...
最新文章
- xBIM 实战01 在浏览器中加载IFC模型文件
- 浙江大学计算机考研408上岸,2016年跨考上岸浙江大学计算机研究生,初试412分经验谈!...
- android go解析json,Go 关于Json通用解析
- oracle windows 优化工具,使用Windows工具管理Nt上的Oracle数据库
- 一种本地和云端相结合的语音识别系统及方法与流程
- leetcode 367 Valid Perfect Square
- 360 android 应用市场,360应用市场
- windows 超简单实现多用户远程桌面,RDP WRAPPER
- ubuntu安装QQ教程
- 常见中文字体-英文名
- java抽签_java制作一个简单的抽签程序
- MaxScale 2.5
- 植物大战僵尸存档任务C1-01
- 杭电一学生还没毕业年薪已过百万,带十几人的研发团队
- 中国青年报:COS 有义务回应公众质疑
- Spring3—AOP
- Hadoop 之上的数据建模 - Data Vault 2.0
- 最新~涵盖全微服务操作的Spring Cloud 文档竟出自Alibaba
- 如何办理ITSS资质
- cad详图怎么画_室内设计CAD节点大样图如何绘制