제출 #538040

#제출 시각아이디문제언어결과실행 시간메모리
538040pavementPaint By Numbers (IOI16_paint)C++17
100 / 100
1501 ms35156 KiB
#include "paint.h"
#include <bits/stdc++.h>
#pragma comment(linker, "/stack:200000000")
#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,avx2,tune=native")
using namespace std;

typedef pair<int, int> ii;
#define mp make_pair

int W[200005], B[200005], cov[200005];
bitset<200005> cb, cw;
bitset<105> rdy[200005], mem[200005], rdy2[200005], mem2[200005];
vector<int> c;
string s;

bool dp(int n, int k) {
	if (n <= -1) return k == -1;
	if (k == -1) return B[n] == 0;
	if (rdy[n][k]) return mem[n][k];
	bool ret = 0;
	if (s[n] != 'X') ret |= dp(n - 1, k);
	if (k == 0 && n + 1 >= c[k] && W[n] - (n - c[k] < 0 ? 0 : W[n - c[k]]) == 0 && (n - c[k] >= 0 ? !B[n - c[k]] : 1)) ret |= 1;
	else if (k && n + 1 >= c[k] && W[n] - (n - c[k] < 0 ? 0 : W[n - c[k]]) == 0 && (n - c[k] >= 0 ? s[n - c[k]] != 'X' : 1)) ret |= dp(n - c[k] - 1, k - 1);
	rdy[n][k] = 1;
	return mem[n][k] = ret;
}

bool dp2(int n, int k) {
	if (n >= s.size()) return k == c.size();
	if (k == c.size()) return B[s.size() - 1] - (n == 0 ? 0 : B[n - 1]) == 0;
	if (rdy2[n][k]) return mem2[n][k];
	bool ret = 0;
	if (s[n] != 'X') ret |= dp2(n + 1, k);
	if (k == c.size() - 1 && n + c[k] - 1 < s.size() && W[n + c[k] - 1] - (n == 0 ? 0 : W[n - 1]) == 0 && B[s.size() - 1] - B[n + c[k] - 1] == 0) ret |= 1;
	else if (k != c.size() - 1 && n + c[k] - 1 < s.size() && W[n + c[k] - 1] - (n == 0 ? 0 : W[n - 1]) == 0 && (n + c[k] < s.size() ? s[n + c[k]] != 'X' : 1)) ret |= dp2(n + c[k] + 1, k + 1);
	rdy2[n][k] = 1;
	return mem2[n][k] = ret;
}

string solve_puzzle(string s, vector<int> c) {
	::s = s;
	::c = c;
	for (int i = 0; i < s.size(); i++) {
		if (i) W[i] = W[i - 1];
		if (i) B[i] = B[i - 1];
		W[i] += (s[i] == '_');
		B[i] += (s[i] == 'X');
	}
	string ret = s;
	for (int i = 0; i < s.size(); i++) {
		if (s[i] != '.') continue;
		for (int j = -1; j < (int)c.size(); j++)
			if (dp(i - 1, j) && dp2(i + 1, j + 1)) cw[i] = 1;
	}
	for (int i = 0; i < c.size(); i++)
		for (int j = 0; j < s.size() - c[i] + 1; j++) {
			bool tmp = 0;
			if (W[j + c[i] - 1] - (j == 0 ? 0 : W[j - 1]) == 0 && (i && j ? s[j - 1] != 'X' : 1) && (i != c.size() - 1 && j != s.size() - 1 ? s[j + c[i]] != 'X' : 1)) {
				tmp = 1;
				if (i && !dp(j - 2, i - 1)) tmp = 0;
				if (i != c.size() - 1 && !dp2(j + c[i] + 1, i + 1)) tmp = 0;
			}
			if (i == 0 && j > 0 && B[j - 1]) tmp = 0;
			if (i == c.size() - 1 && B[s.size() - 1] - B[j + c[i] - 1]) tmp = 0;
			if (tmp) {
				cov[j]++;
				cov[j + c[i]]--;
			}
		}
	for (int i = 0, tot = 0; i < s.size(); i++) {
		tot += cov[i];
		if (tot) cb[i] = 1;
	}
	for (int i = 0; i < s.size(); i++) {
		if (ret[i] != '.') continue;
		if (cw[i] && cb[i]) ret[i] = '?';
		else if (cw[i]) ret[i] = '_';
		else {
			assert(cb[i]);
			ret[i] = 'X';
		}
	}
	return ret;
}

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

paint.cpp:3: warning: ignoring '#pragma comment ' [-Wunknown-pragmas]
    3 | #pragma comment(linker, "/stack:200000000")
      | 
