Submission #500967

#TimeUsernameProblemLanguageResultExecution timeMemory
500967aryan12Paint By Numbers (IOI16_paint)C++17
90 / 100
83 ms177028 KiB
#include "paint.h" #include <bits/stdc++.h> using namespace std; const long long MAXN = 2e5 + 10, MAXK = 110; long long canBlack[MAXN], canWhite[MAXN], dp[MAXN][MAXK]; string S; vector<long long> C; vector<long long> white; long long recur(long long s_idx, long long c_idx) { if(s_idx == S.size() && c_idx == C.size()) { //works return dp[s_idx][c_idx] = 1; } if(s_idx >= S.size() || c_idx > C.size()) { //out of bounds return 0; } if(dp[s_idx][c_idx] != -1) { return dp[s_idx][c_idx]; } dp[s_idx][c_idx] = 0; /* Conditions to make this block white: Current position shouldn't be black; Conditions to make the next Y blocks black: There shouldn't be a white block in between; The Y+1th block shouldn't be black The cur + Yth box should exist */ //to make the block white if(S[s_idx] != 'X') { long long ok = recur(s_idx + 1, c_idx); if(dp[s_idx + 1][c_idx] != 0) { canWhite[s_idx]++; canWhite[s_idx + 1]--; dp[s_idx][c_idx] += dp[s_idx + 1][c_idx]; } } //to make the next Y blocks black long long x = lower_bound(white.begin(), white.end(), s_idx) - white.begin(); long long f1 = 0; //so that cur + Y exists if(s_idx + C[c_idx] < S.size()) { f1++; } //for white not in between //assert(x <= white.size() && x >= 0); if(x == white.size() || white[x] >= s_idx + C[c_idx]) { f1++; } //for Y+1 not black //assert(s_idx + C[c_idx] < S.size()); if(s_idx + C[c_idx] == S.size() || S[s_idx + C[c_idx]] != 'X') { f1++; } if(f1 == 3) { //all conditions satisfied recur(s_idx + C[c_idx] + 1, c_idx + 1); if(dp[s_idx + C[c_idx] + 1][c_idx + 1] != 0) { canBlack[s_idx]++; canBlack[s_idx + C[c_idx]]--; canWhite[s_idx + C[c_idx]]++; canWhite[s_idx + C[c_idx] + 1]--; } dp[s_idx][c_idx] += dp[s_idx + C[c_idx] + 1][c_idx + 1]; } return dp[s_idx][c_idx]; } string solve_puzzle(string s, vector<int> c) { S = s; S += "_"; for(long long i = 0; i < S.size(); i++) { if(S[i] == '_') { white.push_back(i); } } for(long long i = 0; i < c.size(); i++) { C.push_back(c[i]); } long long n = s.size(), k = c.size(); for(long long i = 0; i <= n; i++) { for(long long j = 0; j <= k; j++) { dp[i][j] = -1; } } long long ok = recur(0, 0); /*for(long long i = 0; i < s.size(); i++) { for(long long j = 0; j < c.size(); j++) { cout << dp[i][j] << " "; } cout << "\n"; }*/ string ans = ""; for(long long i = 1; i <= n; i++) { canWhite[i] += canWhite[i - 1]; canBlack[i] += canBlack[i - 1]; } for(long long i = 0; i < n; i++) { if(canWhite[i] != 0 && canBlack[i] != 0) { ans += "?"; } else if(canWhite[i] != 0 && canBlack[i] == 0) { ans += "_"; } else { ans += "X"; } } return ans; return ""; }

Compilation message (stderr)

paint.cpp: In function 'long long int recur(long long int, long long int)':
paint.cpp:12:14: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   12 |     if(s_idx == S.size() && c_idx == C.size()) { //works
      |        ~~~~~~^~~~~~~~~~~
paint.cpp:12:35: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   12 |     if(s_idx == S.size() && c_idx == C.size()) { //works
      |                             ~~~~~~^~~~~~~~~~~
paint.cpp:15:14: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   15 |     if(s_idx >= S.size() || c_idx > C.size()) { //out of bounds
      |        ~~~~~~^~~~~~~~~~~
paint.cpp:15:35: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   15 |     if(s_idx >= S.size() || c_idx > C.size()) { //out of bounds
      |                             ~~~~~~^~~~~~~~~~
paint.cpp:34:19: warning: unused variable 'ok' [-Wunused-variable]
   34 |         long long ok = recur(s_idx + 1, c_idx);
      |                   ^~
paint.cpp:46:25: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   46 |     if(s_idx + C[c_idx] < S.size()) {
      |        ~~~~~~~~~~~~~~~~~^~~~~~~~~~
paint.cpp:51:10: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   51 |     if(x == white.size() || white[x] >= s_idx + C[c_idx]) {
      |        ~~^~~~~~~~~~~~~~~
paint.cpp:56:25: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   56 |     if(s_idx + C[c_idx] == S.size() || S[s_idx + C[c_idx]] != 'X') {
      |        ~~~~~~~~~~~~~~~~~^~~~~~~~~~~
paint.cpp: In function 'std::string solve_puzzle(std::string, std::vector<int>)':
paint.cpp:75:28: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   75 |     for(long long i = 0; i < S.size(); i++) {
      |                          ~~^~~~~~~~~~
paint.cpp:80:28: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   80 |     for(long long i = 0; i < c.size(); i++) {
      |                          ~~^~~~~~~~~~
paint.cpp:89:15: warning: unused variable 'ok' [-Wunused-variable]
   89 |     long long ok = recur(0, 0);
      |               ^~
#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...