# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
691482 | NemanjaSo2005 | Paint By Numbers (IOI16_paint) | C++14 | 0 ms | 0 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include<bits/stdc++.h>
#define ll long long
using namespace std;
string S;
int C[105],N,K;
int pbela[200005];
bool pref[200005][105],suf[200005][105],bela[200005];
void calcdp(){
for(int i=1;i<=N;i++)
bela[i]=(S[i]=='_');
pbela[0]=0;
for(int i=1;i<=N;i++)
pbela[i]=pbela[i-1]+bela[i];
pref[0][0]=1;
suf[N+1][K]=1;
for(int i=1;i<=N;i++){
pref[i][0]=1;
for(int j=1;j<=K;j++){
if(i-C[j]<0)
break;
if(pbela[i]-pbela[i-C[j]]>0)
continue;
if(S[i-C[j]]=='X')
continue;
if(i-C[j]-1>=0)
dp[i][j]=dp[i-C[j]-1][j-1];
else
dp[i][j]=1;
}
for(int j=1;j<=K;j++)
if(pref[i-1][j]==1)
pref[i][j]=1;
}
///Suf[i][K] - Znaci da si postavio sve blokove iznad K, tj 0
for(int i=N;i>=1;i--){
suf[i][K]=1;
for(int j=1;j<=K;j++){
if(i-C[j]<0)
break;
if(pbela[i]-pbela[i-C[j]]>0)
continue;
if(S[i-C[j]]=='X')
continue;
if(i-C[j]-1>=0)
dp[i][j]=dp[i-C[j]-1][j-1];
else
dp[i][j]=1;
}
for(int j=1;j<=K;j++)
if(pref[i-1][j]==1)
pref[i][j]=1;
}
}
string solve_puzzle(string s, vector<int> c){
N=s.size();
K=c.size();
for(int i=1;i<=K;i++)
C[i]=c[i-1];
S="."+s+".....";
calcdp();
}
#include "paint.h"
#include <vector>
#include <string>
#include <cstdio>
#include <cassert>
const int S_MAX_LEN = 200 * 1000;
char buf[S_MAX_LEN + 1];
int main() {
assert(1 == scanf("%s", buf));
std::string s = buf;
int c_len;
assert(1 == scanf("%d", &c_len));
std::vector<int> c(c_len);
for (int i = 0; i < c_len; i++) {
assert(1 == scanf("%d", &c[i]));
}
std::string ans = solve_puzzle(s, c);
printf("%s\n", ans.data());
return 0;
}