# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
276012 | brcode | Paint By Numbers (IOI16_paint) | C++14 | 1 ms | 512 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <iostream>
#include <bits/stdc++.h>
#include "paint.h"
using namespace std;
const int MAXN = 1000;
vector<vector<int>> res;
vector<int> c;
int pref[MAXN];
bool dp[MAXN][250];
int l[250];
int r[250];
bool zero[250];
string solve_puzzle(string s,vector<int> v1){
int k = v1.size();
int n = s.length();
s = '#'+s;
for(int i=1;i<=n;i++){
pref[i] = pref[i-1]+(s[i] == '_');
}
c.push_back(0);
for(int x:v1){
c.push_back(x);
}
for(int i=0;i<=n;i++){
dp[i][0] = true;
}
for(int j=1;j<=(int)v1.size();j++){
for(int i=1;i<=n;i++){
if(j!=1 && i-c[j]-1<0){
dp[i][j] = false;
continue;
}
int lim = i-c[j]-1;
if(j==1 && lim == -1){
lim++;
}
if(pref[i]!=pref[i-c[j]]){
dp[i][j] = false;
continue;
}
for(int ind = lim;ind>=0;ind--){
if(dp[ind][j-1] == true){
dp[i][j] = true;
break;
}
}
}
}
//cout<<dp[1][3]<<endl;
int m = v1.size();
for(int i=n;i>=1;i--){
if(dp[i][m]){
r[m] = i;
break;
}
}
for(int i=1;i<=n;i++){
if(dp[i][m]){
l[m] = i;
break;
}
}
string res="";
for(int i=0;i<n;i++){
res+='?';
}
for(int i=l[m];i>=r[m]-c[m]+1;i--){
res[i-1] = 'X';
}
for(int i=n;i>=r[m]+1;i--){
res[i-1] = '_';
}
for(int i=l[m]-c[m]+1;i<=r[m];i++){
bool ok = false;
for(int j=i;j<=min(i+c[m]-1,r[m]);j++){
ok|=dp[j][m];
}
if(ok){
// cout<<i<<endl;
zero[i] = true;
}
}
//cout<<dp[8][1]<<endl;
//cout<<l[m]<<" "<<r[m]<<endl;
for(int i=m-1;i>=1;i--){
int lim = r[i+1]-c[i+1]-1;
for(int j=lim;j>=0;j--){
if(dp[j][i]){
r[i] = j;
break;
}
}
for(int j=1;j<=lim;j++){
if(dp[j][i]){
l[i] = j;
break;
}
}
for(int j=l[i];j>=r[i]-c[i]+1;j--){
res[j-1] = 'X';
}
for(int j=l[i]-c[i]+1;j<=r[i];j++){
bool ok = false;
for(int ind = j;ind<=min(j+c[i]-1,r[i]);ind++){
ok|=dp[ind][i];
}
if(ok){
zero[j] = true;
}
}
}
for(int i=1;i<=l[1]-c[1];i++){
res[i-1] = '_';
}
for(int i=1;i<=n;i++){
if(!zero[i]){
res[i-1] = '_';
}
}
return res;
}
/*int main(){
vector<int> tmp;
tmp.push_back(3);
cout<<solve_puzzle("..._._....", tmp)<<endl;
}*/
Compilation message (stderr)
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |