Problem p02652 (C++) — buggy submission, verdict: Time Limit Exceeded

#include <bits/stdc++.h>

#define all(x) (x).begin(), (x).end()
#define itn int
#define make_unique(x)                                                         \\
  sort((x).begin(), (x).end());                                                \\
  (x).erase(unique((x).begin(), (x).end()), (x).end())

using namespace std;

inline int nxt() {
  int x;
  scanf("%d", &x);
  return x;
}

void remin(int &x, int y) { x = min(x, y); }

void remax(int &x, int y) { x = max(x, y); }

bool is_small(int x) { return x < 1e7; }

struct State {
  int len;
  int minx, maxx;

  bool operator<(const State &ot) const {
    if (len != ot.len) {
      return len < ot.len;
    } else {
      return minx < ot.minx;
    }
  }
};

bool isCovered(const State &st, int x, int y) {
  if (x + y == st.len) {
    return x % 2 == st.minx % 2 && x >= st.minx && x <= st.maxx;
  } else {
    return x + y > st.len && x >= st.minx && y >= st.len - st.maxx;
  }
}

int main() {
  ios_base::sync_with_stdio(false);
  string s;
  cin >> s;

  vector<State> a = {{0, 0, 0}};
  for (char c : s) {
    vector<State> tmp;
    if (c != '1') {
      for (auto st : a) {
        if (st.minx > 0) {
          tmp.push_back({st.len, st.minx - 1, st.maxx - 1});
        } else {
          if (st.minx != st.maxx) {
            tmp.push_back({st.len, st.minx + 1, st.maxx - 1});
          }
          tmp.push_back({st.len + 1, 0, 0});
        }
      }
    }
    if (c != '0') {
      for (auto st : a) {
        if (st.maxx < st.len) {
          tmp.push_back({st.len, st.minx + 1, st.maxx + 1});
        } else {
          if (st.minx != st.maxx) {
            tmp.push_back({st.len, st.minx + 1, st.maxx - 1});
          }
          tmp.push_back({st.len + 1, st.len + 1, st.len + 1});
        }
      }
    }
    sort(all(tmp));
    a.clear();
    for (auto s : tmp) {
      for (const auto &t : a) {
        if (isCovered(t, s.minx, s.len - s.minx) &&
            isCovered(t, s.maxx, s.len - s.maxx)) {
          s.minx = s.maxx + 2;
          break;
        }
        if (isCovered(t, s.minx, s.len - s.minx)) {
          int l = 0, r = (s.maxx - s.minx) / 2;
          while (r > l + 1) {
            int m = (l + r) / 2;
            int x = s.minx + 2 * m;
            int y = s.len - x;
            if (isCovered(t, x, y)) {
              l = m;
            } else {
              r = m;
            }
          }
          s.minx += 2 * r;
        } else if (isCovered(t, s.maxx, s.len - s.maxx)) {
          int l = 0, r = (s.maxx - s.minx) / 2;
          while (r > l + 1) {
            int m = (l + r) / 2;
            int x = s.maxx - 2 * m;
            int y = s.len - x;
            if (isCovered(t, x, y)) {
              l = m;
            } else {
              r = m;
            }
          }
          s.maxx -= 2 * r;
        }
      }
      if (s.minx <= s.maxx) {
        if (!a.empty() && a.back().len == s.len &&
            a.back().maxx + 2 == s.minx) {
          a.back().maxx = s.maxx;
        } else if ((int)a.size() > 1 && a[(int)a.size() - 2].len == s.len &&
                   a[(int)a.size() - 2].maxx + 2 == s.minx) {
          a[(int)a.size() - 2].maxx = s.maxx;
        } else {
          a.push_back(s);
        }
      }
    }
    // cerr << c;
    // if (a.size() > 3) {
    // 	cerr << "\\n";
    // 	return 0;
    // }
    // for (auto s : a) {
    // 	cerr << "(" << s.len << ", " << s.minx << " " << s.maxx << ") ";
    // }
    // cerr << "\\n";
    // if (a.size() > 3) {
    // 	return 0;
    // }
  }
  int ans = 1e8;
  for (auto s : a) {
    ans = min(ans, s.len);
  }
  cout << ans << "\\n";

  return 0;
}


