比赛 至少完成十道练习 评测结果 AAAAAAAAA
题目名称 滑动窗口 最终得分 100
用户昵称 Mealy 运行时间 1.580 s
代码语言 C++ 内存使用 65.17 MiB
提交时间 2017-05-22 19:19:16
显示代码纯文本
  1. //495
  2. #include <iostream>
  3. #include <cstdio>
  4. #define u ree[tmpx]
  5. #define lc ree[tmpx<<1]
  6. #define rc ree[tmpx<<1^1]
  7. using namespace std;
  8. const int nmax=1000086;
  9. typedef long long ll;
  10.  
  11. int n,k;
  12. int val[nmax];
  13. class SegmentTree{
  14. public:
  15. int l,r;
  16. int min,max;
  17. }ree[nmax*4];
  18. int GetMax(int a,int b){
  19. if(a>b) return a;
  20. else return b;
  21. }
  22. int GetMin(int a,int b){
  23. if(a<b) return a;
  24. else return b;
  25. }
  26.  
  27. void SetTree(int tmpx,int tmpl,int tmpr){
  28. u.l = tmpl;
  29. u.r = tmpr;
  30. if(tmpl == tmpr){
  31. u.max = val[tmpl];
  32. u.min = val[tmpl];
  33. }
  34. else{
  35. SetTree(tmpx<<1,tmpl,(tmpl+tmpr)>>1);
  36. SetTree(tmpx<<1^1,((tmpl+tmpr)>>1)+1,tmpr);
  37. u.max = GetMax(lc.max,rc.max);
  38. u.min = GetMin(lc.min,rc.min);
  39. }
  40. }
  41.  
  42. int QueryMax(int tmpx,int tmpl,int tmpr){
  43. if((tmpl <= u.l)&&(tmpr >= u.r))
  44. return u.max;
  45. else{
  46. if(u.r != u.l){
  47. int maxl=0,maxr=0;
  48. if(tmpl <= lc.r)
  49. maxl=QueryMax(tmpx<<1,tmpl,tmpr);
  50. if(tmpr >= rc.l)
  51. maxr=QueryMax(tmpx<<1^1,tmpl,tmpr);
  52. return GetMax(maxl,maxr);
  53. }
  54. }
  55. }
  56. int QueryMin(int tmpx,int tmpl,int tmpr){
  57. if((tmpl <= u.l)&&(tmpr>=u.r)){
  58. return u.min;
  59. }
  60. else{
  61. if(u.r!=u.l){
  62. int minl=nmax,minr=nmax;
  63. if(tmpl<=lc.r)
  64. minl=QueryMin(tmpx<<1,tmpl,tmpr);
  65. if(tmpr>=rc.l)
  66. minr=QueryMin(tmpx<<1^1,tmpl,tmpr);
  67. return GetMin(minl,minr);
  68. }
  69. }
  70. }
  71. int main(){
  72. freopen("window.in","r",stdin);
  73. freopen("window.out","w",stdout);
  74. scanf("%d%d",&n,&k);
  75. for(int i=1;i<=n;i++)
  76. scanf("%d",&val[i]);
  77. SetTree(1,-1,n);
  78. for(int i=1;i<=n-k+1;i++)
  79. printf("%d ",QueryMin(1,i,i+k-1));
  80. printf("\n");
  81. for(int i=1;i<=n-k+1;i++)
  82. printf("%d ",QueryMax(1,i,i+k-1));
  83. printf("\n");
  84. return 0;
  85. }