您的位置:首页 > 其它

2017.9.28 降雨量 思考记录

2017-09-28 09:23 232 查看
论逻辑清晰的重要性、

首先大小的关系明摆着是要你建一颗线段树

然后就可以分类讨论了

x没有 y有

x有 y没有

x没有 y没有

x有 y有

对于都没有的情况  只可能是maybe

对于一个没有的情况,只有可能有false和maybe

对于都有的 可能有true maybe false

对于有的直接查询,对于没有的二分查找+1或-1

注意: 

l=1,r=n+1

a<=b

y==x视为maybe   ←感觉不科学

码:

  #include<iostream>
#include<cstdio>
#include<map>
using namespace std;
#define zuo o<<1,l,mid
#define you o<<1|1,mid+1,r
map<int,int>ma;
#define N 100005
int yl[N<<2],a,b,op,c,x,y,dui
,n,m,i,ans,lin1,lin2,lin3;
void up(int o)
{
yl[o]=max(yl[o<<1],yl[o<<1|1]);
}
void jia(int o,int l,int r)
{
if(a<=l&&r<=b)
{
if(op==0)
{
yl[o]=c;
}else
{
c=max(c,yl[o]);
}
return;
}
int mid=(l+r)>>1;
if(a<=mid)jia(zuo);
if(b>mid)jia(you);
up(o);
}
int main()
{
int l,r;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d%d",&x,&y);
ma[x]=i;
dui[i]=x;
a=b=i;
c=y;
jia(1,1,n);
}
dui[n+1]=2147483644;
scanf("%d",&m);
op=1;
for(i=1;i<=m;i++)
{
scanf("%d%d",&y,&x);
if(y==x)
{
printf("maybe\n");
}else
if(ma[x]==0&&ma[y]==0)
{
printf("maybe\n");
}else
if(ma[x]==0&&ma[y]!=0)
{
l=1;r=n+1;
while(l<r)
{
int mid=(l+r)>>1;
if(dui[mid]>x)r=mid;
else l=mid+1,ans=mid;
}
x=ans;
a=b=ma[y];c=0;
jia(1,1,n);
lin1=c;
a=ma[y]+1;
b=x;c=0;
if(a<=b)jia(1,1,n);
lin2=c;
if(lin1<=lin2)
{
printf("false\n");
}else
{
printf("maybe\n");
}
}else if(ma[x]!=0&&ma[y]==0)
{
l=1;r=n+1;
while(l<r)
{
int mid=(l+r)>>1;
if(dui[mid]>y)r=mid,ans=mid;
else l=mid+1;
}
y=ans;
a=b=ma[x];c=0;
jia(1,1,n);
lin1=c;
a=y;
b=ma[x]-1; c=0;
if(a<=b) jia(1,1,n);
lin2=c;
if(lin1<=lin2)
{
printf("false\n");
}else
{
printf("maybe\n");
}
}else
{
c=0;
a=b=ma[x];
jia(1,1,n);
lin1=c;
c=0;
a=b=ma[y];
jia(1,1,n);
lin2=c;
c=0;
a=ma[y]+1;
b=ma[x]-1;
if(a<=b) jia(1,1,n);
lin3=c;
if(ma[x]-ma[y]==x-y) if(lin1<lin2&&lin1>lin3&&lin2>lin3)
{
printf("true\n");
} else printf("false\n");
else if(lin1<lin2&&lin1>lin3&&lin2>lin3)
{
printf("maybe\n");
} else printf("false\n");
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: