题目大意

传送门

题解

我国古代有一句俗话。

骗分出奇迹,乱搞最神奇!

这句话在这道题上得到了鲜明的体现。

我的方法就是魔改版线段树,乱搞搞一下,首先借鉴了黄学长的建树方法,直接用一个节点维护年份的区间,但是这样就带来了问题,就是在查询的时候非常难以操作。经过不断的乱搞,我终于把正确的操作方式搞了出来。。。

另外这个题细节还是很多。详见胡泽聪dalao的分析

代码

#include <bits/stdc++.h>
using namespace std;
const int maxn = 50005;
struct seg {
int l, r, mx, know;
} t[maxn * 4];
int s[maxn], n, m;
void build(int k, int l, int r) {
if (l == r) {
scanf("%d %d", &t[k].l, &t[k].mx);
t[k].r = t[k].l;
t[k].know = 1;
return;
}
int mid = (l + r) >> 1;
build(k << 1, l, mid);
build(k << 1 | 1, mid + 1, r);
t[k].know = (t[k << 1].know && t[k << 1 | 1].know);
if (t[k << 1].r + 1 != t[k << 1 | 1].l)
t[k].know = 0;
t[k].l = t[k << 1].l;
t[k].r = t[k << 1 | 1].r;
t[k].mx = max(t[k << 1].mx, t[k << 1 | 1].mx);
}
int query_mx(int k, int x, int y) {
int l = t[k].l, r = t[k].r;
if (y < x)
return 0;
if (x < l)
x = l;
if (y > r)
y = r;
if (x == l && r == y)
return t[k].mx;
int mid = t[k << 1].r;
int nxmid = t[k << 1 | 1].l;
if (y < l || x > r)
return 0;
int ans = -0x3f3f3f;
if (x >= l && y < nxmid && x <= mid) {
ans = max(ans, query_mx(k << 1, x, y));
} else if (y <= r && x > mid && y >= nxmid) {
ans = max(ans, query_mx(k << 1 | 1, x, y));
} else if (x >= l && x <= mid && y >= nxmid && y <= r) {
ans = max(ans, query_mx(k << 1, x, mid));
ans = max(ans, query_mx(k << 1 | 1, nxmid, y));
} else
return 0;
return ans;
}
int query_know(int k, int x, int y) {
int l = t[k].l, r = t[k].r;
if (y < x)
return 0;
if (x < l || y > r)
return 0;
if (x == l && y == r)
return t[k].know;
else if (r - l == 0)
return 0;
bool ans = true;
int mid = t[k << 1].r;
int nxmid = t[k << 1 | 1].l;
if (x >= l && y < nxmid && x <= mid) {
ans = ans && query_know(k << 1, x, y);
} else if (y <= r && x > mid && y >= nxmid) {
ans = ans && query_know(k << 1 | 1, x, y);
} else if (x >= l && x <= mid && y >= nxmid && y <= r) {
ans = ans && query_know(k << 1, x, mid);
ans = ans && query_know(k << 1 | 1, nxmid, y);
ans = ans && (nxmid-mid <= 1) ? 1 : 0;
} else
return 0;
return ans;
}
int query(int k, int x) {
if (t[k].l == t[k].r)
return t[k].mx;
if (x <= t[k << 1].r)
return query(k << 1, x);
else if (x >= t[k << 1 | 1].l)
return query(k << 1 | 1, x);
else
return -1;
}
int main() {
//freopen("rain.in", "r", stdin);
//freopen("rain.ans", "w", stdout);
scanf("%d", &n);
build(1, 1, n);
scanf("%d", &m);
// cout << query_mx(1, 2003, 2007);
//cout << query_know(1, -138, -129) << endl;
// cout << query_know(1, 2004, 2006) << endl;
for (int i = 1; i <= m; i++) {
int x, y;
scanf("%d %d", &x, &y);
if (query_know(1, x, y) && (query(1, x) >= query(1, y)) &&
(query_mx(1, x + 1, y - 1) < query(1, y)))
printf("true\n");
else if (query_know(1, x, x) && query_know(1, y, y) &&
!(query_know(1, x + 1, y - 1)) &&
(query_mx(1, x + 1, y - 1) < query(1, y)) &&
(query(1, x) >= query(1, y)))
printf("maybe\n");
else if (query_know(1, x, x) && !(query_know(1, y, y)) && (query_mx(1,x+1,y-1) < query(1,x)))
printf("maybe\n");
else if (query_know(1, y, y) && !(query_know(1, x, x)) &&
(query_mx(1, x + 1, y - 1) < query(1, y)))
printf("maybe\n");
else if ((!(query_know(1, x, x)) && (!(query_know(1, y, y)))))
printf("maybe\n");
else
printf("false\n");
}
return 0;
}

