1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
| #include <iostream> #include <cstdio> #include <cstring> using namespace std; #define N 100010 #define cl(xx,yy) memset((xx),(yy),sizeof((xx))) #define lson(i) ((i)<<1) #define rson(i) ((i)<<1|1)
struct SegTree{ int l,r,mid,Max; SegTree(){} SegTree(int _l,int _r,int _M){ l = _l; r = _r; mid = (l + r) >> 1; Max = _M; } }t[N<<2]; int n,d,Max,num[N],dp[N];
void build(int rt,int a,int b){ t[rt] = SegTree(a,b,0); if(a == b) return ; int mid = t[rt].mid; build(lson(rt),a,mid); build(rson(rt),mid+1,b); }
void PushUp(int rt){ t[rt].Max = max(t[lson(rt)].Max,t[rson(rt)].Max); }
void updata(int rt,int id,int val){ if(t[rt].l == t[rt].r){ t[rt].Max = max(t[rt].Max,val); return ; } int mid = t[rt].mid; if(id <= mid) updata(lson(rt),id,val); else updata(rson(rt),id,val); PushUp(rt); }
int query(int rt,int a ,int b){ if(t[rt].l == a && t[rt].r == b){ return t[rt].Max; } int mid = t[rt].mid; if(b <= mid) return query(lson(rt),a,b); else if(a > mid) return query(rson(rt),a,b); else return max(query(lson(rt),a,mid) , query(rson(rt),mid+1,b)); }
int main(){ while(scanf("%d%d",&n,&d)!=EOF){ Max = -1; for(int i = 0; i < n ; i++){ scanf("%d",&num[i]); Max = max(Max,num[i]); } build(1,0,Max); int ans = 0; cl(dp,0); for(int i = 0 ; i < n; i++){ if(i-d-1 >= 0) updata(1,num[i-d-1],dp[i-d-1]); if(num[i] == 0) dp[i] = 1; else dp[i] = query(1,0,num[i]-1) + 1; ans = max(ans,dp[i]); } printf("%d\n",ans); } return 0; }
|