这题有两种写法,而且是完全(几乎?)不一样的写法...并不是换了个方法来维护而已
单调队列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); }