求救!!!神犇帮我瞅瞅呗。。。未完。。。调了2个半小时线段树,没调出来,大家帮帮我啊!!!

小詹用st表写。

我的思路就是把中间空着的年份设为无限,然后一点点特判就行了。。。然而没出来。。。

[SCOI2007]降雨量

题干:

Description

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

Input

  输入仅一行包含一个正整数n,为已知的数据。以下n行每行两个整数yi和ri,为年份和降雨量,按照年份从小
到大排列,即yi<yi+1。下一行包含一个正整数m,为询问的次数。以下m行每行包含两个数Y和X,即询问“X年是
自Y年以来降雨量最多的。”这句话是必真、必假还是“有可能”。

Output

  对于每一个询问,输出true,false或者maybe。

Sample Input

6
2002 4920
2003 5901
2004 2832
2005 3890
2007 5609
2008 3024
5
2002 2005
2003 2005
2002 2007
2003 2007
2005 2008

Sample Output

false
true
false
maybe
false

HINT

100%的数据满足:1<=n<=50000, 1<=m<=10000, -10^9<=yi<=10^9, 1<=ri<=10^9

我的凉凉线段树代码:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<ctime>
#include<queue>
#include<algorithm>
#include<cstring>
using namespace std;
#define duke(i,a,n) for(int i = a;i <= n;i++)
#define lv(i,a,n) for(int i = a;i >= n;i--)
#define clean(a) memset(a,0,sizeof(a))
const int INF = << ;
typedef long long ll;
typedef double db;
template <class T>
void read(T &x)
{
char c;
bool op = ;
while(c = getchar(), c < '' || c > '')
if(c == '-') op = ;
x = c - '';
while(c = getchar(), c >= '' && c <= '')
x = x * + c - '';
if(op) x = -x;
}
template <class T>
void write(T x)
{
if(x < ) putchar('-'), x = -x;
if(x >= ) write(x / );
putchar('' + x % );
}
int z = ,n,len = ;
int rain[],pl[],ans = ;
int tree[],name[];
void build(int o,int l,int r)
{
if(l == r)
{
tree[o] = rain[l];
name[o] = l;
return;
}
int mid = (l + r) >> ;
build(o << ,l,mid);
build(o << | ,mid + ,r);
if(tree[o << ] > tree[o << | ])
{
tree[o] = tree[o << ];
name[o] = name[o << ];
}
else if(tree[o << ] < tree[o << | ])
{
tree[o] = tree[o << | ];
name[o] = name[o << | ];
}
else
{
tree[o] = INF;
// name[o] = 0;
}
}
int query(int o,int l,int r,int x,int y)
{
cout<<l<<" "<<r<<" "<<x<<" "<<y<<" "<<o<<endl;
if(l == x && r == y)
{
ans = name[o];
cout<<tree[o]<<endl;
if(tree[o] == INF)
{
if(l != r)
{
int mid = (l + r) / ;
return max(query(o * ,l,mid,l,mid),query(o * ,mid + ,r,mid + ,r));
}
else
return -;
}
return tree[o];
}
int mid = (l + r) >> ;
if(y <= mid)
{
return query(o * ,l,mid,x,y);
}
else if(mid < x)
return query(o * + ,mid + ,r,x,y);
else
{
return max(query(o * ,l,mid,x,mid),query(o * + ,mid + ,r,mid + ,y));
}
}
int judge(int l,int r)
{
z = ;
int x = query(,,len,l + ,r);
cout<<x<<endl;
if(x == rain[r] && z == )
return ;
else if(x == rain[r])
return ;
else
return ;
}
int main()
{
read(n);
int x,y;
duke(i,,n)
{
read(x);read(y);
if(pl[len] != x - && i != )
{
int k = pl[len];
pl[++len] = k + ;
rain[len] = INF;
// cout<<len<<" "<<rain[len]<<endl;
}
pl[++len] = x;
rain[len] = y;
}
build(,,len);
// printf("%d %d\n",tree[1],name[1]);
int m;
read(m);
duke(i,,m)
{
read(x);read(y);
int p = lower_bound(pl + ,pl + len + ,x) - pl;
int q = lower_bound(pl + ,pl + len + ,y) - pl;
cout<<p<<" "<<q<<endl;
int t = judge(p,q);
if(t == )
{
printf("true\n");
}
else if(t == )
{
printf("maybe\n");
}
else
{
printf("false\n");
}
}
return ;
}
/*
6
2002 4920
2003 5901
2004 2832
2005 3890
2007 5609
2008 3024
5
2002 2005
2003 2005
2002 2007
2003 2007
2005 2008
*/
/*
6
2002 4920
2003 5901
2004 2832
2005 3890
2007 5609
2008 3024
2
2002 2007
2003 2007
*/

