結果
| 問題 | 
                            No.2143 Only One Bracket
                             | 
                    
| コンテスト | |
| ユーザー | 
                             | 
                    
| 提出日時 | 2022-12-02 22:32:43 | 
| 言語 | C++17  (gcc 13.3.0 + boost 1.87.0)  | 
                    
| 結果 | 
                             
                                AC
                                 
                             
                            
                         | 
                    
| 実行時間 | 17 ms / 2,000 ms | 
| コード長 | 1,823 bytes | 
| コンパイル時間 | 2,556 ms | 
| コンパイル使用メモリ | 209,740 KB | 
| 最終ジャッジ日時 | 2025-02-09 04:01:23 | 
| 
                            ジャッジサーバーID (参考情報)  | 
                        judge4 / judge2 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| sample | AC * 1 | 
| other | AC * 7 | 
ソースコード
#include <bits/stdc++.h>
#define rep(i,n) for(int i = 0; i < (n); i++)
using namespace std;
using ll = long long;
using ld = long double;
int main(){
    cin.tie(0);
    ios::sync_with_stdio(0);
    auto is_valid = [&](vector<string> &S) {
        int N = S.size();
        sort(S.begin(), S.end());
        int cnt = 0;
        do {
            string T = "";
            rep(i,N) T += S[i];
            vector<int> A(T.size());
            rep(i,T.size()) A[i] = (T[i] == '(' ? +1 : -1);
            vector<int> sum(T.size() + 1);
            rep(i,T.size()) sum[i + 1] += sum[i] + A[i];
            int ok = 1;
            rep(i,T.size()) ok &= sum[i] >= 0;
            ok &= sum.back() == 0;
            if(ok) cnt++;
        } while(next_permutation(S.begin(), S.end()));
        return cnt == 1;
    };
    vector<string> S = {
        "",
        "",
        "()",
        "()()",
        "()(())()",
        "()(())(())()",
        "()(())((()))(())()",
        "()(())((()))((()))(())()",
        "()(())((()))(((())))((()))(())()"
    };
    int N; cin >> N;
    vector<string> ans;
    int p = 0;
    if(N % 2 == 0) {
        for(int i = 1; i <= N; i += 2) {
            ans.push_back("");
            rep(_,i) ans.back() += S[N][p++];
        }
        for(int i = N - 1; i >= 1; i -= 2) {
            ans.push_back("");
            rep(_,i) ans.back() += S[N][p++];
        }
    } else {
        for(int i = 1; i <= N - 2; i += 2) {
            ans.push_back("");
            rep(_,i) ans.back() += S[N][p++];
        }
        ans.push_back("");
        rep(_,N-1) ans.back() += S[N][p++];
        for(int i = N - 2; i >= 1; i -= 2) {
            ans.push_back("");
            rep(_,i) ans.back() += S[N][p++];
        }
    }
    if(is_valid(ans)) {
        for(auto s : ans) cout << s << "\n";
    }
}