Submission #712550

#TimeUsernameProblemLanguageResultExecution timeMemory
712550nekiPaint By Numbers (IOI16_paint)C++14
Compilation error
0 ms0 KiB
#include "paint.h"
 
#include <bits/stdc++.h>
using namespace std;
const int mn = 200100;
const int mk = 110;
bool dl[mk][mn], dr[mk][mn];
int ps[mn], cX[mn], c_[mn];
string solve_puzzle(std::string s, std::vector<int> c)
{
    const int n = s.size(), k = c.size();
    for (int i = n - 1; i >= 0; --i)
        ps[i] = ps[i + 1] + (s[i] == '_');
 
    for (int b = 0; b < k; ++b)
    {
        bool can = 0;
        for (int i = 0; i < n; ++i)
            if (i - c[b] + 1 >= 0)
            {
                if (b == 0)
                {
                    if (i - c[b] >= 0 && s[i - c[b]] == 'X')
                        break;
                    if (ps[i - c[b] + 1] - ps[i + 1] == 0)
                        dl[b][i] = 1;
                }
                else if (i - c[b] - 1 >= 0)
                {
                    if (s[i - c[b]] == 'X')
                        can = 0;
                    if (s[i - c[b]] != 'X' && dl[b - 1][i - c[b] - 1])
                        can = 1;
                    if (can && ps[i - c[b] + 1] - ps[i + 1] == 0)
                        dl[b][i] = 1;
                }
            }
    }
 
    for (int b = k - 1; b >= 0; --b)
    {
        bool can = 0;
        for (int i = n - 1; i >= 0; --i)
            if (i + c[b] - 1 < n)
            {
                if (b == k - 1)
                {
                    if (i + c[b] < n && s[i + c[b]] == 'X')
                        break;
                    if (ps[i] - ps[i + c[b]] == 0)
                        dr[b][i] = 1;
                }
                else if (i + c[b] + 1 >= 0)
                {
                    if (s[i + c[b]] == 'X')
                        can = 0;
                    if (s[i + c[b]] != 'X' && dr[b + 1][i + c[b] + 1])
                        can = 1;
                    if (can && ps[i] - ps[i + c[b]] == 0)
                        dr[b][i] = 1;
                }
            }
    }
 
    /*cout << "k:" << k << endl;
    for (int b = 0; b < k; ++b)
    {
        cout << b << ": " << endl;
        for (int i = 0; i < n; ++i)
            cout << dr[b][i] << " ";
        cout << endl;
    }*/
 
    for (int b = 0; b < k; ++b)
        for (int i = 0; i < n; ++i)
            if (i - c[b] + 1 >= 0 && dl[b][i] && dr[b][i - c[b] + 1])
                ++cX[i - c[b] + 1], --cX[i + 1];
    for (int i = 1; i < n; ++i)
        cX[i] += cX[i - 1];
 
    for (int b = 0; b < k; ++b)
    {
        for (int i = 0; i < n; ++i)
        {
            if (s[i] != 'X' && i && dl[b][i - 1])
                dl[b][i] = 1;
        }
        for (int i = n - 1; i >= 0; --i)
        {
            if (s[i] != 'X' && i + 1 < n && dr[b][i + 1])
                dr[b][i] = 1;
        }
    for(int b = 0; b < k; ++b)
    {
        for (int i = 0; i < n; ++i)
            if (b + 1 < k && i - 1 >= 0 && i + 1 < n && dl[b][i - 1] && dr[b + 1][i + 1] && s[i] != 'X')
                ++c_[i];
    }
    for (int i = n - 1; i >= 0; --i)
    {
        if (s[i] == 'X')
            break;
        if (i - 1 >= 0 && dl[k - 1][i - 1])
            ++c_[i];
    }
    for (int i = 0; i < n; ++i)
    {
        if (s[i] == 'X')
            break;
        if (i + 1 < n && dr[0][i + 1])
            ++c_[i];
    }
 
    string ans(n, '.');
    for (int i = 0; i < n; ++i)
        ans[i] = (cX[i] && c_[i] ? '?' : cX[i] ? 'X'
                                               : '_');
 
    return ans;
}

Compilation message (stderr)

paint.cpp: In function 'std::string solve_puzzle(std::string, std::vector<int>)':
paint.cpp:120:1: error: expected '}' at end of input
  120 | }
      | ^
paint.cpp:10:1: note: to match this '{'
   10 | {
      | ^
paint.cpp:120:1: warning: control reaches end of non-void function [-Wreturn-type]
  120 | }
      | ^