Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Total Submission(s): 1264 Accepted Submission(s): 344
#include<iostream> #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; const int maxn=111111; #define L(x) 2*x #define R(x) 2*x+1 struct node { int l,r,mx; int mid(){return (l+r)>>1;} }tree[5*maxn]; struct NODE { int val,id; }pp[maxn]; bool cmp(NODE a,NODE b) { if(a.val==b.val)return a.id>b.id; return a.val<b.val; } void pushup(int p) { tree[p].mx=max(tree[L(p)].mx,tree[R(p)].mx); } void build(int p,int l,int r) { tree[p].l=l; tree[p].r=r; tree[p].mx=0; if(l==r)return; int m=tree[p].mid(); build(L(p),l,m); build(R(p),m+1,r); pushup(p); } void update(int p,int pos,int val) { if(tree[p].l==tree[p].r) { tree[p].mx=max(tree[p].mx,val); return; } int m=tree[p].mid(); if(pos<=m)update(L(p),pos,val); else update(R(p),pos,val); pushup(p); } int query(int p,int l,int r) { if(l>r)return 0; if(tree[p].l>=l&&tree[p].r<=r)return tree[p].mx; int m=tree[p].mid(); int ans=-1; if(l<=m)ans=max(ans,query(L(p),l,r)); if(r>m)ans=max(ans,query(R(p),l,r)); return ans; } int main() { int i,j,k,m,n,d; while(~scanf("%d%d",&n,&d)) { for(i=1;i<=n;i++)scanf("%d",&pp[i].val),pp[i].id=i; sort(pp+1,pp+n+1,cmp); // for(i=1;i<=n;i++)cout<<pp[i].val<<" ";cout<<endl; build(1,1,n); int ans=0; for(i=1;i<=n;i++) { j=pp[i].id; k=query(1,1,j-d-1); ans=max(ans,k+1); update(1,j,k+1); } printf("%d\n",ans); } return 0; }