求救!!!神犇帮我瞅瞅呗。。。未完。。。调了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. Java Web框架前景浅析

    基于三(多)层架构模式,典型WEB系统的总体架构如下图所示: 在上述分层架构中,整个应用被划分为两大部分: 客户端:基于浏览器提供信息展现.用户交互等功能.所采用的技术主要有:HTML/HTML5.J ...

  2. SQL基本操作——case end

    case end进行多条件的判断 --查看Person表 select * from Person --对math字段进行条件判断 select name,数学成绩= case then '优' th ...

  3. cstringlist

    CStringList类成员 构造 CStringList 构造一个空的CString对象列表   首/尾访问 GetHead 返回此列表(不能是空的)中头部的元素 GetTail 返回此列表(不能是 ...

  4. @FunctionalInterface

    >> 函数式接口也称为SAM接口 Single Abstract Method interfaces 接口有且仅有一个抽象方法 允许定义静态方法 允许定义默认方法 允许java.lang. ...

  5. 27.7 并行语言集成查询(PLinq)

    static void Main() { ObsoleteMethods(Assembly.Load("mscorlib.dll")); Console.ReadKey(); } ...

  6. for循环提高内存访问效率的做法

    今天写程序的时候突然想到一点,记录一下: 计算机内存地址是线性排列组织的,而利用for循环对高维数组结构进行遍历处理的时候,要保证最内层for循环遍历的是高维数组的最低维度,这样可以最大化利用CPU的 ...

  7. Git使用笔记 (github为例)

    ---`Git`# Git管理 #- 创建仓库 git init 在本地目录下建立新git仓库,该仓库可以为空也可以是重新初始化的仓库.该命令将创建一个名为 .git 的子目录,这个子目录含有初始化的 ...

  8. Centos下安装mysql(二进制版)

    1.下载安装包,选择相应的平台.版本,比如,选择64位Linux平台下的MySQL二进制包“Linux-Generic (glibc 2.5)(x86,64-bit),Compressed” 如:#w ...

  9. nlogn求LIS(树状数组)

    之前一直是用二分 但是因为比较难理解,写的时候也容易忘记怎么写. 今天比赛讲评的时候讲了一种用树状数组求LIS的方法 (1)好理解,自然也好写(但代码量比二分的大) (2)扩展性强.这个解法顺带求出以 ...

  10. 【Codeforces 478C】Table Decorations

    [链接] 我是链接,点我呀:) [题意] 给你r,g,b三种颜色的气球 每张桌子要放3个气球 但是3个气球的颜色不能全都一样 (允许两个一样,或者全都不一样) 问你最多能装饰多少张桌子 [题解] 先把 ...