https://niumacode.com/training/173/problem/P1800
#include <iostream>
#include <vector>
using namespace std;
int main() {
int n;
cin>>n;
vector<int> temp(n);
for(int i=0;i<n;i++){
cin>>temp[i];
}
int start=0,end=0;
int ma=0,mi=0;
int maxlen=0;
bool newlist=true;
vector<pair<int,int >>ans;
int len=0;
for(int i=0;i<n;i++){
int cur=temp[i];
if(cur<18||cur>24){
newlist=true;
if(len==0) continue;
if(len>maxlen){
ans.clear();
maxlen=len;
ans.push_back({start,end});
}else if(len==maxlen){
ans.push_back({start,end});
}
len=0;
}else{
if(newlist){
ma=cur;
mi=cur;
start=i;
end=i;
len=1;
newlist=false;
}else{
ma=max(ma,cur);
mi=min(mi,cur);
//这里不能重置再遍历,要用滑窗在头尾进行处理
while (ma - mi > 4) {
start++; // 移除起始端的旧温度
// 重新计算新窗口的max/min(从start到i)
ma = temp[start];
mi = temp[start];
for (int j = start; j <= i; j++) {
ma = max(ma, temp[j]);
mi = min(mi, temp[j]);
}
len = i - start + 1; // 更新窗口长度
}
// 窗口合法,更新长度和end
len = i - start + 1;
end = i;
}
}
}
// 循环结束后,处理最后一段有效区间(若存在)
if (len > 0) {
if (len > maxlen) {
ans.clear();
maxlen = len;
ans.push_back({start, end});
} else if (len == maxlen) {
ans.push_back({start, end});
}
}
for(auto& path : ans){
cout<<path.first<<" "<<path.second<<endl;
}
return 0;
}
// 64 位输出请用 printf("%lld")
浙公网安备 33010602011771号