ZOJ 3349 Special Subsequence
Special Subsequence
Time Limit: 5000MS
Memory Limit: 32768KB
64bit IO Format: %lld & %llu
[Submit] [Go Back] [Status]
Description
There a sequence S with n integers , and A is a special subsequence that satisfies |Ai-Ai-1| <= d ( 0 Now your task is to find the longest special subsequence of a certain sequence S
Input
There are no more than 15 cases , process till the end-of-file
The first line of each case contains two integer n and d ( 1<=n<=100000 , 0<=d<=100000000) as in the description.
The second line contains exact n integers , which consist the sequnece S .Each integer is in the range [0,100000000] .There is blank between each integer.
There is a blank line between two cases
Output
For each case , print the maximum length of special subsequence you can get.
Sample Input
5 2
1 4 3 6 5
5 0
1 2 3 4 5
Sample Output
3
1
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
const int maxn=101000;
int n,d,a[maxn],b[maxn],t,dp[maxn];
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
int tree[maxn<<2];
void push_up(int l,int r,int rt)
{
tree[rt]=max(tree[rt<<1],tree[rt<<1|1]);
}
void build(int l,int r,int rt)
{
if(l==r)
{
tree[rt]=0;
return ;
}
int m=(l+r)>>1;
build(lson); build(rson);
push_up(l,r,rt);
}
int query(int l,int r,int rt,int L,int R)
{
if(L<=l&&r<=R)
{
return tree[rt];
}
int m=(l+r)>>1;
int ret=-1;
if(L<=m) ret=max(ret,query(lson,L,R));
if(R>m) ret=max(ret,query(rson,L,R));
return ret;
}
void update(int l,int r,int rt,int P,int V)
{
if(l==r)
{
tree[rt]=V;
return ;
}
int m=(l+r)>>1;
if(P<=m) update(lson,P,V);
else update(rson,P,V);
push_up(l,r,rt);
}
int main()
{
while(scanf("%d%d",&n,&d)!=EOF)
{
for(int i=1;i<=n;i++)
{
scanf("%d",a+i);
b[i]=a[i];
}
sort(b+1,b+n+1);
int t=unique(b+1,b+n+1)-b-1;
memset(dp,0,sizeof(dp));
dp[1]=1;
build(1,n,1);
for(int i=1;i<=n;i++)
{
int rt=lower_bound(b+1,b+t+1,a[i])-b;
int l=lower_bound(b+1,b+t+1,a[i]-d)-b;
int r=upper_bound(b+1,b+t+1,a[i]+d)-(b+1);
dp[i]=query(1,n,1,l,r)+1;
update(1,n,1,rt,dp[i]);
}
int ans=-1;
for(int i=1;i<=n;i++)
ans=max(ans,dp[i]);
printf("%d
",ans);
}
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.