这里
你结合代码看看
为什么会和左端点比大小?
你看题目,题目中说了
c,我语文不好
所以呢?
我在重构代码
等我5分钟
我语文不好,注释写的不行
请原谅
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=50005;
int rain[N],year[N],st[N][20],lg[N],n;
int find(int x){
int l=1,r=n;
while(l<=r){
int mid=(l+r)/2;
if(year[mid]==x)
return mid;
if(year[mid]<x)
l=mid+1;
else
r=mid-1;
}
return 0;
}
int findy(int x){
int l=1,r=n;
while(l<r){
int mid=(l+r)/2;
if(year[mid]<=x)
l=mid+1;
else
r=mid;
}
return l;
}
int findx(int x){
int l=1,r=n;
while(l<r){
int mid=(l+r+1)/2;
if(year[mid]<=x)
l=mid;
else
r=mid-1;
}
return l;
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>n;
map<int,int> mp;
for(int i=1;i<=n;i++){
cin>>year[i]>>rain[i];
st[i][0]=rain[i];
mp[year[i]]=i;
}
for(int i=2;i<=n;i++)
lg[i]=lg[i/2]+1;
for(int j=1;j<=lg[n];j++){
for(int i=1;i<=n-(1<<j)+1;i++)
st[i][j]=max(st[i][j-1],st[i+(1<<(j-1))][j-1]);
}
int q;
cin>>q;
while(q--){
int y,x;
cin>>y>>x;
if(y>=x){
cout<<"false\n";
continue;
}
if(find(x)&&find(y)){
int yw=find(y)+1,xw=find(x)-1;
int l=lg[xw-yw+1];
int Max=max(st[yw][l],st[xw-(1<<l)+1][l]);
if(Max>=rain[yw-1]||rain[yw-1]<=rain[xw+1])
cout<<"false\n";
else if(mp[x]-mp[y]==x-y)
cout<<"true\n";
else
cout<<"maybe\n";
}
if(find(x)&&!find(y)){
int yw=findy(y),xw=find(x)-1;
int l=lg[xw-yw+1];
int Max=max(st[yw][l],st[xw-(1<<l)+1][l]);
if(Max>=rain[xw+1])
cout<<"false\n";
else
cout<<"maybe\n";
}
if(find(y)&&!find(x)){
int yw=find(y)+1,xw=findx(x);
int l=lg[xw-yw+1];
int Max=max(st[yw][l],st[xw-(1<<l)+1][l]);
if(Max>=rain[yw-1])
cout<<"false\n";
else
cout<<"maybe\n";
}
if(!find(x)&&!find(y))
cout<<"maybe\n";
}
return 0;
}
这下10分了)
你那么多find干啥?
我也不清楚,昨天无意识的时候瞎打的)
二分问题
如果二分挂了我就真的挂了
我是说二分部分的问题
具体哪个函数?
你只要一个就够
额,我这个写法有亿点奇怪
就是x取<=,y取>=