记录编号 403655 评测结果 AAAAAAAAAA
题目名称 天才魔法少女琪露诺爱计数 最终得分 100
用户昵称 GravatarFoolMike 是否通过 通过
代码语言 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;
}