제출 #1124191

#제출 시각아이디문제언어결과실행 시간메모리
1124191dynam1cHomework (CEOI22_homework)C++20
23 / 100
1101 ms120696 KiB
#include <bits/stdc++.h>
using namespace std;
int popcount(int x) { return __builtin_popcount(x); }
enum Type { Num, Min, Max };
struct Node {
  Type type;
  Node* left = nullptr;
  Node* right = nullptr;

  int eval(vector<int>::iterator& it) {
    if (type == Num)
      return *it++;
    int l = left->eval(it);
    int r = right->eval(it);
    if (type == Min)
      return min(l, r);
    return max(l, r);
  }
};
int main() {
  string s;
  cin >> s;
  int cur = 0;
  
  int n = 0;
  function<Node*()> parse = [&]() {
    if (s[cur] == '?') {
      n++;
      cur++;
      return new Node{Num};
    }
    Type type = s[cur+1] == 'i' ? Min : Max;
    cur += 4;
    Node* left = parse();
    cur += 1;
    Node* right = parse();
    cur += 1;
    return new Node{type, left, right};
  };

  Node* root = parse();
  vector<int> val(n);
  vector<bool> res(n);
  for (int i = 0; i < n; i++)
    for (int b = 0; b < (1<<n); b++) {
      for (int j = 0; j < n; j++)
        val[j] = b>>j&1 ? 2 : 0;
      val[i] = 1;
      auto it = val.begin();
      if (root->eval(it) == 1)
        res[popcount(b) - (b>>i&1)] = true;
    }
  cout << accumulate(res.begin(), res.end(), 0) << endl;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...