제출 #1268598

#제출 시각아이디문제언어결과실행 시간메모리
1268598aegparentrises (BOI18_parentrises)C++20
100 / 100
165 ms19172 KiB
#include <bits/stdc++.h>
using namespace std;

#define int int64_t

constexpr int MOD = 1e9 + 7;
int p, t;

inline void solve() {
  string s;
  cin >> s;
  string ans;
  vector<pair<int, int>> rng(s.size() + 1, {0, 0});
  for (int i = 1; i <= s.size(); i++) {
    if (s[i - 1] == '(') {
      rng[i] = {rng[i - 1].first + 1, rng[i - 1].second + 2};
    } else {
      rng[i] = {max(rng[i - 1].first - 2, int(0)), rng[i - 1].second - 1};
      if (rng[i].second < 0)
        goto impossible;
    }
  }
  if (rng.back().first > 0)
    goto impossible;

  {
    bool lasti = false;
    bool lastj = false;
    int curd = 0;
    for (int i = s.size() - 1; i >= 0; i--) {
      if (s[i] == '(') {
        if (curd - 2 >= rng[i].first) {
          ans.push_back('G');
          curd -= 2;
        } else {
          ans.push_back(lasti ? 'B' : 'R');
          curd--;
          lasti = lasti ? false : true;
        }
      } else {
        if (curd + 2 <= rng[i].second) {
          curd += 2;
          ans.push_back('G');
        } else {
          ans.push_back(lastj ? 'B' : 'R');
          curd++;
          lastj = lastj ? false : true;
        }
      }
    }
  }

  reverse(ans.begin(), ans.end());
  cout << ans << '\n';

  return;
impossible:
  cout << "impossible\n";
  return;
}

inline void solve1() {
  while (t--)
    solve();
}

inline void solve2() {
  vector<vector<int>> dp1(610, vector<int>(610, 0));
  vector<vector<int>> dp2(610, vector<int>(610, 0));

  dp1[0][0] = 1;

  int cur = 0;

  auto iterate = [&]() -> void {
    for (int j = 0; j < 610; j++) {
      for (int k = j; k < 610; k++) {
        if (j + 2 < 610 && k + 1 < 610)
          dp2[j][k] += dp1[j + 2][k + 1];
        if (j == 0 && k + 1 < 610) {
          dp2[j][k] += dp1[j + 1][k + 1];
          dp2[j][k] += dp1[j][k + 1];
        }
        if (j - 1 >= 0 && k - 2 >= 0)
          dp2[j][k] += dp1[j - 1][k - 2];
        dp2[j][k] %= MOD;
      }
    }

    swap(dp1, dp2);
    for (int i = 0; i < 610; i++)
      fill(dp2[i].begin(), dp2[i].end(), 0);
    cur++;
  };

  vector<pair<int, int>> queries(t);
  vector<int> ans(t, 0);

  for (int i = 0; i < t; i++) {
    cin >> queries[i].first;
    queries[i].second = i;
  }

  sort(queries.begin(), queries.end());

  for (int i = 0; i < t; i++) {
    while (cur < queries[i].first)
      iterate();

    int anss = 0;
    for (int i = 0; i < 610; i++)
      anss += dp1[0][i];
    anss %= MOD;
    ans[queries[i].second] = anss;
  }

  copy(ans.begin(), ans.end(), ostream_iterator<int>(cout, "\n"));
}

signed main() {
  cin.tie(0)->sync_with_stdio(0);
  cin >> p >> t;
  if (p == 2)
    solve2();
  else
    solve1();
}
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...