제출 #227865

#제출 시각아이디문제언어결과실행 시간메모리
227865quocnguyen1012parentrises (BOI18_parentrises)C++14
100 / 100
217 ms19160 KiB
#include <bits/stdc++.h>

#define all(v) (v).begin(), (v).end()
#define sortv(v) sort(all(v))
#define uniqv(v) (v).erase(unique(all(v)), (v).end())
#define pb push_back
#define FI first
#define SE second
#define lb lower_bound
#define ub upper_bound
#define mp make_pair
#define test 0
#define TEST if(test)
#define ii pair<int, int>
#define fi first
#define se second
#define eb emplace_back

using namespace std;

typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef vector<int> vi;

const ll MOD = 1000000007; // 998244353
const int INF = 2e9;
const ll INFLL = 1e18;
const int MAX_N = 300;

int P, T, N;
string str;
vector<pii> vt;
vector<int> ans;

vector<pii> query;
ll answer[MAX_N+1];
ll dp[2][MAX_N+1][MAX_N*3+1];

void solve(void)
{
  string str; cin >> str;
  int n = str.size();
  vector<ii> sum;
  if(str[0] == ')'){
    cout << "impossible\n";
    return;
  }
  bool ok = true;
  sum.eb(1, 2);
  for(int i = 1; i < n; ++i){
    auto now = sum.back();
    if(str[i] == '('){
      now.fi++; now.se += 2;
    }
    else{
      now.fi -= 2; now.se--;
    }
    if(now.se < 0){
      ok = false;
      break;
    }
    now.fi = max(now.fi, 0);
    sum.eb(now);
  }
  if(sum.back().fi != 0)
    ok = false;
  if(!ok){
    cout << "impossible\n";
    return;
  }
  //for(auto it : sum) cerr << it.fi << ' ' << it.se << '\n';
  int suf = 0, num1 = 0, num2 = 0;
  vector<int> ans;
  for(int i = n - 1; i >= 0; --i){
    //cerr << suf << ' ';
    if(i == 0){
      if(suf == 2){
        ans.eb(3);
      }
      else{
        if(num1 > 0) ans.eb(1);
        else ans.eb(2);
      }
    }
    else{
      auto need = sum[i - 1];
      if(str[i] == '('){
        if(need.fi <= suf - 1 && suf - 1 <= need.se){
          suf--;
          if(num2 > num1){
            ans.eb(2); --num2;
          }
          else{
            ans.eb(1); --num1;
          }
        }
        else{
          suf -= 2;
          ans.eb(3);
          --num1; --num2;
        }
      }
      else{
        if(need.fi <= suf + 1 && suf + 1 <= need.se){
          ++suf;
          if(num2 > num1){
            ans.eb(1); ++num1;
          }
          else{
            ans.eb(2); ++num2;
          }
        }
        else{
          suf += 2;
          ans.eb(3);
          ++num1; ++num2;
        }
      }
    }
  }
  for(int i = n - 1; i >= 0; --i){
    if(ans[i] == 3){
      cout << 'G';
    }
    else if(ans[i] == 1){
      cout << 'R';
    }
    else{
      cout << 'B';
    }
  }
  cout << '\n';
}

int main(){
	#ifdef LOCAL
    freopen("A.INP", "r", stdin);
    freopen("A.OUT", "w", stdout);
  #endif // LOCAL
	scanf("%d%d", &P, &T);
	if(P==1){
		while(T--){
			solve();
		}
	}else{
		for(int i=0; i<T; i++){
			scanf("%d", &N);
			query.pb({N, i});
		}
		sort(query.begin(), query.end());
		dp[0][0][0] = 1LL;
		int idx = 0;
		for(int n=1; n<=MAX_N; n++){
			for(int i=0; i<n; i++){
				for(int j=0; j<=2*MAX_N; j++){
					dp[1][i+1][j+1] = (dp[1][i+1][j+1] + dp[0][i][j]) % MOD;
					if(i*2>=n-i)	dp[1][i][max(0, j-2)] = (dp[1][i][max(0, j-2)] + dp[0][i][j]) % MOD;
				}
			}
			TEST cout<<n<<endl;
			for(int i=0; i<=n; i++){
				for(int j=0; j<=2*MAX_N; j++){
					dp[0][i][j] = dp[1][i][j];
					dp[1][i][j] = 0LL;
					TEST{
						if(dp[0][i][j]!=0){
							cout<<i<<" "<<j<<" "<<dp[0][i][j]<<endl;
						}
					}
				}
			}
			ll sum = 0;
			for(int j=0; j<=n; j++){
				sum = (sum + dp[0][j][0]) % MOD;
			}
			while(idx<query.size() && query[idx].first==n){
				answer[query[idx].second] = sum;
				idx++;
			}
		}
		for(int i=0; i<T; i++){
			printf("%lld\n", answer[i]);
		}
	}
	return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

parentrises.cpp: In function 'int main()':
parentrises.cpp:177:13: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    while(idx<query.size() && query[idx].first==n){
          ~~~^~~~~~~~~~~~~
parentrises.cpp:141:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d%d", &P, &T);
  ~~~~~^~~~~~~~~~~~~~~~
parentrises.cpp:148:9: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
    scanf("%d", &N);
    ~~~~~^~~~~~~~~~
#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...