为什么写单调队列不能用双端队列?
查看原帖
为什么写单调队列不能用双端队列?
540822
HotDogSeller楼主2022/8/3 17:08

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;
}

求调

2022/8/3 17:08
加载中...