RT,本人代码如下,样例都过不了。
#pragma GCC optimize(3)
#include<iostream>
#include<algorithm>
#include<queue>
#include<set>
#include<cmath>
#include<memory.h>
#include<map>
#include<iomanip>
#include<stack>
#define int long long
#define INF 0x7fffffff
using namespace std;
inline int read() {
bool op=1;
char ch;
while((ch=getchar())<'0'||ch>'9'){
if(ch=='-'){
op*=-1;
}
}
int num=ch-'0';
while((ch=getchar())>='0'&&ch<='9') {
num=num*10+ch-'0';
}
return op?num:-num;
}
struct water{
int ind;
int val;
};
int n,d,res=1e9,cnt;
water arr[100005];
deque<int> ma_q;//最大值单调队列
deque<int> mi_q;//最小值单调队列
bool cmp(water a,water b){
return a.ind<=b.ind;
}
signed main(){
n=read();
d=read();
for(int i=1;i<=n;i++){
arr[i].ind=read();
arr[i].val=read();
}
sort(arr+1,arr+1+n,cmp);
cnt=0;
for(int i=1;i<=n;i++){
while(!ma_q.empty()&&arr[ma_q.front()].ind<=i){
ma_q.pop_front();
}
while(!mi_q.empty()&&arr[mi_q.front()].ind<=i){
mi_q.pop_front();
}
//把过期的酸奶全砍掉
do{
cnt++;
while(!ma_q.empty()&&arr[ma_q.back()].val<arr[cnt].val){
ma_q.pop_back();
}
ma_q.push_back(cnt);
while(!mi_q.empty()&&arr[mi_q.back()].val>arr[cnt].val){
mi_q.pop_back();
}
mi_q.push_back(cnt);
}while(arr[ma_q.front()].val-arr[mi_q.front()].val<d&&cnt<n);
if(arr[ma_q.front()].val-arr[mi_q.front()].val>=d){
res=min(res,arr[cnt].ind-arr[i].ind);
}
}//每一次列举右端点在第i个水滴上
cout<<res<<endl;
return 0;
}
求调