給你一個數列找到最長的子序列 中的最大值減最小值值m k之間
建立兩個單調隊列 一個遞增 一個遞減 當兩個隊首滿足情況是就進行比較 找到最大值
當不滿足是舊的移動隊首 怎樣移???
移動隊首id較小的一個
#include#include #include using namespace std; int max(int a,int b) { return a>b?a:b; } int abs(int a) { return a<0?-a:a; } int main() { int n,m,k,i,j; int num[100010]; int ma[100010],mi[100010]; int ida[100010],idi[100010]; while(~scanf("%d%d%d",&n,&m,&k)) { for(i=1;i<=n;i++) scanf("%d",&num[i]); int fax=0,tax=0; int fin=0,tin=0; int tt=0; int now=0; for(i=1;i<=n;i++) { while(fax<tax&&ma[tax]<=num[i]) tax--; ma[++tax]=num[i]; ida[tax]=i; while(fin<tin&&mi[tin]>=num[i]) tin--; mi[++tin]=num[i]; idi[tin]=i; while(ma[fax+1]-mi[fin+1]>k&&fax<tax&&fin<tin) { if(ida[fax+1]<=idi[fin+1]) { fax++; now=ida[fax]; } else { fin++; now=idi[fin]; } } if(ma[fax+1]-mi[fin+1]>=m) tt=max(tt,i-now); } printf("%d\n",tt); } return 0; }