Ps.开始对着样例乱搞出的代码居然得了50分

[bzoj1067][SCOI2007]降雨量——线段树+乱搞的更多相关文章

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

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

  2. BZOJ1067&P2471 [SCOI2007]降雨量[线段树裸题+细节注意]

    dlntqlwsl 很裸的一道线段树题,被硬生生刷成了紫题..可能因为细节问题吧,我也栽了一次WA50分.不过这个隐藏条件真的对本菜鸡来说不易发现啊. 未知的年份连续的就看成一个就好了,把年份都离散化 ...

  3. 洛谷P5211 [ZJOI2017]字符串(线段树+乱搞)

    题面 传送门 题解 为什么大佬们全都是乱搞的--莫非这就是传说中的暴力能进队,乱搞能AC-- 似乎有位大佬能有纯暴力+玄学优化\(AC\)(不算上\(uoj\)的\(Hack\)数据的话--这要是放到 ...

  4. 【Luogu】P2221高速公路(线段树乱搞)

    题目链接 这题……我从一开始就想歪了qwq. 为了缅怀逝去的一小时我就把我的30分暴力思路放上来. 首先我们观察枚举的区间.假设我们要枚举的范围是1~5之间的四条路,为了方便我们把它们叫做abcd. ...

  5. [SCOI2007]降雨量 线段树和区间最值(RMQ)问题

      这道题是比较经典的 \(RMQ\) 问题,用线段树维护是比较简单好写的.比较难的部分是判断处理.如果没有想好直接打代码会调很久(没错就是我).怎么维护查询区间最大值我就不再这里赘述了,不懂线段树的 ...

  6. [BZOJ1067][SCOI2007]降雨量

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

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

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

  8. BZOJ-1067 降雨量 线段树+分类讨论

    这道B题,刚的不行,各种碎点及其容易忽略,受不鸟了直接 1067: [SCOI2007]降雨量 Time Limit: 1 Sec Memory Limit: 162 MB Submit: 2859 ...

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

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

随机推荐

  1. 通过非root用户访问VNC

    我采用的是realvnc5.3.2.对于非root用户通过vnc访问linux桌面,网络上绝大数文章都是说要去配置/etc/sysconfig/vncservers.但安装完realvnc5.3.2之 ...

  2. Android控件上添加图片

    项目中有一个点赞功能,点赞的小图标添加在点赞列表旁边,在xml里可以进行设置,也可以在代码中进行绘图. 下面是两种方法的设置: 1.xml里:一些控件:button.textView等等里面有个属性是 ...

  3. pandas 按照列A分组,将同一组的列B求和,生成新的Dataframe

    对于pandas中的Dataframe,如果需要按照列A进行分组,将同一组的列B求和,可以通过下述操作完成: df = df.groupby(by=['column_A'])['column_B']. ...

  4. MySQL——数据类型

    MySQL中定义数据字段的类型对你数据库的优化是非常重要的.MySQL支持多种类型,大致可以分为三类:数值.日期/时间和字符串(字符)类型. 一.字符串类型: 字符串类型指CHAR.VARCHAR.B ...

  5. ksoap2- webservice

    1.概述 对于J2ME访问远端的Web Service,除了官方标准JSR 172,我们还有两种选择: l         kSOAP l         Wingfoot Wingfoot是由Win ...

  6. 真机调试iwatch

    http://blog.csdn.net/chenyufeng1991/article/details/48976639 错误:no symbols for paired Apple Watch 错误 ...

  7. CSS3动画效果——js调用css动画属性并回调处理详解

    http://www.jb51.net/css/258407.html 这篇文章主要详细介绍了CSS3动画效果回调处理,需要的朋友可以参考下 我们在做js动画的时候,很多时候都需要做回调处理,如在一个 ...

  8. 使用Intent创建Tab页面

    前面已经介绍了如何使用TabActivity来创建Activity布局,前面添加Tab页面使用了TabHost.TabSpec如下方法. setContent(int viewId):直接将指定Vie ...

  9. js动态控制table的tr,td增加及删除

    html: <table id='wifi_clients_table'   class="table table-striped table-bordered table-hover ...

  10. C# Linq to sql 实现 group by 统计多字段 返回多字段

    Linq to sql 使用group by 统计多个字段,然后返回多个字段的值,话不多说,直接上例子: where u.fy_no == fy_no orderby u.we_no group u  ...