Error: TLE

Fixed submission:

#include <bits/stdc++.h>

#define all(x) (x).begin(), (x).end()
#define itn int
#define make_unique(x)                                                         \\
  sort((x).begin(), (x).end());                                                \\
  (x).erase(unique((x).begin(), (x).end()), (x).end())

using namespace std;

inline int nxt() {
  int x;
  scanf("%d", &x);
  return x;
}

void remin(int &x, int y) { x = min(x, y); }

void remax(int &x, int y) { x = max(x, y); }

bool is_small(int x) { return x < 1e7; }

struct State {
  int len;
  int minx, maxx;

  bool operator<(const State &ot) const {
    if (len != ot.len) {
      return len < ot.len;
    } else {
      return minx < ot.minx;
    }
  }
};

bool isCovered(const State &st, int x, int y) {
  if (x + y == st.len) {
    return x % 2 == st.minx % 2 && x >= st.minx && x <= st.maxx;
  } else {
    return x + y > st.len && x >= st.minx && y >= st.len - st.maxx;
  }
}

int main() {
  ios_base::sync_with_stdio(false);
  string s;
  cin >> s;

  vector<State> a = {{0, 0, 0}};
  for (char c : s) {
    vector<State> tmp;
    if (c != '1') {
      for (auto st : a) {
        if (st.minx > 0) {
          tmp.push_back({st.len, st.minx - 1, st.maxx - 1});
        } else {
          if (st.minx != st.maxx) {
            tmp.push_back({st.len, st.minx + 1, st.maxx - 1});
          }
          tmp.push_back({st.len + 1, 0, 0});
        }
      }
    }
    if (c != '0') {
      for (auto st : a) {
        if (st.maxx < st.len) {
          tmp.push_back({st.len, st.minx + 1, st.maxx + 1});
        } else {
          if (st.minx != st.maxx) {
            tmp.push_back({st.len, st.minx + 1, st.maxx - 1});
          }
          tmp.push_back({st.len + 1, st.len + 1, st.len + 1});
        }
      }
    }
    sort(all(tmp));
    a.clear();
    for (auto s : tmp) {
      while (s.minx <= s.maxx) {
        bool cov = false;
        for (auto t : a) {
          if (isCovered(t, s.minx, s.len - s.minx)) {
            cov = true;
            break;
          }
        }
        if (cov) {
          s.minx += 2;
        } else {
          break;
        }
      }
      while (s.minx <= s.maxx) {
        bool cov = false;
        for (auto t : a) {
          if (isCovered(t, s.maxx, s.len - s.maxx)) {
            cov = true;
            break;
          }
        }
        if (cov) {
          s.maxx -= 2;
        } else {
          break;
        }
      }
      if (s.minx <= s.maxx) {
        if (!a.empty() && a.back().len == s.len &&
            a.back().maxx + 2 == s.minx) {
          a.back().maxx = s.maxx;
        } else if ((int)a.size() > 1 && a[(int)a.size() - 2].len == s.len &&
                   a[(int)a.size() - 2].maxx + 2 == s.minx) {
          a[(int)a.size() - 2].maxx = s.maxx;
        } else {
          a.push_back(s);
        }
      }
    }
    assert((int)a.size() <= 3);
    // cerr << c;
    // if (a.size() > 3) {
    // 	cerr << "\\n";
    // 	return 0;
    // }
    // for (auto s : a) {
    // 	cerr << "(" << s.len << ", " << s.minx << " " << s.maxx << ") ";
    // }
    // cerr << "\\n";
    // if (a.size() > 3) {
    // 	return 0;
    // }
  }
  int ans = 1e8;
  for (auto s : a) {
    ans = min(ans, s.len);
  }
  cout << ans << "\\n";

  return 0;
}