新人求助,降雨量那题,本机AC提交AC

原题:

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

1<=n<=50000, 1<=m<=10000, -10^9<=yi<=10^9, 1<=ri<=10^9

(不算太神的)神题,经过3h的静态查错+对拍终于1A,好感动QAQ

其实这题思路是很简单的,时限也卡得不严,但是需要讨论的情况比较多而且很容易被忽略,考验思维精细程度

做法就是直接上线段树,每次根据某个位置或某段区间的值和某个位置或某段区间中有没有没有被钦定值来判断答案

判断某个位置或某段区间有没有被钦定可以直接取最小值(数据保证降雨量>=1)或01标记求区间和/区间最大值

然后就是情况大讨论辣!

具体都有什么情况就不说了,请同学们自行思考来锻炼思维精细程度

(其实是我实在不想再把各种情况讨论一遍了

如果实在WA不过去可以参考一下AC代码……

代码:

 #include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
const int oo=;
int rd(){int z=,mk=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-')mk=-; ch=getchar();}
while(ch>=''&&ch<=''){z=(z<<)+(z<<)+ch-''; ch=getchar();}
return z*mk;
}
int n,m,a[],b[]; int N,M;
int c[],tt=;
int e[][];
int bnrsch(int x){
int l=,r=tt,md;
while(l+<r){ md=(l+r)>>; (x<=c[md] ? r : l)=md;}
return c[l]==x ? l : r;
}
void mdf(int y,int z,int mk){
int x=,l=,r=tt,md;
for(;;){
e[mk][x]=max(e[mk][x],z);
if(l==r) break;
md=(l+r)>>;
if(y<=md) r=md,x<<=;
else l=md+,x=x<<|;
}
}
int sch(int x,int l,int r,int ll,int rr,int mk){
if(l<ll || r>rr || l>r) return ;
if(l==ll && r==rr) return e[mk][x];
int md=(ll+rr)>>;
if(l<=md && r>md) return max(sch(x<<,l,md,ll,md,mk),sch(x<<|,md+,r,md+,rr,mk));
else if(r<=md) return sch(x<<,l,r,ll,md,mk);
else return sch(x<<|,l,r,md+,rr,mk);
}
int main(){//freopen("ddd.in","r",stdin);
//freopen("ddd.out","w",stdout);
memset(e,,sizeof(e));
cin>>n; N=n<<|;
for(int i=;i<=n;++i) a[i<<]=rd(),a[i<<|]=rd();
cin>>m; M=m<<|;
for(int i=;i<=m;++i) a[N+(i<<)]=rd(),a[N+(i<<|)]=rd();
for(int i=;i<=N+M;++i) b[i]=a[i];
sort(b+,b+N+M+);
b[]=-oo;
for(int i=;i<=N+M;++i)if(b[i]!=b[i-]){
if(b[i]-!=b[i-]) c[++tt]=b[i]-;
c[++tt]=b[i];
}
int l,r,lst=,z,y;
for(int i=;i<=n;++i){
l=bnrsch(a[i<<]),r=a[i<<|];
for(int i=lst+;i<l;++i) mdf(i,,);
lst=l;
mdf(l,r,);
}
for(int i=;i<=m;++i){
l=bnrsch(a[N+(i<<)]),r=bnrsch(a[N+(i<<|)]);
if(l==r){ printf("true\n"); continue; }
z=sch(,r,r,,tt,),y=sch(,l,l,,tt,);
//if(!(z<=sch(1,l,l,1,tt,0) && z>sch(1,l+1,r-1,1,tt,0))) printf("false\n");
/*if(sch(1,l+1,r-1,1,tt,0)>=y) printf("false\n");
else if(sch(1,r,r,1,tt,1)) printf("maybe\n");
else if(z>sch(1,l+1,r-1,1,tt,0) && (sch(1,l,l,1,tt,1) || z<=y){
if(y<z) printf("false\n");
if(sch(1,l,r,1,tt,1)) printf("maybe\n");
else printf("true\n");
}*/
if(y && sch(,l+,r-,,tt,)>=y) printf("false\n");
else if(!z) printf("maybe\n");
else if(z>sch(,l+,r-,,tt,) && (!y || z<=y)){
if(sch(,l,r,,tt,)) printf("maybe\n");
else printf("true\n");
}
else printf("false\n");
}
return ;
}

【BZOJ1067】【SCOI2007】降雨量的更多相关文章

  1. [BZOJ1067][SCOI2007]降雨量

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

  2. 【线段树 细节题】bzoj1067: [SCOI2007]降雨量

    主要还是细节分析:线段树作为工具 Description 我们常常会说这样的话:“X年是自Y年以来降雨量最多的”.它的含义是X年的降雨量不超过Y年,且对于任意Y<Z<X,Z年的降雨量严格小 ...

  3. BZOJ1067 [SCOI2007]降雨量 RMQ???

    求救!!!神犇帮我瞅瞅呗...未完...调了2个半小时线段树,没调出来,大家帮帮我啊!!! 小詹用st表写. 我的思路就是把中间空着的年份设为无限,然后一点点特判就行了...然而没出来... [SCO ...

  4. BZOJ1067 [SCOI2007]降雨量 线段树

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1067 题意概括 给定n组整数对(Xi,Yi),当Xi<Xj且Yi>=Yj时,如果对于任 ...

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

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

  6. [bzoj1067][SCOI2007]降雨量——线段树+乱搞

    题目大意 传送门 题解 我国古代有一句俗话. 骗分出奇迹,乱搞最神奇! 这句话在这道题上得到了鲜明的体现. 我的方法就是魔改版线段树,乱搞搞一下,首先借鉴了黄学长的建树方法,直接用一个节点维护年份的区 ...

  7. 【BZOJ1067】[SCOI2007]降雨量 RMQ+特判

    [BZOJ1067][SCOI2007]降雨量 Description 我们常常会说这样的话:“X年是自Y年以来降雨量最多的”.它的含义是X年的降雨量不超过Y年,且对于任意Y<Z<X,Z年 ...

  8. bzoj 1067: [SCOI2007]降雨量 模擬

    1067: [SCOI2007]降雨量 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 2010  Solved: 503[Submit][Status] ...

  9. 1067: [SCOI2007]降雨量

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

  10. bzoj 1067: [SCOI2007]降雨量

    题目链接: bzoj 1067: [SCOI2007]降雨量 题解: 很简单的一道题,但代码里有许多细节需要注意,切容易出错,调了三个小时OTZ 做一个st表维护区间最大值就 在获得年份在序列中的po ...

随机推荐

  1. [HDU4585]Shaolin

    Problem 问你一个数的前驱和后继 Solution Treap模板题 Notice 注意输出那个人的编号 Code #include<cmath> #include<cstdi ...

  2. python全栈开发笔记---基本数据类型--字符串魔法

    字符串: def capitalize(self, *args, **kwargs) test = "aLxs" v = test.capitalize() #capitalize ...

  3. python,判断操作系统是windows,linux

    import sys,platform print(sys.platform) print(platform.system()) sys.platform: 获取当前系统平台. platform.sy ...

  4. 枚举类返回Map键值对,绑定到下拉框

    有时候,页面的下拉框要显示键值对,但是不想从数据库取,此时我们可以写一个枚举类, Java后台代码 1.枚举类 import java.util.HashMap; import java.util.M ...

  5. Mysql高可用

    一.二进制日志 二进制日志,记录所有对库的修改,如update.修改表结构等等 需要开启二进制日志的原因: 1.主从复制都是通过二进制日志进行.主库写二进制日志,传输到从库,从库replay二进制日志 ...

  6. RocketMq源码学习(一) nameService

    public class NamesrvStartup { public static Properties properties = null; public static CommandLine ...

  7. NioEventLoop中的thread什么时候启动

    在构造函数中被赋值,并传入传入runnable接口,方法里面循环select,然后处理找到的key 但是这个thread是什么时候被start的呢? 在bootstrap bind的逻辑里,后半部分是 ...

  8. ftell

    ftell:当前位置rewind:不管文件指向哪,它都会还原指向首部 缓存区的作用:大多数情况下是好事,合并系统调用行缓冲:换行.满了.强制(标准输出)刷新全缓冲:满了.强制(默认,只要不是终端)刷新 ...

  9. JAVA Collections.shuffle打乱列表

    在JAVA中如果想打乱LIST的顺序可以调用Collections.shuffle()或者Collections.shuffle(List<?> list, Random rnd)方法. ...

  10. The group WHATEVER is formed today

    Duang Duang!我们团队今天正式成立啦 团队名称:WHATEVER 团队成员如下: 个人介绍:天明宝,性别:女,爱好:偷懒 心有鸿鹄大志,却只有麻雀之行.一直在与自己做斗争,是个矛盾的综合体. ...