bzoj2096

本来也不打算写这道题的解题报告的,因为比较水
直接维护两个单调队列(最大值,最小值)随便弄弄就行了
但是我开始疯狂不知道为什么的RE,然后实在没办法找root要了数据
测了之后……王苍,根本就没有错啊……
我就去向root反映,root测了一下以前AC的pascal程序……
王苍……又都RE了,实在是感人肺腑……

 1 var q1,q2:array[0..10000010] of longint;
 2     a:array[0..10000010] of longint;
 3     t,i,l1,l2,r1,r2,n,ans:longint;
 4     k:longint;
 5 
 6 function max(a,b:longint):longint;
 7   begin
 8     if a>b then exit(a) else exit(b);
 9   end;
10 
11 begin
12   readln(k,n);
13   for i:=1 to n do
14     read(a[i]);
15   t:=1;
16   l1:=1;
17   l2:=1;
18   for i:=1 to n do
19   begin
20     while (l1<=r1) and (a[i]>=a[q1[r1]]) do dec(r1);
21     while (l2<=r2) and (a[i]<=a[q2[r2]]) do dec(r2);
22     inc(r1);
23     q1[r1]:=i;
24     inc(r2);
25     q2[r2]:=i;
26     while (l1<=r1) and (l2<=r2) and (a[q1[l1]]-a[q2[l2]]>k) do
27       if q1[l1]<q2[l2] then
28       begin
29         t:=q1[l1]+1;
30         inc(l1);
31       end
32       else begin
33         t:=q2[l2]+1;
34         inc(l2);
35       end;
36     ans:=max(ans,i-t+1);
37   end;
38   writeln(ans);
39 end.
View Code

 

转载于:https://www.cnblogs.com/phile/p/4473077.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值