• stack(hdu)


    题意:有n个栈,第i个栈刚开始只放了i,有m个操作,每次把ai放到bi里,求最后每个栈里元素的个数和元素

    模拟肯会超时,那么我们就想用双链表来写

    s数组用来存一个数的前面相连的数或者后面的数(因为堆的话一个数只能连两个数)

    1. struct name{
    2. int pre,next;
    3. }s[N];

    sta数组用来记录栈顶和栈底元素

    1. struct po{
    2. int top,bot;
    3. }sta[N];

    f数组来记录这个数输出过没有,num来记录每个栈的元素的个数

    int f[N],num[N];

    刚开始初始化的时候每个栈的栈顶和栈底都是i本身,然后num都是1,f初始化为0,每个数没有与他相连的数,所以前面后面都是0

    1. for(int i=1;i<=n;i++){
    2. num[i]=1;
    3. sta[i].top =sta[i].bot =i;
    4. f[i]=0;
    5. s[i].next =s[i].pre =0;
    6. }

    然后我们对于把a这个栈放到b这个栈的add操作:

    我们分别用xyzq来记录a的栈顶和栈底,b的栈顶和栈底

    把a放入b,那么a的栈底就是b的栈顶

    a的num要加到b的num里去,a的num变成0

    然后a的栈顶x就会连上b的栈顶z,判断一下x有没有与他相连的数

    如果没有就把z连到x的后面next,如果有就连到x的前面pre

    z的情况也是一样,如果z后面没有的话就连到后面,有的话就连到前面

    1. #include<iostream>
    2. #include<algorithm>
    3. #include<cmath>
    4. #include<stack>
    5. #include<vector>
    6. #include<queue>
    7. #include<set>
    8. #include<cstring>
    9. #include<list>
    10. #include<map>
    11. #include<cstdio>
    12. typedef long long ll;
    13. typedef int64_t s64;
    14. using namespace std;
    15. struct node{
    16. int pre,next;
    17. }s[200005];
    18. struct stac{
    19. int top,bot;
    20. }sta[200005];
    21. int num[200005];
    22. void add(int a,int b){
    23. int x=sta[a].top;
    24. int y=sta[a].bot;
    25. int z=sta[b].top;
    26. int q=sta[b].bot;
    27. if(!num[b]){ //b栈中没有东西
    28. sta[b].bot=x; //a的头变b的底
    29. sta[b].top=y; //a的底比b的头
    30. sta[a].top=sta[a].bot=0; //把a头和底置0
    31. }
    32. else{ //b栈有东西
    33. if(!s[x].next){ //判断a栈中的头是否是next空(因为此题为双向链表不能确定是next还是pre)
    34. s[x].next=z;
    35. }
    36. else{ //判断a栈中的头是否是pre空
    37. s[x].pre=z;
    38. }
    39. if(!s[z].next){ //判断b栈中的头是否是next空(双向链表所以a和b是需要相互连接的)
    40. s[z].next=x;
    41. }
    42. else{ //判断b栈中的头是否是pre空
    43. s[z].pre=x;
    44. } //在这之前都是在做将ab栈连接起来的操作
    45. sta[b].top=y; //把a的底变b的头
    46. sta[a].top=sta[a].bot=0; //把a的头和底置0
    47. }
    48. num[b]+=num[a];
    49. num[a]=0;
    50. }
    51. int sig[200005];
    52. int main(){
    53. int n,m;
    54. while(cin>>n>>m){
    55. for(int i=1;i<=n;i++){ //初始化n个栈
    56. s[i].pre=s[i].next=0;
    57. sta[i].top=sta[i].bot=i;
    58. num[i]=1;
    59. sig[i]=0;
    60. }
    61. int x,y;
    62. while(m--){
    63. cin>>x>>y;
    64. if(num[x]==0)
    65. continue;
    66. add(x,y);
    67. }
    68. for(int i=1;i<=n;i++){
    69. int k=sta[i].top;
    70. cout<<num[i]; //输出当前栈中的数据个数
    71. if(num[i]){ //判断是否栈中有数据
    72. while(k){
    73. cout<<" "<<k;
    74. sig[k]=1; //每次找到并且输出后都需要标记
    75. if(s[k].next&&sig[s[k].next]!=1){ //寻找下一个数据,因不确定是next还是pre所以需要进行以下的判断
    76. k=s[k].next;
    77. }
    78. else if(s[k].pre&&sig[s[k].pre]!=1){
    79. k=s[k].pre;
    80. }
    81. else{
    82. k=0; //找不到下一个退出循环
    83. }
    84. }
    85. }
    86. cout<<endl;
    87. }
    88. }
    89. return 0;
    90. }

  • 相关阅读:
    数字孪生、模拟、仿真
    Springboot游戏道具在线交易平台毕业设计源码171956
    Oracle关联机制
    Redis 数据类型详细解析
    双周赛117(容斥原理、记忆化搜索==>动态规划、分组背包方案数、脑经急转弯)
    tf-lite转换记录
    MySQL超详细安装教程 手把手教你安装MySQL到使用MySQL 最简单的MySQL安装方式,这种方式装,卸载也简单
    k8s-kubeapps部署 20
    灵性图书馆:好书推荐-《终极真理》
    Flask 学习-7. make_response() 自定义响应内容
  • 原文地址:https://blog.csdn.net/qq_61903556/article/details/126913979