记录编号 393003 评测结果 AAAAAAAAAA
题目名称 [東方S1] 琪露诺 最终得分 100
用户昵称 GravatarHeHe 是否通过 通过
代码语言 C++ 运行时间 0.431 s
提交时间 2017-04-09 18:12:26 内存使用 15.58 MiB
显示代码纯文本
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. using namespace std;
  5.  
  6. const int MAXN = 2e5 + 10;
  7.  
  8. const inline int in(void){
  9. char tmp = getchar();
  10. int res = 0, f = 1;
  11. while(!isdigit(tmp) && tmp != '-')tmp = getchar();
  12. if(tmp == '-')f = -1, tmp = getchar();
  13. while(isdigit(tmp))
  14. res = (res + (res << 2) << 1) + (tmp ^ 48),
  15. tmp = getchar();
  16. return res * f;
  17. }
  18.  
  19. template<typename T>
  20. T my_max(const T& a, const T& b){
  21. if(a < b)return b;
  22. return a;
  23. }
  24.  
  25. struct DATA{
  26. int val, w;
  27. DATA(){;}
  28. DATA(int _val, int _w){
  29. val = _val, w = _w;
  30. }
  31. bool operator < (const DATA& a)const{
  32. return val < a.val;
  33. }
  34. };
  35.  
  36. struct NODE{
  37. DATA val;
  38. NODE *ls, *rs;
  39. NODE *fa;
  40. NODE(){
  41. ls = rs = fa = NULL;
  42. }
  43. };
  44.  
  45. inline NODE *new_node(void){
  46. static NODE ns[MAXN * 3];
  47. static int tot = 0;
  48. return ns + tot++;
  49. }
  50.  
  51. NODE *Build(NODE *father, int l, int r);
  52. DATA Query(NODE *now, int l, int r, int L, int R);
  53. void updata(NODE *now, int w);
  54. void print_road(void);
  55.  
  56. int N, L, R;
  57. int a[MAXN], f[MAXN];
  58. int pre[MAXN];
  59. NODE *root, *father[MAXN];
  60. int Stack[MAXN], top;
  61.  
  62. int main(){
  63. #ifndef LOCAL
  64. freopen("iceroad.in", "r", stdin);
  65. freopen("iceroad.out", "w", stdout);
  66. #else
  67. freopen("test.in", "r", stdin);
  68. #endif
  69.  
  70. N = in(), L = in(), R = in();
  71. for(int i = 0; i <= N; ++i)a[i] = in();
  72. root = Build(NULL, 0, N);
  73. DATA tmp;
  74. for(int i = L; i < R; ++i){
  75. tmp = Query(root, 0, i - L, 0, N);
  76. if(tmp.w < L){
  77. f[i] = a[i];
  78. pre[i] = 0;
  79. }
  80. else{
  81. f[i] = tmp.val + a[i];
  82. pre[i] = tmp.w;
  83. }
  84. updata(father[i], f[i]);
  85. }
  86. for(int i = R; i <= N; ++i){
  87. tmp = Query(root, i - R, i - L, 0, N);
  88. f[i] = tmp.val + a[i];
  89. pre[i] = tmp.w;
  90. updata(father[i], f[i]);
  91. }
  92. tmp = Query(root, N + 1 - R, N, 0, N);
  93. f[N + 1] = tmp.val;
  94. pre[N + 1] = tmp.w;
  95. printf("%d\n", f[N + 1]);
  96. #ifdef debug
  97. printf("%d %d %d\n", N, L, R);
  98. for(int i = 0; i <= N + 1; ++i){
  99. printf("%d:%d ", i, a[i]);
  100. }
  101. putchar('\n');
  102. for(int i = 0; i <= N + 1; ++i){
  103. printf("%d:%d ", i, f[i]);
  104. }
  105. #endif
  106. print_road();
  107. return 0;
  108. }
  109.  
  110. NODE *Build(NODE *fath, int l, int r){
  111. NODE *p = new_node();
  112. p->fa = fath;
  113. if(l == r){
  114. p->val = DATA(f[l], l);
  115. father[l] = p;
  116. }
  117. else{
  118. int mid = (l + r) >> 1;
  119. p->ls = Build(p, l, mid);
  120. p->rs = Build(p, mid + 1, r);
  121. p->val = my_max(p->ls->val, p->rs->val);
  122. }
  123. return p;
  124. }
  125.  
  126. DATA Query(NODE *now, int l, int r, int L, int R){
  127. if(l == L && r == R)return now->val;
  128. int mid = (L + R) >> 1;
  129. if(r <= mid) return Query(now->ls, l, r, L, mid);
  130. if(mid < l) return Query(now->rs, l, r, mid + 1, R);
  131. return my_max(Query(now->ls, l, mid, L, mid), Query(now->rs, mid + 1, r, mid + 1, R));
  132. }
  133.  
  134. void updata(NODE *now, int w){
  135. DATA& tmp = now->val;
  136. tmp.val = w;
  137. while((now = now->fa) && now->val < tmp){
  138. now->val = tmp;
  139. }
  140. return ;
  141. }
  142.  
  143. void print_road(void){
  144. Stack[top++] = -1;
  145. int now = N + 1;
  146. while(now){
  147. Stack[top++] = pre[now];
  148. now = pre[now];
  149. }
  150. while(top){
  151. printf("%d ", Stack[--top]);
  152. }
  153.  
  154. return ;
  155. }