比赛 |
2024暑假C班集训9 |
评测结果 |
RRRRRRRRRR |
题目名称 |
天才魔法少女琪露诺爱计数 |
最终得分 |
0 |
用户昵称 |
123 |
运行时间 |
0.006 s |
代码语言 |
C++ |
内存使用 |
11.84 MiB |
提交时间 |
2024-07-09 11:35:00 |
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
const int N=100010,Mod=998244353;
struct node {
int l,r;
long long val=0,key,flag=0;
} tree[N];
int n,l,r;
long long ret[N],a[N],cnt[N],t,dp[N];
void pushup(int p)
{
tree[p].val=tree[p*2].val+tree[p*2+1].val;
}
void pushdown(int p)
{
if (tree[p].flag)
{
tree[p*2].flag+=tree[p].flag;
tree[p*2+1].flag+=tree[p].flag;
tree[p*2].val+=tree[p].flag;
tree[p*2+1].val+=tree[p].flag;
tree[p].flag=0;
}
}
void bulid(int p,int l,int r)
{
tree[p].l=l,tree[p].r=r;
if (l==r)
{
if (l==1)
{
tree[p].val=1;
}
tree[p].key=ret[l];
return ;
}
int mid=(l+r)/2;
bulid(p*2,l,mid);
bulid(p*2+1,mid+1,r);
tree[p].key=tree[p*2].key+tree[p*2+1].key;
}
void add(int i,int p,int l,int r,long long k)
{
if (l>n || tree[p].l==0)
{
return ;
}
if (a[i]+t*(tree[p].r-tree[p].l+1)>tree[p].key && l<=tree[p].l && tree[p].r<=r)
{
tree[p].flag+=k;
tree[p].val+=k*(tree[p].r-tree[p].l+1);
tree[p].val%=Mod;
return ;
}
pushdown(p);
int mid=(tree[p].l+tree[p].r)/2;
if (l<=mid) add(i,p*2,l,r,k);
if (r>mid) add(i,p*2+1,l,r,k);
pushup(p);
}
int print(int x,int p)
{
if (tree[p].l==tree[p].r)
{
if (tree[p].l==x)
{
return tree[p].val;
}
return 0;
}
pushdown(p);
int mid=(tree[p].l+tree[p].r)/2;
long long val=0;
if (x<=mid) val+=print(x,p*2);
if (x>mid) val+=print(x,p*2+1);
return val;
}
int main() {
//freopen("cirnoisclever.in","r",stdin);
//freopen("cirnoisclever.out","w",stdout);
scanf("%d%d%d%lld",&n,&l,&r,&t);
for (int i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
}
if (n<=10000 && r-l+1<=1000)
{
dp[1]=1;
for (int i=1;i<=n;i++)
{
for (int j=i+l;j<=i+r;j++)
{
if (abs(a[j]-a[i])<=t)
{
dp[j]+=dp[i];
}
}
}
printf("%lld",dp[n]);
return 0;
}
for (int i=1;i<n;i++)
{
cnt[i]=a[i+1]-a[i];
}
for (int i=1;i<n;i++)
{
ret[i]=ret[i-1]+cnt[i];
}
bulid(1,1,n);
for (int i=1;i<=n;i++)
{
add(i,1,i+l,i+r,print(i,1));
}
printf("%lld",print(n,1));
}