bzoj 1067 特判
这道题的大题思路就是模拟
假设给定的年份是x,y,首先分为4个大的情况,分别是
x的信息已知,y的信息已知
x的信息已知,y的信息未知
x的信息未知,y的情况已知
x的信息未知,y的情况未知
然后对于每一种情况可以根据x到y区间是否存在空位,最大值是否唯一,以及x,y,区间最大值的关系来判定。
所以对于区间的问题的合并与处理我们用线段树来存就行了。
反思:开始对情况的优先级判断不清,没有整理好思路就开始写。最后发现线段树的合并函数写错了。
- /**************************************************************
- Problem:
- User: BLADEVIL
- Language: Pascal
- Result: Accepted
- Time: ms
- Memory: kb
- ****************************************************************/
- //By BLADEVIL
- type
- rec =record
- left, right :longint;
- max :longint;
- flag, flag2 :boolean;
- pred, succ :longint;
- end;
- var
- n, m :longint;
- a, b :array[..] of longint;
- t :array[..] of rec;
- function getmax(a,b:longint):longint;
- begin
- if a>b then exit(a) else exit(b);
- end;
- function combine(a,b:rec):rec;
- begin
- with combine do
- begin
- max:=getmax(a.max,b.max);
- pred:=a.pred;
- succ:=b.succ;
- if a.succ=b.pred- then flag:=true else flag:=false;
- flag:=flag and a.flag and b.flag;
- if a.max=b.max then flag2:=false else flag2:=true;
- if max=a.max then flag2:=flag2 and a.flag2;
- if max=b.max then flag2:=flag2 and b.flag2;
- left:=a.left;
- right:=b.right;
- end;
- end;
- procedure build(x,l,r:longint);
- var
- mid :longint;
- begin
- t[x].left:=l; t[x].right:=r;
- if l=r then
- begin
- with t[x] do
- begin
- pred:=a[l];
- succ:=a[l];
- flag2:=true;
- max:=b[l];
- flag:=true;
- end;
- exit;
- end;
- with t[x] do mid:=(left+right)>>;
- build(x<<,l,mid); build(x<<+,mid+,r);
- t[x]:=combine(t[x<<],t[x<<+]);
- end;
- procedure init;
- var
- i :longint;
- begin
- read(n);
- for i:= to n do read(a[i],b[i]);
- a[]:=-;
- build(,,n);
- end;
- function getadress(x:longint):longint;
- var
- l, r, mid :longint;
- ans :longint;
- begin
- l:=; r:=n;
- ans:=;
- while l<=r do
- begin
- mid:=(l+r)>>;
- if a[mid]<=x then
- begin
- ans:=mid;
- l:=mid+;
- end else r:=mid-;
- end;
- exit(ans);
- end;
- function ask(x,l,r:longint):rec;
- var
- mid :longint;
- begin
- if (t[x].left=l) and (t[x].right=r) then
- exit(t[x]);
- with t[x] do mid:=(left+right)>>;
- if mid<l then exit(ask(x<<+,l,r)) else
- if mid>=r then exit(ask(x<<,l,r)) else
- exit(combine(ask(x<<,l,mid),ask(x<<+,mid+,r)));
- end;
- procedure main;
- var
- i :longint;
- x, y :longint;
- u, v :longint;
- query :rec;
- begin
- read(m);
- for i:= to m do
- begin
- read(x,y);
- if x>y then
- begin
- writeln('false');
- continue;
- end;
- if x=y then
- begin
- writeln('true');
- continue;
- end;
- u:=getadress(x);
- v:=getadress(y);
- if (a[u]=x) and (a[v]=y) then
- begin
- if b[v]>b[u] then
- begin
- writeln('false');
- continue;
- end;
- query:=ask(,u+,v);
- if not query.flag2 then
- begin
- writeln('false');
- continue;
- end;
- if query.max<>b[v] then
- begin
- writeln('false');
- continue;
- end;
- query:=ask(,u,v);
- if not query.flag then
- begin
- writeln('maybe');
- continue;
- end else
- begin
- writeln('true');
- continue;
- end;
- end else
- if (a[u]<>x) and (a[v]<>y) then
- begin
- writeln('maybe');
- continue;
- end else
- if (a[u]=x) and (a[v]<>y) then
- begin
- if u=v then
- begin
- writeln('maybe');
- continue;
- end;
- query:=ask(,u+,v);
- if query.max>=b[u] then
- begin
- writeln('false');
- continue;
- end else
- begin
- writeln('maybe');
- continue;
- end;
- end else
- if (a[u]<>x) and (a[v]=y) then
- begin
- if u=v then
- begin
- writeln('maybe');
- continue;
- end;
- query:=ask(,u+,v);
- if not query.flag2 then
- begin
- writeln('false');
- continue;
- end;
- if query.max<>b[v] then
- begin
- writeln('false');
- continue;
- end else
- begin
- writeln('maybe');
- continue;
- end;
- end;
- end;
- end;
- begin
- init;
- main;
- end.
bzoj 1067 特判的更多相关文章
- bzoj 1067: [SCOI2007]降雨量
题目链接: bzoj 1067: [SCOI2007]降雨量 题解: 很简单的一道题,但代码里有许多细节需要注意,切容易出错,调了三个小时OTZ 做一个st表维护区间最大值就 在获得年份在序列中的po ...
- BZOJ 1067 降雨量(RMQ-ST+有毒的分类讨论)
1067: [SCOI2007]降雨量 Time Limit: 1 Sec Memory Limit: 162 MB Submit: 4399 Solved: 1182 [Submit][Stat ...
- BZOJ 1067:[SCOI2007]降雨量(RMQ+思维)
http://www.lydsy.com/JudgeOnline/problem.php?id=1067 题意:…… 思路:首先我们开一个数组记录年份,一个记录降雨量,因为年份是按升序排列的,所以我们 ...
- BZOJ 1067 & Interval_Tree
1067: [SCOI2007]降雨量 Time Limit: 1 Sec Memory Limit: 162 MB Submit: 3099 Solved: 800 Description 我们常常 ...
- bzoj 1067: [SCOI2007]降雨量 模擬
1067: [SCOI2007]降雨量 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 2010 Solved: 503[Submit][Status] ...
- BZOJ 1067 降雨量
Description 我们常常会说这样的话:"\(X\)年是自\(Y\)年以来降雨量最多的".它的含义是\(X\)年的降雨量不超过\(Y\)年,且对于任意\(Y<Z< ...
- bzoj 1067: [SCOI2007]降雨量 (离散化+线段树)
链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1067 思路: 毒瘤题,写的自闭,改了一晚上,注意要理清题目的逻辑 x小于等于y,x,y之间的 ...
- 降雨量 BZOJ 1067
降雨量 [问题描述] 我们常常会说这样的话:“X年是自Y年以来降雨量最多的”.它的含义是X年的降雨量不超过Y年,且对于任意Y<Z<X,Z年的降雨量严格小于X年.例如2002,2003,20 ...
- 【BZOJ 1067】 [SCOI2007]降雨量
Description 我们常常会说这样的话:“X年是自Y年以来降雨量最多的”.它的含义是X年的降雨量不超过Y年,且对于任意Y<Z<X,Z年的降雨量严格小于X年.例如2002,2003,2 ...
随机推荐
- unity3d 摄像机跟随角色时被物体遮挡解决方案
参考文章:http://www.xuanyusong.com/archives/1991 在看此文章时请先看上面的参考文章 看完以上文章后,你也许会想人家都已经给出所有代码了,你还写个毛啊 别急,现在 ...
- dispaly:-webkit-box 布局中的坑
dispaly:-webkit-box 具体用法 这里大家可以网上查, 这里说下里面的坑 里面的子对象设置-webkit-box-flex: 1 -webkit-box-flex: 2 时:一般两个子 ...
- 【廖雪峰老师python教程】——filter/sorted
filter Python内建的filter()函数用于过滤序列. 和map()类似,filter()也接收一个函数和一个序列.和map()不同的是,filter()把传入的函数依次作用于每个元素,然 ...
- jackson 处理空值
@JsonInclude(value=Include.NON_NULL) public class ResultBean 这样在返回数据的时候, { "code": "s ...
- 自动化测试学习之路--java String、StringBuilder
Java中的String和StringBuilder类: 1.String对象是不可变的.每一个看起来修改了String值的方法,实际上都是创建了全新的String对象.代码示例如下: String ...
- 第二十四篇configparser(**)
configparser模块 config:配置,parser:解析.字面意思理解configparser模块就是配置文件的解析模块. 来看一个好多软件的常见文档格式如下: [DEFAULT] # 标 ...
- python 网络篇(计算机网络基础)
计算机网络的发展及基础网络概念 广播 主机之间“一对所有”的通讯模式,网络对其中每一台主机发出的信号都进行无 ...
- Pro Git - 笔记2
Git Basics Getting a Git Repository Initializing a Repository in an Existing Directory For Linux: $ ...
- JMS实战——ActiveMQ实现Pub-Sub
前言 上篇博客<JMS实战--ActiveMQ>介绍了ActiveMQ的安装,并实现了简单的PTP模型.这篇博客我们来看一下Pub-Sub模型,之后来总结一下JMS. 实现 项目结构 其中 ...
- jQuery添加、移除、改变class属性
jQuery中一般有3个关于改变元素class的函数addClass.removeClass.toggleClass addClass描述: 为每个匹配的元素添加指定的样式类名$('div').add ...