记录编号 405983 评测结果 AAAAAAAAAA
题目名称 2692.天才魔法少女琪露诺爱计数 最终得分 100
用户昵称 sxysxy 是否通过 通过
代码语言 C++ 运行时间 0.065 s
提交时间 2017-05-17 18:15:00 内存使用 1.76 MiB
显示代码纯文本
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <cctype>
#include <list>
#include <queue>
#include <deque>
using namespace std;
const int MAXN = 1e5+10;
const int MAXT = 1e4;
const int MOD = 998244353;
struct node{
  node *ls, *rs;
  int sum;
};
inline node *new_node(){
  static node ns[MAXT<<2], *p = ns;
  return p++;
}
node *build(int l, int r){
  if(l > r)return NULL;
  node *d = new_node();
  if(l < r){
    int m = (l+r)>>1;
    d->ls = build(l, m); d->rs = build(m+1, r);
  }
  return d;
}
void insert(node *x, int p, int v, int L, int R){
  if(!x)return;
  x->sum = ((x->sum+v)%MOD+MOD)%MOD;
  if(p == L && L == R)return;
  int M = (L+R)>>1;
  if(p <= M)insert(x->ls, p, v, L, M);
  else if(p > M)insert(x->rs, p, v, M+1, R);
}
int query(node *x, int l, int r, int L, int R){
  if(!x)return 0;
  if(l <= L && R <= r)return x->sum;
  int M = (L+R)>>1, ret = 0;
  if(l <= M)ret = query(x->ls, l, r, L, M);
  if(r > M)ret = ((ret+query(x->rs, l, r, M+1, R))%MOD+MOD)%MOD;
  return ret;
}
namespace IO{
  char buf[1<<18], *fs, *ft;
  inline char readc(){
    return (fs==ft&&(ft=(fs=buf)+fread(buf,1,1<<18,stdin)),fs==ft)?EOF:*fs++;
  }
  inline int readint(){
    char c; int r;
    while(c = readc()){if(c >= '0' && c <= '9'){r = c^0x30;break;}}
    while(isdigit(c = readc()))r = (r<<3)+(r<<1)+(c^0x30);
    return r;
  }
  inline int read_string(char *str){
    int len = 1;char c;
    while(!isalpha(c = readc()));str[0] = c;
    while(isalpha(c = readc()))str[len++] = c;
    str[len] = 0;
    return len;
  }
};using IO::read_string; using IO::readint;
int f[MAXN], H[MAXN];
int main(){
  freopen("cirnoisclever.in", "r", stdin);
  freopen("cirnoisclever.out", "w", stdout);
  int N, L, R, T;  
  N = readint(); L = readint(); R = readint(); T = readint();
  for(int i = 1; i <= N; i++)H[i] = readint();
  node *root = build(1, MAXT);
  f[1] = 1;
  for(int i = L+1; i <= N; i++){
    insert(root, H[i-L], f[i-L], 1, MAXT);
    f[i] = query(root, max(1, H[i]-T), min(MAXT, H[i]+T), 1, MAXT);
    if(i-R >= 1)insert(root, H[i-R], -f[i-R], 1, MAXT);
  }
  printf("%d\n", f[N]);
  return 0;
}