2 solutions

  • 0
    @ 2025-4-2 16:59:51
    #include <algorithm>
    #include <iostream>
    #include <set>
    #include <utility>
    #include <vector>
    using namespace std;
    
    int main() {
    	
        int N;
        cin >> N;
        vector<int> A(2 * N);
        for (auto& a : A) cin >> a;
    
        vector<vector<int>> pos(N + 1);
        for (int i = 0; i < 2 * N; i++) pos[A[i]].push_back(i);
    
        set<pair<int, int>> ans;
        for (int i = 0; i + 1 < 2 * N; i++) 
    	{
          int a = A[i], b = A[i + 1];
          if (pos[a][0] + 1 == pos[a][1]) continue;
          if (pos[b][0] + 1 == pos[b][1]) continue;
          vector<int> v{pos[a][0], pos[a][1], pos[b][0],pos[b][1]};
          sort(begin(v), end(v));
          if (v[0] + 1 == v[1] and v[2] + 1 == v[3]) {
          	if(a > b) swap(a,b);
    		ans.insert({a,b});
          }
        }
        cout << ans.size() << "\n";
      
    }
    
    • 0
      @ 2025-4-1 18:19:00

      如果 (a,b)(a, b) 满足问题陈述中的条件,那么如何将它放入序列中呢?事实上,它仅限于:,a,b,,a,b,\dots, a, b, \dots, a, b, \dots

      ,a,b,,b,a,.\dots, a, b, \dots, b, a, \dots.

      由此可见,问题陈述中的条件等价于以下条件:

      AA 中, aa 的出现次数不相邻。 在 AA 中, bb 的出现次数不相邻。 设 pa,1,pa,2p_{a,1}, p_{a,2}aaAA 中的位置。 pb,1,pb,2p_{b,1}, p_{b,2}bbAA 中的位置。

      v=(v1,v2,v3,v4)v = (v_1, v_2, v_3, v_4) 是按升序排序的序列 (pa,1,pa,2,pb,1,pb,2)(p_{a,1}, p_{a,2}, p_{b,1}, p_{b,2})

      如果 (a,b)(a, b) 是合法的对,则 v1+1=v2v_1 + 1 = v_2v3+1=v4v_3 + 1 = v_4

      因此,我们可以通过检查所有 (Ai,Ai+1)(A_i, A_{i+1})1i2N1,AiAi+11 \leq i \leq 2N-1, A_i \neq A_{i+1} 的上述标准来计算所有符合条件的配对 (a,b)(a, b) 。(注意,同一配对 (a,b)(a, b) 不应重复计算。)检查一对配对的标准需要花费 O(1)\mathrm{O}(1) 个时间,因此解决问题总共需要 O(N)\mathrm{O}(N) 个时间,这已经足够快了。

      • 1

      Information

      ID
      1447
      Time
      2000ms
      Memory
      256MiB
      Difficulty
      7
      Tags
      (None)
      # Submissions
      44
      Accepted
      11
      Uploaded By