新人求助,降雨量那题,本机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. [AtCoder2558]Many Moves

    Problem 共有n个格子,有两个硬币在a,b格子上,还有q个操作. 每个操作给你一个编号,要求将一个硬币移到这个编号上. 问你硬币移动的总距离最小值. Solution O(n^3):DP[i][ ...

  2. 非图片格式如何转成lmdb格式--caffe

    链接 LMDB is the database of choice when using Caffe with large datasets. This is a tutorial of how to ...

  3. C++构造函数和析构函数,以及构造函数特殊成员变量和函数的初始化

    body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...

  4. uitableView group模式下的间距问题

    我么在使用group模式定义tableview的时候,系统默认是会有head和foot的间距的,来区分我们不同的group:在具体使用的时候又时候我们不需要这个间距.我们可以重新赋值这些间距来达到我们 ...

  5. 深入理解java虚拟机---垃圾回收(十一)

    1.垃圾回收要解决的问题 可以通过配置虚拟机参数来打印出内存日志: -verbose:gc -XX:+PrintGCDetails 垃圾收集(Garbage Collection,GC),要设计一个G ...

  6. bootstarp3

    1.布局 样式  col-**-1    最大为col-lg-12 表示最大 2.下拉框   .dropdown 下拉菜单(Dropdown)插件 https://github.com/danielf ...

  7. Java 利用poi生成excel表格

    所需jar包,如下所示 写一个excel工具类 ExcelUtils .java import java.lang.reflect.Field; import java.util.Iterator; ...

  8. Java与C++简单对比

    Java语言让编程者无法找到指针来直接访问内存,并且增添了自动的内存管理功能,从而有效的组织了C/C++语言中指针操作失误,如滥用指针所造成的系统崩溃,Java的指针在虚拟机内部使用,这保证了Java ...

  9. 强化学习6-MC与TD的比较-实战

    # encoding:utf-8 import numpy as np import matplotlib.pylab as plt ''' 随机行走问题 0 - 1 - 2 - 3 - 4 - 5 ...

  10. FCC JS基础算法题(7):Chunky Monkey(分割数组)

    题目描述: 把一个数组arr按照指定的数组大小size分割成若干个数组块. 例如:chunk([1,2,3,4],2)=[[1,2],[3,4]]; chunk([1,2,3,4,5],2)=[[1, ...