小詹的st表算法:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<stack>
#include<queue>
#include<vector>
#include<cctype>
using namespace std;
#define space putchar(' ')
#define enter puts("")
#define Mem(a) memset(a, 0, sizeof(a))
typedef long long ll;
typedef double db;
const int INF = 0x3f3f3f3f;
const db eps = 1e-;
const int maxn = 5e4 + ;
inline ll read()
{
ll ans = ;
char ch = getchar(), last = ' ';
while(!isdigit(ch)) {last = ch; ch = getchar();}
while(isdigit(ch)) {ans = (ans << ) + (ans << ) + ch - ''; ch = getchar();}
if(last == '-') ans = -ans;
return ans;
}
inline void write(ll x)
{
if(x < ) putchar('-'), x = -x;
if(x >= ) write(x / );
putchar(x % + '');
} int n, m, a[maxn], yr[maxn]; int dp[maxn][], b[maxn];
void rmq()
{
for(int i = ; i <= n; ++i) dp[i][] = a[i];
for(int j = ; ( << j) <= n; ++j)
for(int i = ; i + ( << j) - <= n; ++i)
dp[i][j] = max(dp[i][j - ], dp[i + ( << (j - ))][j - ]);
int x = ;
for(int i = ; i <= n; ++i)
{
b[i] = x;
if(( << (x + )) <= i + ) x++;
}
}
int query(int L, int R)
{
int k = b[R - L + ];
return max(dp[L][k], dp[R - ( << k) + ][k]);
} int main()
{
n = read();
for(int i = ; i <= n; ++i) yr[i] = read(), a[i] = read();
rmq();
m = read();
for(int i = ; i <= m; ++i)
{
int y = read(), x = read();
if(x <= y) printf("false\n");
else
{
int L = lower_bound(yr + , yr + n + , y) - yr;
int R = lower_bound(yr + , yr + n + , x) - yr;
bool fl = yr[L] == y, fr = yr[R] == x;
int ans = ;
if(L + (fl ? : ) <= R - ) ans = query(L + (fl ? : ), R - ); //别忘了这个判断啊……
if((fr && ans >= a[R]) || (fl && ans >= a[L]) || (fl && fr && (a[L] < a[R] || ans >= a[R]))) printf("false\n");
else if(R - L != yr[R] - yr[L] || !fl || !fr) printf("maybe\n");
else printf("true\n");
}
}
return ;
}

BZOJ1067 [SCOI2007]降雨量 RMQ???的更多相关文章

  1. [BZOJ1067][SCOI2007]降雨量

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

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

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

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

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

  4. 洛谷P2471 [SCOI2007] 降雨量 [RMQ,模拟]

    题目传送门 降雨量 题目背景 07四川省选 题目描述 我们常常会说这样的话:“X年是自Y年以来降雨量最多的”.它的含义是X年的降雨量不超过Y年,且对于任意Y<Z<X,Z年的降雨量严格小于X ...

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

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

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

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

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

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

  8. 1067: [SCOI2007]降雨量

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

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

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

随机推荐

  1. html5——web字体

    基本介绍 1.自定义网页特殊字体,无需考虑用户电脑上是否安装了此特殊字体,从此把特殊字体处理成图片的时代便成为了过去. 2.支持程度比较好,甚至IE低版本浏览器也能支持. 3.web字体的大小鉴定是字 ...

  2. JS——tab函数封装

    1.为li标签添加index属性,这个属性正好就是span标签数组的index值 2.函数封装适合页面有多个tab切换,需要注意的在获取的li标签和span标签对象时,必须将对应div对象作为参数传入 ...

  3. GitHub代码托管平台搭建

    GitHub代码托管平台搭建 注册账户以及创建仓库 要想使用github第一步当然是注册github账号了, github官网地址:https://github.com/. 之后就可以创建仓库了(免费 ...

  4. 基于saltstack svn的一个发布系统

      1.登录页 2.分组管理页 3.添加项目页 4.项目列表和项目编辑页 5.项目发布回滚页

  5. (转)Arcgis for Js之Graphiclayer扩展详解

    http://blog.csdn.net/gisshixisheng/article/details/41208185 在前两节,讲到了两种不同方式的聚类,一种是基于距离的,一种是基于区域范围的,两种 ...

  6. Python 之12306网站验证码校验案例

    import requests from PIL import Image import jsons requests.packages.urllib3.disable_warnings() head ...

  7. CAD从二制流数据中加载图形(com接口)

    主要用到函数说明: _DMxDrawX::ReadBinStream 从二制流数据中加载图形,详细说明如下: 参数 说明 VARIANT varBinArray 二制流数据,是个byte数组 BSTR ...

  8. C#当中的out关键字(借鉴于CSDN)

    一丶与ref关键字一样,out关键字也是按引用来传递的.out 关键字会导致参数通过引用来传递.这与 ref 关键字类似,不同之处在于 ref 要求变量必须在传递之前进行初始化.若要使用 out 参数 ...

  9. linux下的vi的使用方法

    vi的使用: 一般指令模式: vi打开一个文件就直接进入一般指令模式,可以进行删除.复制.粘贴.但是不可以对文件的内容进行修改. 常用命令: ctrl + f 向下移动一页 ctrl + b 向上移动 ...

  10. 暑假集训D18总结

    考试 本来考试时以为能AK的,结果全是因为手贱啊= = T1 瞎XX贪心 我竟然当成了数学 还拍了半天以为是对的 T2 组合数学 太简单 半个小时直接A T3 最长上升(非下降?)子序列 考试25,加 ...