新人求助,降雨量那题,本机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. 【原创】连接数据库MySQL,读取、显示、修改数据

    /* Time: 2017.01.02 —— 2017.01.04 * Author: WJ * Function:连接数据库,从数据库中读取图片并显示(已成功) */ [参考链接] MySQL存入图 ...

  2. JavaScript -基础- 函数与对象(三)正则、Match对象

    一.正则对象 1.创建方法 1)方式一 var re_obj=new RegExp("\d+","g") 规则+模式(g 全局模式/i 不区分大小写/gi) r ...

  3. day039 数据库索引

    今日内容: 1.为什么要有索引 简而言之,索引出现的意义是为了更方便,更快速的查询数据. 什么是索引 索引在mysql中也叫''键''或'key'(primary key unique key,ind ...

  4. Date与时间戳的相互转换(Java)

      1.Date对象转换为时间戳 Date date = new Date(); long times = date.getTime(); System.out.println(times); 效果如 ...

  5. S2 深入.NET和C#编程 机试测试错题积累

    机试第一题:                              //创建文件流(路径 模式) FileStream fa = new FileStream(@"D:\\S2第一次全文 ...

  6. java关于集合的遍历与增强for循环(foreach)的使用

     java集合类的使用可以说是无处不在,总的我们可以将之分为三大块,分别是从Collection接口延伸出的List.Set和以键值对形式作存储的Map类型集合.      许多情况需要我们遍历出集合 ...

  7. 从头入手jenkins

    前段时间项目处在测试阶段.5个测试妹子围着转,你不知道幸福的啊. 项目一共有开发.测试.生产三个环境,每次打包要切换分支代码,然后使用Xcode打包,然后生成ipa,再上传到蒲公英或者fir给测试妹子 ...

  8. SQL-35 对于表actor批量插入如下数据,如果数据已经存在,请忽略,不使用replace操作

    题目描述 对于表actor批量插入如下数据,如果数据已经存在,请忽略,不使用replace操作CREATE TABLE IF NOT EXISTS actor (actor_id smallint(5 ...

  9. 使用DLL在进程间共享数据

    0x01 DLL在进程间共享数据理论 1.可以在Dll中使用#pragma data_seg建立共享类型的数据段将需要共享的数据分离出来,放置在一个独立的数据段里,并把该段的属性设置为共享,从而实现不 ...

  10. Centos7下mysql5.7.22主从配置

    一:服务器配置 1.1修改root密码: ALTER USER 'root'@'localhost' IDENTIFIED BY 'xxxx'; 1.2添加远程登陆用户: GRANT ALL PRIV ...