paint.cpp: In function 'bool dp2(int, int)':
paint.cpp:31:8: warning: comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   31 |  if (n >= s.size()) return k == c.size();
      |      ~~^~~~~~~~~~~
paint.cpp:31:30: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   31 |  if (n >= s.size()) return k == c.size();
      |                            ~~^~~~~~~~~~~
paint.cpp:32:8: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   32 |  if (k == c.size()) return B[s.size() - 1] - (n == 0 ? 0 : B[n - 1]) == 0;
      |      ~~^~~~~~~~~~~
paint.cpp:36:8: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   36 |  if (k == c.size() - 1 && n + c[k] - 1 < s.size() && W[n + c[k] - 1] - (n == 0 ? 0 : W[n - 1]) == 0 && B[s.size() - 1] - B[n + c[k] - 1] == 0) ret |= 1;
      |      ~~^~~~~~~~~~~~~~~
paint.cpp:36:40: warning: comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   36 |  if (k == c.size() - 1 && n + c[k] - 1 < s.size() && W[n + c[k] - 1] - (n == 0 ? 0 : W[n - 1]) == 0 && B[s.size() - 1] - B[n + c[k] - 1] == 0) ret |= 1;
      |                           ~~~~~~~~~~~~~^~~~~~~~~~
paint.cpp:37:13: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   37 |  else if (k != c.size() - 1 && n + c[k] - 1 < s.size() && W[n + c[k] - 1] - (n == 0 ? 0 : W[n - 1]) == 0 && (n + c[k] < s.size() ? s[n + c[k]] != 'X' : 1)) ret |= dp2(n + c[k] + 1, k + 1);
      |           ~~^~~~~~~~~~~~~~~
paint.cpp:37:45: warning: comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   37 |  else if (k != c.size() - 1 && n + c[k] - 1 < s.size() && W[n + c[k] - 1] - (n == 0 ? 0 : W[n - 1]) == 0 && (n + c[k] < s.size() ? s[n + c[k]] != 'X' : 1)) ret |= dp2(n + c[k] + 1, k + 1);
      |                                ~~~~~~~~~~~~~^~~~~~~~~~
paint.cpp:37:119: warning: comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   37 |  else if (k != c.size() - 1 && n + c[k] - 1 < s.size() && W[n + c[k] - 1] - (n == 0 ? 0 : W[n - 1]) == 0 && (n + c[k] < s.size() ? s[n + c[k]] != 'X' : 1)) ret |= dp2(n + c[k] + 1, k + 1);
      |                                                                                                              ~~~~~~~~~^~~~~~~~~~
paint.cpp: In function 'std::string solve_puzzle(std::string, std::vector<int>)':
paint.cpp:45:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   45 |  for (int i = 0; i < s.size(); i++) {
      |                  ~~^~~~~~~~~~
paint.cpp:52:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   52 |  for (int i = 0; i < s.size(); i++) {
      |                  ~~^~~~~~~~~~
paint.cpp:57:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   57 |  for (int i = 0; i < c.size(); i++)
      |                  ~~^~~~~~~~~~
paint.cpp:58:21: warning: comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   58 |   for (int j = 0; j < s.size() - c[i] + 1; j++) {
      |                   ~~^~~~~~~~~~~~~~~~~~~~~
paint.cpp:60:95: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   60 |    if (W[j + c[i] - 1] - (j == 0 ? 0 : W[j - 1]) == 0 && (i && j ? s[j - 1] != 'X' : 1) && (i != c.size() - 1 && j != s.size() - 1 ? s[j + c[i]] != 'X' : 1)) {
      |                                                                                             ~~^~~~~~~~~~~~~~~
paint.cpp:60:116: warning: comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   60 |    if (W[j + c[i] - 1] - (j == 0 ? 0 : W[j - 1]) == 0 && (i && j ? s[j - 1] != 'X' : 1) && (i != c.size() - 1 && j != s.size() - 1 ? s[j + c[i]] != 'X' : 1)) {
      |                                                                                                                  ~~^~~~~~~~~~~~~~~
paint.cpp:63:11: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   63 |     if (i != c.size() - 1 && !dp2(j + c[i] + 1, i + 1)) tmp = 0;
      |         ~~^~~~~~~~~~~~~~~
paint.cpp:66:10: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   66 |    if (i == c.size() - 1 && B[s.size() - 1] - B[j + c[i] - 1]) tmp = 0;
      |        ~~^~~~~~~~~~~~~~~
paint.cpp:72:29: warning: comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   72 |  for (int i = 0, tot = 0; i < s.size(); i++) {
      |                           ~~^~~~~~~~~~
paint.cpp:76:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   76 |  for (int i = 0; i < s.size(); i++) {
      |                  ~~^~~~~~~~~~
#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...