您的位置:首页 > 其它

bzoj 1067: [SCOI2007]降雨量

2016-03-01 22:46 363 查看
#include<cstdio>
#include<iostream>
#include<algorithm>
#define M 50008
using namespace std;
struct shu
{
int l,r,ma;
}shu[4*M];
int l,r,n,m,b[M],a1[M],a2[M];
void jian(int b1,int l,int r)
{
shu[b1].l=l;
shu[b1].r=r;
if(l==r)
{
shu[b1].ma=a2[l];
return;
}
int mid=(l+r)>>1;
jian(b1*2,l,mid);
jian(b1*2+1,mid+1,r);
shu[b1].ma=max(shu[b1*2].ma,shu[b1*2+1].ma);
return;
}
int zhao(int b1,int l,int r)
{
if(shu[b1].l>=l&&shu[b1].r<=r)
return shu[b1].ma;
int mid=(shu[b1].l+shu[b1].r)>>1,mx=-100000000;
if(l<=mid)
mx=max(zhao(b1*2,l,r),mx);
if(r>mid)
mx=max(zhao(b1*2+1,l,r),mx);
return mx;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d%d",&a1[i],&a2[i]);
jian(1,1,n);
scanf("%d",&m);
for(int i=1;i<=m;i++)
{
int b1,b2,b3,c1,c2;
scanf("%d%d",&c1,&c2);
b1=lower_bound(a1+1,a1+n+1,c1)-a1;
b2=lower_bound(a1+1,a1+n+1,c2)-a1;
if(a1[b1]==c1)
b3=zhao(1,b1+1,b2-1);
else
b3=zhao(1,b1,b2-1);
if(a1[b1]==c1&&a1[b2]==c2&&a2[b1]>a2[b2]&&a2[b2]>b3&&b2-1-b1==c2-c1-1)
printf("true\n");
else  if((a1[b1]==c1&&a1[b2]!=c2&&a2[b1]<=b3)||(a1[b2]==c2&&a1[b1]!=c1&&a2[b2]<=b3)
||(a1[b1]==c1&&a1[b2]==c2&&(a2[b1]<a2[b2]||a2[b2]<=b3)))
printf("false\n");
else
printf("maybe\n");
}
return 0;
}


显然的线段树,然而判断条件有点复杂

x,y都有且满足条件,且他们中间数都有为true

否则 一旦有一个x或y存在不满足条件 为false

否则 为maybe
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: