L3-002 堆栈(30 分)

超、凢脫俗 2022-05-23 11:20 262阅读 0赞

大家都知道“堆栈”是一种“先进后出”的线性结构,基本操作有“入栈”(将新元素插入栈顶)和“出栈”(将栈顶元素的值返回并从堆栈中将其删除)。现请你实现一种特殊的堆栈,它多了一种操作叫“查中值”,即返回堆栈中所有元素的中值。对于N个元素,若N是偶数,则中值定义为第N/2个最小元;若N是奇数,则中值定义为第(N+1)/2个最小元。

输入格式:

输入第一行给出正整数N(<=10^5^)。随后N行,每行给出一个操作指令,为下列3种指令之一:

Push key\Pop\PeekMedian

其中Push表示入栈,key是不超过10^5^的正整数;Pop表示出栈;PeekMedian表示查中值。

输出格式:

对每个入栈指令,将key入栈,并不输出任何信息。对每个出栈或查中值的指令,在一行中打印相应的返回结果。若指令非法,就打印“Invalid”。

输入样例:

  1. 17
  2. Pop
  3. PeekMedian
  4. Push 3
  5. PeekMedian
  6. Push 2
  7. PeekMedian
  8. Push 1
  9. PeekMedian
  10. Pop
  11. Pop
  12. Push 5
  13. Push 4
  14. PeekMedian
  15. Pop
  16. Pop
  17. Pop
  18. Pop

输出样例:

  1. Invalid
  2. Invalid
  3. 3
  4. 2
  5. 2
  6. 1
  7. 2
  8. 4
  9. 4
  10. 5
  11. 3
  12. Invalid

代码:

  1. #include<stdio.h>
  2. #include<string.h>
  3. int s[100001],c[100001],top=0;
  4. int lowbit(int i)
  5. {
  6. return i&(-i);
  7. }
  8. void update(int x,int y)
  9. {
  10. for(int i=x;i<100001;i+=lowbit(i))
  11. {
  12. c[i]+=y;
  13. }
  14. }
  15. int getsum(int x)
  16. {
  17. int sum=0;
  18. for(int i=x;i>=1;i-=lowbit(i))
  19. {
  20. sum+=c[i];
  21. }
  22. return sum;
  23. }
  24. void PeekMedian()
  25. {
  26. int i=1,j=100001,k=(top+1)/2;
  27. while(i<j)
  28. {
  29. int mind=(i+j)/2;
  30. if(getsum(mind)>=k)
  31. {
  32. j=mind;
  33. }
  34. else
  35. {
  36. i=mind+1;
  37. }
  38. }
  39. printf("%d\n",i);
  40. }
  41. int main()
  42. {
  43. int i,j,n,m,k,t;
  44. char operation[15];
  45. scanf("%d",&n);
  46. for(i=0;i<n;i++)
  47. {
  48. scanf("%s",operation);
  49. if(strcmp(operation,"Pop")==0)
  50. {
  51. if(top==0)
  52. {
  53. printf("Invalid\n");
  54. }
  55. else
  56. {
  57. printf("%d\n",s[top-1]);
  58. update(s[top-1],-1);
  59. top--;
  60. }
  61. }
  62. else if(strcmp(operation,"Push")==0)
  63. {
  64. scanf("%d",&s[top++]);
  65. update(s[top-1],1);
  66. }
  67. else
  68. {
  69. if(top==1)
  70. {
  71. printf("%d\n",s[0]);
  72. }
  73. else if(top>1)
  74. {
  75. PeekMedian();
  76. }
  77. else
  78. {
  79. printf("Invalid\n");
  80. }
  81. }
  82. }
  83. return 0;
  84. }

发表评论

表情:
评论列表 (有 0 条评论,262人围观)

还没有评论,来说两句吧...

相关阅读

    相关 L3-002. 堆栈

    大家都知道“堆栈”是一种“先进后出”的线性结构,基本操作有“入栈”(将新元素插入栈顶)和“出栈”(将栈顶元素的值返回并从堆栈中将其删除)。现请你实现一种特殊的堆栈,它多了一种操

    相关 L3-005 垃圾箱分布(30

    大家倒垃圾的时候,都希望垃圾箱距离自己比较近,但是谁都不愿意守着垃圾箱住。所以垃圾箱的位置必须选在到所有居民点的最短距离最长的地方,同时还要保证每个居民点都在距离它一个不太远的

    相关 L3-003 社交集群(30

    在社交网络平台注册时,用户通常会输入自己的兴趣爱好,以便找到和自己兴趣相投的朋友。有部分兴趣相同的人们就形成了“社交集群”。现请你编写程序,找出所有的集群。 输入格式: 输

    相关 L3-002 堆栈30

    大家都知道“堆栈”是一种“先进后出”的线性结构,基本操作有“入栈”(将新元素插入栈顶)和“出栈”(将栈顶元素的值返回并从堆栈中将其删除)。现请你实现一种特殊的堆栈,它多了一种操