結果
| 問題 | 
                            No.2308 [Cherry 5th Tune B] もしかして、真?
                             | 
                    
| コンテスト | |
| ユーザー | 
                             | 
                    
| 提出日時 | 2023-05-19 21:52:02 | 
| 言語 | C++14  (gcc 13.3.0 + boost 1.87.0)  | 
                    
| 結果 | 
                             
                                AC
                                 
                             
                            
                         | 
                    
| 実行時間 | 191 ms / 2,000 ms | 
| コード長 | 1,958 bytes | 
| コンパイル時間 | 3,696 ms | 
| コンパイル使用メモリ | 233,560 KB | 
| 実行使用メモリ | 12,672 KB | 
| 最終ジャッジ日時 | 2024-12-18 02:35:51 | 
| 合計ジャッジ時間 | 12,139 ms | 
| 
                            ジャッジサーバーID (参考情報)  | 
                        judge4 / judge2 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| other | AC * 39 | 
ソースコード
#include <bits/stdc++.h>
#include <atcoder/all>
using namespace atcoder;
using namespace std;
using ll = long long;
using S = pair<int,int>;
S op(S lhs, S rhs){
    if(rhs.second == 0) return S({lhs.first & rhs.first, lhs.second});
    if(rhs.second == 1) return S({lhs.first | rhs.first, lhs.second});
    if(rhs.second == 2) return S({lhs.first ^ rhs.first, lhs.second});
    if(lhs.first == 1) return S({rhs.first, lhs.second});
    return make_pair(1, lhs.second);
}
S e(){
    return S({1, 0});
}
int op2(int f, int x){return x + f;}
int e2(){return 0;}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    int T;
    cin >> T;
    auto f = [&](int u, int v, int op){
        if(op == 0) return u & v;
        if(op == 1) return u | v;
        if(op == 2) return u ^ v;
        if(u == 1) return v;
        return 1;
    };
    //and or xor imp
    auto g = [&](string s){
        if(s == "and") return 0;
        if(s == "or") return 1;
        if(s == "xor") return 2;
        if(s == "True") return 1;
        if(s == "False") return 0;
        return 3;
    };
    while(T--){
        int n;
        cin >> n;
        vector<pair<int,int>> b(n, e());
        vector<int> c(n);
        for(int i = 0; i < n; i++){
            string s;
            cin >> s;
            b[i].first = g(s);
        }
        for(int i = 1; i < n; i++){
            string s;
            cin >> s;
            b[i].second = g(s);
        }
        segtree<S, op, e> seg(b);
        segtree<int, op2, e2> seg2(vector<int>(n, 1));
        for(int i = 0; i + 1 < n; i++){
            int v2;
            cin >> v2;
            int p = seg2.max_right(0, [&](int v){return v < v2;});
            int p2 = seg2.max_right(0, [&](int v){return v < v2 + 1;});
            seg2.set(p2, 0);
            seg.set(p, op(seg.get(p), seg.get(p2)));
            seg.set(p2, e());
        }
        cout << (seg.all_prod().first == 1 ? "True" : "False") << '\n';
    }
}