2 solutions

  • 0
    @ 2025-5-9 17:21:38

    #include <bits/stdc++.h> using namespace std;

    // 处理单个测试用例的函数 void solve() { int n, k, q; // 涉及参数:n(总长度),k(位移量),q(查询位置) cin >> n >> k >> q; k %= 2 * n; // 周期优化:位移具有2n的周期性

    int ans; // 存储最终结果
    
    /* 特殊边界条件处理 */
    if (k == 0) // 无位移情况
    {
        cout << q << endl; // 直接返回原位置
    }
    else if (k == n) // 半周期反转
    {
        cout << n - q + 1 << endl; // 位置镜像翻转(如1↔n)
    }
    /* 正向位移逻辑(k < n) */
    else if (k < n)
    {
        if (q & 1) // 奇数位置处理分支
        {
            /* 当剩余空间不足时 */
            if (k >= n - q + 1) // 剩余空间计算:n - q + 1
            {
                // 消耗全部剩余空间
                k -= n - q + 1; 
                // 回绕到尾部继续计算
                ans = n - k; 
            }
            else // 正常前移
            {
                ans = q + k;
            }
        }
        else // 偶数位置处理分支
        {
            /* 当位移量超过当前位置值时 */
            if (k >= q) 
            {
                // 消耗全部当前值
                k -= q;
                // 转换移动方向
                ans = k + 1; 
            }
            else // 正常后移
            {
                ans = q - k;
            }
        }
        cout << ans << endl;
    }
    /* 反向位移逻辑(k > n)*/
    else if (k > n)
    {
        k -= n; // 转换为反向位移量
        if (q & 1) // 奇数位置处理分支
        {
            /* 剩余空间不足时 */
            if (k > n - q) 
            {
                // 消耗剩余空间
                k -= n - q;
                // 回绕到头部处理
                ans = k; 
            }
            else // 正常反向移动
            {
                ans = (n - q) - k + 1;
            }
        }
        else // 偶数位置处理分支
        {
            /* 转换剩余空间计算方式 */
            int effective = n - (n - q + 1); 
            if (k > effective)
            {
                // 消耗有效空间
                k -= effective;
                // 反向回绕计算
                ans = n - k + 1; 
            }
            else
            {
                // 正常逆向偏移
                ans = (n - q + 1) + k; 
            }
        }
        cout << ans << endl;
    }
    
    return;
    

    }

    signed main() { int _T = 1; // 测试用例数 cin >> _T; while (_T--) { solve(); // 处理每个用例 } return 0; } 注释

    • -1
      @ 2025-5-6 21:55:10

      题意: 给一串1 n1~n的数字,有kk次操作,第ii次操作满足下面两个条件: 当ii为奇数时:交换下标为 2i12*i-12i2*i 的数; 当ii为偶数时:交换下标为 2i2*i2i+12*i+1 的数。 kk次操作全部完成之后,问数字qq在第几位。

      题解: 列出任意一种交换的情况可以发现,该操作2n2*n次操作为一个循环。 并且每个数字下标的变换满足特定的规律,按照该规律写出代码即可AC(注意边界值)。

      #include <bits/stdc++.h>
      using namespace std;
      void solve()
      {
          int n, k, q;
          cin >> n >> k >> q;
          k %= 2 * n;
       
          int ans;
          if (k == 0)
          {
              cout << q << endl;
          }
          else if (k == n)
          {
              cout << n - q + 1 << endl;
          }
          else if (k < n)
          {
              if (q & 1)
              {
                  if (k >= n - q + 1)
                  {
                      k -= n - q + 1;
                      ans = n - k;
                  }
                  else
                  {
                      ans = q + k;
                  }
              }
              else
              {
                  if (k >= q)
                  {
                      k -= q;
                      ans = k + 1;
                  }
                  else
                  {
                      ans = q - k;
                  }
              }
              cout << ans << endl;
          }
          else if (k > n)
          {
              k -= n;
              if (q & 1)
              {
                  if (k > n - q)
                  {
                      k -= n - q;
                      ans = k;
                  }
                  else
                  {
                      ans = (n - q) - k + 1;
                  }
              }
              else
              {
                  if (k > n - (n - q + 1))
                  {
                      k -= n - (n - q + 1);
                      ans = n - k + 1;
                  }
                  else
                  {
                      ans = (n - q + 1) + k;
                  }
              }
              cout << ans << endl;
          }
       
          return;
      }
      signed main()
      {
          int _T = 1;
          cin >> _T;
          while (_T--)
          {
              solve();
          }
          return 0;
      }
      
      • 1

      Information

      ID
      1471
      Time
      1000ms
      Memory
      256MiB
      Difficulty
      8
      Tags
      (None)
      # Submissions
      53
      Accepted
      9
      Uploaded By