除#1#3外全部WA,本地测试终端无响应
查看原帖
除#1#3外全部WA,本地测试终端无响应
1267405
StarsTwinkle楼主2024/1/29 15:35

#2数据在vscode里卡爆终端,在洛谷IDE里提示输入长度不合法

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,D;
struct node
{ 
   int x,y;
}rain[100005];
bool cmp(node a,node b)
{
    if(a.x==b.x) return a.y<b.y;
    return a.x<=b.x;
}
int que1[100005],que2[100005];
int qf,qr,qf1,qr1,qr2,qf2,mn;
int ans=1e9;
signed main(){
   cin>>n>>D;
   for(int i=1;i<=n;i++)
   {
       cin>>rain[i].x>>rain[i].y;
   }
   sort(rain+1,rain+n+1,cmp);//按x从小到大排序,若x相等,则按y排序
   qf=qr=-1;
   int r=1;
   int mx=mn=rain[1].y;
   for(int l=1;l<=n;l++){//l表示花盆的左端点
      while(r<n&&mx-mn<D){//r表示花盆的右端点
         r++;
         while(qf1<qr1&&rain[r].y>=rain[que1[qr1]].y){//求最大值
            qr1--;
         }
         que1[++qr1]=r;
         mx=rain[que1[qf1+1]].y;
         while(qf2<qr2&&rain[r].y<=rain[que2[qr2]].y){//求最小值
            qr2--;
         }
         que2[++qr2]=r;
         mn=rain[que2[qf2+1]].y;
      }
      if(mx-mn>=D){
         ans=min(ans,rain[r].x-rain[l].x);//更新答案
      }
      while(qf1<qr1&&que1[qf1+1]<l+1){
         qf1++;
      }
      mx=rain[que1[qf1+1]].y;
      while(qf2<qr2&&que1[qf2+1]<l+1){
         qf2++;
      }
      mn=rain[que2[qf2+1]].y;
   }
   if(ans==1e9)cout<<"-1";
   else cout<<ans;
   return 0;
}
2024/1/29 15:35
加载中...