记录编号 |
403655 |
评测结果 |
AAAAAAAAAA |
题目名称 |
天才魔法少女琪露诺爱计数 |
最终得分 |
100 |
用户昵称 |
FoolMike |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.181 s |
提交时间 |
2017-05-11 00:24:16 |
内存使用 |
115.88 MiB |
显示代码纯文本
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=1e5+10,M=1e7+10,p=998244353;
int inc(int x,int y){x+=y;return x>=p?x-p:x;}
int dec(int x,int y){x-=y;return x<0?x+p:x;}
struct Node{int l,r,v;}node[M];
int id,root[N];
int add(int x,int l,int r,int p,int d){
int now=++id;
node[now]=node[x];
node[now].v=inc(node[now].v,d);
if (l==r) return now;
int mid=(l+r)>>1;
if (p>mid) node[now].r=add(node[x].r,mid+1,r,p,d);
else node[now].l=add(node[x].l,l,mid,p,d);
return now;
}
int sum(int x,int l,int r,int L,int R){
if (!x) return 0;
if (l>=L&&r<=R) return node[x].v;
int mid=(l+r)>>1,ans=0;
if (L<=mid) ans=sum(node[x].l,l,mid,L,R);
if (R>mid) ans=inc(ans,sum(node[x].r,mid+1,r,L,R));
return ans;
}
int n,m,l,r,h[N],dp[N];
int main()
{
freopen("cirnoisclever.in","r",stdin);
freopen("cirnoisclever.out","w",stdout);
scanf("%d%d%d%d",&n,&l,&r,&m);
for (int i=1;i<=n;i++) scanf("%d",&h[i]);
root[1]=add(0,1,1e4,h[1],dp[1]=1);
for (int i=2;i<=n;i++){
int pl=max(i-l,0),pr=max(i-r-1,0);
dp[i]=dec(sum(root[pl],1,1e4,h[i]-m,h[i]+m),sum(root[pr],1,1e4,h[i]-m,h[i]+m));
root[i]=add(root[i-1],1,1e4,h[i],dp[i]);
}
printf("%d\n",dp[n]);
return 0;
}