测量温度题目出处(3769)
翻译是我给的(骄傲)
感谢hc大佬提供的帮助
(没人发现名字上有两个链接吗)
测量温度这道题,开始我想多了,然后就做成了一个nlogn的最长不下降子序列
经过讲解才知道是单调队列
我们发现,如果要使这个连续的天数最多,那么当天的最低温度就要尽可能的低
那么我们用一个类似于单调栈(里面的第二三题)的方法来解
下面是代码::
#include<cstdio>
#include<deque>
#include<iostream>
using namespace std;
inline void read(int &x) {
x=0;
int f=1;
char s=getchar();
while(s<'0'||s>'9') {
if(s=='-')
f=-1;
s=getchar();
}
while(s>='0'&&s<='9') {
x=x*10+s-48;
s=getchar();
}
x*=f;
}
inline void pr(int x) {
if(x<0) {
putchar('-');
x=-x;
}
if(x>9)
pr(x/10);
putchar(x%10+48);
}//快读快输不解释
struct node {
int l,r;
}a[1000005];
deque<int>q;//双向队列q里面存的是下标
int i,n,j,k,ans,o;
int main() {
read(n);
for(i=1;i<=n;i++)
read(a[i].l),read(a[i].r);
q.push_back(1);
for(i=2;i<=n;i++) {
while(!q.empty()&&a[q.front()].l>a[i].r) {//如果当前的这天的最高温度比前面的最低温度
//还要低,那就计算现在的最大天数
o=q.front();//因为计算时是看pop出去的前一个,所以要记录一下
q.pop_front();
}
if(!q.empty())
ans=max(ans,i-o);//更新ans
while(!q.empty()&&a[q.back()].l<=a[i].l)//当前这一天的最低温度比对头得到温度低,对于
//后面的可选择性就要高一些,把对头pop出去
q.pop_back();
q.push_back(i);
}
pr(ans);
}