2 条题解

  • 0
    @ 2025-10-8 16:59:48
    #include <bits/stdc++.h>
    using namespace std;
    const int N=2e5+10;
    struct Block{int st,ed;}B[N],B2[N];int len,len2;
    int n,a[N],nxt[N];
    int main()
    {
        scanf("%d",&n);
        for(int i=1;i<=n;i++)scanf("%d",&a[i]);  a[n+1]=-1;
        for(int i=1;i<n;i++)if(a[i]==a[i+1])nxt[i]=i+1;else nxt[i]=0;
    	len=0;
        for(int i=1,st=1;i<=n;i++)
        {
            if(a[i]!=a[i+1])
            {
                B[++len]={st,i};
                st=i+1;
            }
        }
        while(len)
        {
            len2=0;
            for(int i=1;i<=len;i++)
            {
                printf("%d ",B[i].st);
                B[i].st=nxt[B[i].st];
                if(B[i].st)
                {
                    if(len2 && a[B2[len2].ed]==a[B[i].st])
    				{
    					nxt[B2[len2].ed]=B[i].st;
    					B2[len2].ed=B[i].ed;
    				}
                    else B2[++len2]=B[i];
                }
            }
    		printf("\n");
            len=len2;
            for(int i=1;i<=len2;i++)B[i]=B2[i];
        }
        return 0;
    }
    
    • 0
      @ 2025-10-8 16:59:36
      #include<bits/stdc++.h>
      using namespace std;
      const int N=2e5+10;
      struct Block{int st,ed;}B[N],B2[N];int len,len2;
      int n,a[N],nxt[N];
      int main()
      {
          scanf("%d",&n);
          for(int i=1;i<=n;i++)scanf("%d",&a[i]);  a[n+1]=-1;
          for(int i=1;i<n;i++)if(a[i]==a[i+1])nxt[i]=i+1;else nxt[i]=0;
      	len=0;
          for(int i=1,st=1;i<=n;i++)
          {
              if(a[i]!=a[i+1])
              {
                  B[++len]={st,i};
                  st=i+1;
              }
          }
          while(len)
          {
              len2=0;
              for(int i=1;i<=len;i++)
              {
                  printf("%d ",B[i].st);
                  B[i].st=nxt[B[i].st];
                  if(B[i].st)
                  {
                      if(len2 && a[B2[len2].ed]==a[B[i].st])
      				{
      					nxt[B2[len2].ed]=B[i].st;
      					B2[len2].ed=B[i].ed;
      				}
                      else B2[++len2]=B[i];
                  }
              }
      		printf("\n");
              len=len2;
              for(int i=1;i<=len2;i++)B[i]=B2[i];
          }
          return 0;
      }
      • 1

      【链表】[CSP-J 2021] 小熊的果篮

      信息

      ID
      2019
      时间
      1000ms
      内存
      512MiB
      难度
      5
      标签
      递交数
      50
      已通过
      18
      上传者