这题有两种写法,而且是完全(几乎?)不一样的写法...并不是换了个方法来维护而已

  单调队列O(N):用一个队列维护a[]的单调递减,对于每个i满足a[队头]<=b[i],然后就可以算出以每一位为结尾的最大答案了

#include<stdio.h>
#include<cstring>
#include<iostream>
#include<cstdlib>
using namespace std;
const int maxn=1000010,inf=1e9;
int n,fir,ans;
int a[maxn],b[maxn],q[maxn];
inline void read(int &k)
{
    int f=1;k=0;char c=getchar();
    while(c<'0'||c>'9')c=='-'&&(f=-1),c=getchar();
    while(c<='9'&&c>='0')k=k*10+c-'0',c=getchar();
    k*=f;
}
int main()
{
    read(n);
    for(int i=1;i<=n;i++)read(a[i]),read(b[i]);
    int l=1,r=0;fir=1;
    for(int i=1;i<=n;i++)
    {
        while(l<=r&&a[q[l]]>b[i])fir=max(fir,q[l++]+1);
        ans=max(ans,i-fir+1);
        while(l<=r&&a[q[r]]<=a[i])r--;
        q[++r]=i;
    }
    printf("%d\n",ans);
}
View Code

相关文章:

  • 2021-08-07
  • 2021-11-18
  • 2022-12-23
  • 2021-11-30
  • 2021-12-24
  • 2021-11-27
  • 2022-02-23
  • 2021-09-29
猜你喜欢
  • 2021-11-15
  • 2021-09-03
  • 2022-12-23
  • 2021-12-23
  • 2021-09-02
  • 2021-07-18
  • 2021-10-31
相关资源
相似解决方案