2 条题解

  • 0
    @ 2025-10-8 16:49:04
    #include <bits/stdc++.h>
    using namespace std;
    const int N = 510000;
    int n, c[N];
    bool a[N];
    // a[i]的值只有0或1,表示第i号公路(点i-1与点i之间的公路)是否存在
    // 注:代码中对第i号公路的定义与题意不同
    int lowbit(int x) { return x & -x; }
    void add(int x, int k)
    {
        for (int i = x; i <= n; i += lowbit(i)) c[i] = c[i] + k;
    }
    int getsum(int x)
    {
        int ret = 0;
        for (int i = x; i >= 1; i -= lowbit(i)) ret += c[i];
        return ret;
    }
    int main()
    {
        int T; scanf("%d", &T);
        while (T--)
        {
            int m; scanf("%d%d", &n, &m);
            memset(a, 0, sizeof(a)); memset(c, 0, sizeof(c));
            for (int i = 1; i <= n; i++) add(i, 1), a[i] = 1;
            for (int i = 1, k, x, y; i <= m; i++)
            {
                scanf("%d", &k);
                if (k == 1)
                {
                    scanf("%d%d", &x, &y); if (x > y) swap(x, y);
                    int s1 = getsum(y) - getsum(x); // s1=路径x->x+1->……->y存在(没破坏)的边数
                    // s1=(n->1->2->…->y存在的边数) - (n->1->2->…->x存在的边数)
                    // (n->1->2->…->y存在的边数) = getsum(y)
                    // (n->1->2->…->x存在的边数) = getsum(x)
    
                    int s2 = getsum(n) - getsum(y) + getsum(x); // s2=路径 y->y+1->……->n->1->2->……->x存在的边数
                    // //s2=(y->y+1->……->n存在的边数) + (n->1->2->……->x存在的边数)
                    // (y->y+1->……->n存在的边数)   = getsum(n)-getsum(y):
                    // (n->1->2->……->x存在的边数)  = getsum(x)
                    if ((s1 == y - x) || (s2 == (n - y) + x)) printf("1\n");
                    else printf("0\n");
                }
                else
                {
                    int x; scanf("%d", &x);
                    x = x % n + 1; // 题意中的第x号公路对应代码中的第x+1号公路,题意中的第n号公路对应代码中的第1号公路
                    if (a[x] == 1) a[x] = 0, add(x, -1);
                    else a[x] = 1, add(x, 1);
                }
            }
            printf("\n");
        }
        return 0;
    }
    
    • 0
      @ 2025-10-8 16:48:56
      #include<bits/stdc++.h>
      using namespace std;
      const int N=510000;
      int n,c[N];
      bool a[N];
      //a[i]的值只有0或1,表示第i号公路(点i-1与点i之间的公路)是否存在
      //注:代码中对第i号公路的定义与题意不同
      int lowbit(int x){return x&-x;}
      void add(int x,int k)
      {
          for(int i=x;i<=n;i+=lowbit(i))c[i]=c[i]+k;
      }
      int getsum(int x)
      {
          int ret=0;
          for(int i=x;i>=1;i-=lowbit(i))ret+=c[i];
          return ret;
      }
      int main()
      {
          int T;scanf("%d",&T);
          while(T--)
          {
              int m;scanf("%d%d",&n,&m);
              memset(a,0,sizeof(a)); memset(c,0,sizeof(c));
              for(int i=1;i<=n;i++)add(i,1),a[i]=1;
              for(int i=1,k,x,y;i<=m;i++)
              {
                  scanf("%d",&k);
                  if(k==1)
                  {
                      scanf("%d%d",&x,&y);if(x>y)swap(x,y);
                      int s1=getsum(y)-getsum(x);//s1=路径x->x+1->……->y存在(没破坏)的边数
                      //s1=(n->1->2->…->y存在的边数) -  (n->1->2->…->x存在的边数)
                      //(n->1->2->…->y存在的边数) = getsum(y)
                      //(n->1->2->…->x存在的边数) = getsum(x)
      
                      int s2=getsum(n)-getsum(y) +  getsum(x);//s2=路径 y->y+1->……->n->1->2->……->x存在的边数
                      ////s2=(y->y+1->……->n存在的边数) + (n->1->2->……->x存在的边数)
                      //(y->y+1->……->n存在的边数)   = getsum(n)-getsum(y):
                      //(n->1->2->……->x存在的边数)  = getsum(x)
                      if( (s1==y-x) ||  (s2== (n-y) + x)  )printf("1\n");
                      else printf("0\n");
                  }
                  else
                  {
                      int x;scanf("%d",&x);
                      x=x%n+1;//题意中的第x号公路对应代码中的第x+1号公路,题意中的第n号公路对应代码中的第1号公路
                      if(a[x]==1)a[x]=0,add(x,-1);
                      else       a[x]=1,add(x,1);
                  }
              }
              printf("\n");
          }
          return 0;
      }
      • 1

      *【树状数组)】破坏环形公路

      信息

      ID
      271
      时间
      1000ms
      内存
      128MiB
      难度
      4
      标签
      递交数
      99
      已通过
      44
      上传者