标签:code int 表示 位置 子串 des 输出 ilo for
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> using namespace std; long long tot,k,n,f1[3000010],f2[3000010]; long long t1,t2,head1,head2,ans,a[3000010]; int main() { scanf("%d %d",&k,&n); for (int i=1;i<=n;i++) scanf("%d",&a[i]); t1=t2=0; head1=head2=1; ans=1; for (int i=1;i<=n;i++) { while ((a[i]>a[f1[t1]])&&(t1>=head1)) t1-=1;//维护最大值 while ((a[i]<a[f2[t2]])&&(t2>=head2)) t2-=1;//维护最小值 t1+=1; t2+=1; f1[t1]=i;//记录下当前这个值的位置 f2[t2]=i;//记录下当前这个值的位置 //我当时就卡在这个地方了,当初记录的是这个值本身,结果还是要记录值的位置,还因此开了四个数组,还卡在什么莫名的地方调不出来,真的是。。。。 while (a[f1[head1]]-a[f2[head2]]>k)如果当前最大最小之差已经不符合条件了,换区间 { if (f1[head1]<f2[head2]) head1+=1,tot=f1[head1-1]; else head2+=1,tot=f2[head2-1]; } ans=max(i-tot,ans); } printf("%d",ans); return 0; }
标签:code int 表示 位置 子串 des 输出 ilo for
原文地址:http://www.cnblogs.com/2014nhc/p/6275542.html