P3522 [POI2011] TEM-Temperature
P3522 [POI2011] TEM-Temperature
题目翻译:
给定每一天温度的可能区间,求最长的一段时间,使其每天可能的温度不下降。
思路分析:
我们可以发现,若某一天可以加入前面的区间。那他的最高温度一定大于之前区间内最低温度的最大值(显而易见,若小于,那这段的温度一定下降)所以我们只需要找到满足这个条件的最大区间即可。动态维护区间的最小值,显然可以用单调队列。
实现:
用队头维护最近的最小值最大值,从队尾往前找到第一个符合当前的最高温度大于该天最小温度的时期。(由于该天前面的区间也符合要求,所以最终答案是 ans=max(ans,i-q[l-1])
)。最后输出即可。
完整代码:
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int q[N],mi[N],mx[N];
int main(){
int n,ans=0;
scanf("%d",&n);
for(int i=1,l=1,r=0;i<=n;i++){
scanf("%d%d",&mi[i],&mx[i]);
while(l<=r && mx[i]<mi[q[l]]){
l++;
}
if(l>r)ans=max(ans,1);
else ans=max(ans,i-q[l-1]);
while(l<=r && mi[q[r]]<mi[i])r--;
q[++r]=i;
}
printf("%d",ans);
}
本文作者:XichenOC
本文链接:https://www.cnblogs.com/XichenOC/p/18682403
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步