結果
| 問題 | 
                            No.2148 ひとりUNO
                             | 
                    
| コンテスト | |
| ユーザー | 
                             | 
                    
| 提出日時 | 2022-12-05 23:57:52 | 
| 言語 | C++17  (gcc 13.3.0 + boost 1.87.0)  | 
                    
| 結果 | 
                             
                                AC
                                 
                             
                            
                         | 
                    
| 実行時間 | 38 ms / 2,000 ms | 
| コード長 | 1,956 bytes | 
| コンパイル時間 | 1,890 ms | 
| コンパイル使用メモリ | 84,716 KB | 
| 最終ジャッジ日時 | 2025-02-09 05:32:42 | 
| 
                            ジャッジサーバーID (参考情報)  | 
                        judge1 / judge4 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| sample | AC * 1 | 
| other | AC * 39 | 
ソースコード
#include <array>
#include <iostream>
#include <vector>
#include <atcoder/dsu>
int main() {
    int t;
    std::cin >> t;
    while (t-- > 0) {
        int n;
        std::cin >> n;
        std::vector<std::vector<int>> nums(3);
        std::vector<std::vector<int>> cols(n);
        for (int i = 0; i < n; ++i) {
            char c;
            int d;
            std::cin >> c >> d;
            --d;
            int col = c == 'R' ? 0 : c == 'G' ? 1 : 2;
            nums[col].push_back(d);
            cols[d].push_back(col);
        }
        int c = 0;
        for (int i = 0; i < 3; ++i) {
            c += nums[i].size() != 0;
        }
        if (c == 1) {
            std::cout << "YES" << '\n';
            continue;
        }
        if (c == 2) {
            std::string ans = "NO";
            for (int i = 0; i < n; ++i) {
                if (cols[i].size() >= 2) {
                    ans = "YES";
                }
            }
            std::cout << ans << '\n';
            continue;
        }
        int cnt = 0;
        atcoder::dsu uf(3);
        for (int i = 0; i < n; ++i) {
            int siz = cols[i].size();
            for (int j = 0; j < siz - 1; ++j) {
                int c1 = cols[i][j];
                int c2 = cols[i][j + 1];
                uf.merge(c1, c2);
            }
            cnt += siz >= 2;
        }
        if (uf.groups().size() >= 2) {
            std::cout << "NO" << '\n';
            continue;
        }
        {
            bool ok = false;
            for (int i = 0; i < 3; ++i) {
                if (nums[i].size() == 1) {
                    ok = true;
                }
            }
            if (ok) {
                std::cout << "YES" << '\n';
                continue;
            }
        }
        if (cnt >= 2) {
            std::cout << "YES" << '\n';
            continue;
        } else {
            std::cout << "NO" << '\n';
            continue;
        }
    }
}