#include<bits/stdc++.h>
#define maxn 50005
using namespace std;
int ans,len,n,d,p[maxn],val[maxn],be[maxn];
map<int,int>mp;
struct cows{
int x,h;
}c[maxn];
bool cmp (cows l, cows r){
return l.x<r.x;
}
inline int query(int from,int to){
int cnt=-(1<<30);
for(register int i=from;i<=min(to,be[from]*len);i++) cnt=max(cnt,c[i].h);
if(be[from]!=be[to]){
for(register int i=(be[to]-1)*len+1;i<=to;i++) cnt=max(cnt,c[i].h);
}
for(register int i=be[from]+1;i<=be[to]-1;i++) cnt=max(cnt,val[i]);
return cnt;
}
int main(){
scanf("%d%d",&n,&d);
len=sqrt(n);
for(int i=1;i<=n;i++)be[i]=(i-1)/len+1;
for(int i=1;i<=n;i++){
scanf("%d%d",&c[i].x,&c[i].h);
p[i]=c[i].x;
}
sort(c+1,c+n+1,cmp);
sort(p+1,p+n+1);
for(int i=1;i<=n;i++){
mp[c[i].x]=i;
val[be[i]]=max(val[be[i]],c[i].h);
}
// for(int i=1;i<=n;i++) printf("%d %d %d\n",c[i].x,c[i].h,i);
// for(int i=2;i<n;i++) printf("%d %d\n",mp[*lower_bound(p+1,p+n+1,p[i]-d)],mp[*upper_bound(p+1,p+n+1,p[i]+d)]);
for(int i=2;i<n;i++){
// printf("%d %d %d %d %d %d\n",mp[*lower_bound(p+1,p+n+1,p[i]-d)],i,mp[*upper_bound(p+1,p+n+1,p[i]+d)]?mp[*upper_bound(p+1,p+n+1,p[i]+d)]-1:n,query(mp[*lower_bound(p+1,p+n+1,p[i]-d)],i),query(i,mp[*upper_bound(p+1,p+n+1,p[i]+d)]?mp[*upper_bound(p+1,p+n+1,p[i]+d)]-1:n),2*c[i].h);
if(query(mp[*lower_bound(p+1,p+n+1,p[i]-d)],i)>=2*c[i].h && query(i,mp[*upper_bound(p+1,p+n+1,p[i]+d)]?mp[*upper_bound(p+1,p+n+1,p[i]+d)]-1:n)>=2*c[i].h) {
ans++;
// printf("%d\n",i);
}
}
printf("%d\n",ans);
}
这是蒟蒻写的巨丑AC代码;但是,在审视代码的过程中,蒟蒻发现了一个问题:
蒟蒻在代码中进行了这个查询:
query(i,mp[*upper_bound(p+1,p+n+1,p[i]+d)]?mp[*upper_bound(p+1,p+n+1,p[i]+d)]-1:n)
代表查询从i
到“右端点”的最大奶牛高度。
实验发现,如果maxx−xi<d,mp[*upper_bound(p+1,p+n+1,p[i]+d)]
将返回0
,而query(i,0)
显然没有意义,因此运用了三目运算符
然而----问题来了:
为什么,当maxx−xi≥d时,不论是mp[*upper_bound(p+1,p+n+1,p[i]+d)]-1
还是mp[*upper_bound(p+1,p+n+1,p[i]+d)]
都能通过本题?是因为本题数据较弱,还是因为-1
可以被证明无关紧要?