记录编号 406365 评测结果 AAAAAAAAAA
题目名称 天才魔法少女琪露诺爱计数 最终得分 100
用户昵称 GravatarHeHe 是否通过 通过
代码语言 C++ 运行时间 0.046 s
提交时间 2017-05-18 15:59:45 内存使用 1.46 MiB
显示代码纯文本
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. using namespace std;
  5.  
  6. const int MAXN = 1e5 + 10;
  7. const int MOD = 998244353;
  8.  
  9. inline int in(void){
  10. char tmp = getchar();
  11. int res = 0;
  12. while(!isdigit(tmp)) tmp = getchar();
  13. while(isdigit(tmp))
  14. res = (res + (res << 2) << 1) + (tmp ^ 48),
  15. tmp = getchar();
  16. return res;
  17. }
  18.  
  19. inline int lowbit(int x);
  20. inline void update(int i, int k);
  21. inline int sum(int i);
  22.  
  23. int N, L, R, T, maxh;
  24. int h[MAXN];
  25. int f[MAXN];
  26. int s[MAXN];
  27.  
  28. int main(){
  29. #ifndef LOCAL
  30. freopen("cirnoisclever.in", "r", stdin);
  31. freopen("cirnoisclever.out", "w", stdout);
  32. #else
  33. freopen("test.in", "r", stdin);
  34. #endif
  35. N = in(), L = in(), R = in(), T = in();
  36.  
  37. for(int i = 1; i <= N; ++i){
  38. h[i] = in();
  39. if(h[i] > maxh) maxh = h[i];
  40. }
  41.  
  42. f[1] = 1;
  43. update(h[1], f[1]);
  44.  
  45. for(int i = L + 1, l, r, lh, hh; i <= N; ++i){
  46. r = i - L + 1;
  47. l = max(0, i - R);
  48. lh = max(1, h[i] - T);
  49. hh = min(maxh, h[i] + T);
  50.  
  51. f[i] = (sum(hh) - sum(lh - 1) + MOD) % MOD;
  52. update(h[l], -f[l]);
  53. update(h[r], f[r]);
  54. }
  55.  
  56. printf("%d\n", f[N]);
  57. return 0;
  58. }
  59.  
  60. inline int lowbit(int x){
  61. return x & (~x + 1);
  62. }
  63.  
  64. inline void update(int i, int k){
  65. if(!i) return ;
  66. while(i <= maxh){
  67. s[i] += k;
  68. while(s[i] < 0) s[i] += MOD;
  69. s[i] %= MOD;
  70. i += lowbit(i);
  71. }
  72.  
  73. return ;
  74. }
  75.  
  76. inline int sum(int i){
  77. int sum = 0;
  78. while(i){
  79. sum = (sum + s[i]) % MOD;
  80. i -= lowbit(i);
  81. }
  82.  
  83. return sum;
  84. }