记录编号 406218 评测结果 AAAAAAAAAA
题目名称 天才魔法少女琪露诺爱计数 最终得分 100
用户昵称 GravatarJustWB 是否通过 通过
代码语言 C++ 运行时间 0.148 s
提交时间 2017-05-18 09:16:16 内存使用 1.08 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
const int MX=998244353;
struct pstree
{
	int l,r;
	int ls,rs;
	int sum;
	pstree(){l=0,r=0,ls=-1,rs=-1,sum=0;}
};
int n,L,R,t,mx,maxn;
bool p;
int N[100001],pn[100001];
vector<pstree> tree;
inline int build(int l,int r)
{
	pstree temp;
	int now=maxn++;
	tree.push_back(temp);
	tree[now].l=l,tree[now].r=r;
	if(l==r)return now;
	int mid=(l+r)>>1,ls,rs;
	ls=build(l,mid);
	tree[now].ls=ls;
	rs=build(mid+1,r);
	tree[now].rs=rs;
	return now;
}
inline void update(int des,int now)
{
	if(tree[now].ls==-1)
	{
		if(p)tree[now].sum+=pn[des];
		else tree[now].sum-=pn[des];
		if(tree[now].sum < 0) tree[now].sum += MX;
		tree[now].sum%=MX;
		return;
	}
	int mid=tree[tree[now].ls].r;
	if(N[des]<=mid)update(des,tree[now].ls);
	else update(des,tree[now].rs);
	tree[now].sum=(tree[tree[now].ls].sum+tree[tree[now].rs].sum)%MX;

}
inline int search(int l,int r,int now)
{
	if(l==tree[now].l&&r==tree[now].r)return tree[now].sum;
	int mid=tree[tree[now].ls].r;
	if(r<=mid)return search(l,r,tree[now].ls);
	if(l>mid)return search(l,r,tree[now].rs);
	return (search(l,mid,tree[now].ls)+search(mid+1,r,tree[now].rs))%MX;
}
int main()
{
	freopen("cirnoisclever.in","r",stdin);
	freopen("cirnoisclever.out","w",stdout);
	scanf("%d%d%d%d",&n,&L,&R,&t);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&N[i]);
		if(N[i]>mx)mx=N[i];
		
	}
	build(1,mx);
	pn[1]=1;p=1;update(1,0);
	for(int i=L+1;i<=n;i++)
	{
		int l=i-R,r=i-L,ll=max(1,N[i]-t),rr=min(mx,N[i]+t);
		if(l<=1)
		{
			pn[i]=search(ll,rr,0)%MX;
			p=1;
			update(r + 1,0);
			continue;
		}
		else
		{
			p=0;
			update(l-1,0);
			pn[i]=search(ll,rr,0)%MX;
			p=1;
			update(r + 1,0);
		}
	}
	printf("%d",pn[n]);
	return 0;
}