# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
276973 | ElyesChaabouni | Paint By Numbers (IOI16_paint) | C++14 | 0 ms | 0 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
/*#pragma GCC optimize("O3")*/
#include<bits/stdc++.h>
//#include "paint.h"
//#include <ext/pb_ds/assoc_container.hpp>
//#include <ext/pb_ds/tree_policy.hpp>
//#define ordered_set tree<int, null_type,less<int >, rb_tree_tag,tree_order_statistics_node_update>
#define eps 1e-9
#define MOD1 998244353
#define MOD2 1000000007
#define INV_10 299473306
#define INF 1000000000
#define PI 3.14159265358979323846
using namespace std;
string solve_puzzle(string s, vector<int> c)
{
int n=s.length(), k=c.size();
int pr[n+1];
int mi=n, ma=0;
for(int i = 0;i < n+1; i++)
pr[i]=0;
for(int i = s.length()-1; i >= 0; i--)
{
if(s[i]=='_')
pr[i]=1;
if(s[i]=='X')
{
mi=min(mi, i);
ma=max(ma, i);
}
pr[i]+=pr[i+1];
}
/*for(int i = 0; i <= n; i++)
cout << pr[i] << ' ';
cout << '\n';*/
int dp[n+1][k+1];
for(int i = 0; i < n+1; i++)
for(int j = 0; j < k+1; j++)
dp[i][j]=0;
dp[n][k]=1;
for(int i = n-1; i >= 0; i--)
dp[i][k]=1+dp[i+1][k];
for(int i = k-1; i >= 0; i--)
{
for(int j = n-1; j >= 0; j--)
{
if(j+c[i]-1 < n && (i!=0 || i <= mi) && (i!=n-1 || i+c[j]-1 >= ma) && (j+c[i] == n || s[j+c[i]]!='X') && (j==0 || s[j-1]!='X') && pr[j]-pr[j+c[i]]==0 && ((i==k-1)||(j+c[i]+1 <= n && dp[j+c[i]+1][i+1] > 0)))
dp[j][i]=1;
dp[j][i]+=dp[j+1][i];
}
}
for(int i = 0; i < n; i++)
{
if(s[i]=='X')
{
for(int j = 0; j < k-1 && !done; j++)
{
if(dp[0][j]-dp[max(i-c[j]+1, 0)][j] > 0 && dp[i+1][j+1]-dp[n][j+1] > 0)
dp[i+1][j+1]=0;
}
}
}
for(int i = 0; i < k; i++)
{
int cu=10000000000;
for(int j = 0; j < n; j++)
{
cu=min(cu, dp[j][i]);
dp[j][i]=cu;
}
}
/*for(int i = 0; i <= k; i++)
{
for(int j = 0; j <= n; j++)
{
cout << dp[j][i] << ' ';
}
cout << '\n';
}*/
for(int i = 1; i < k; i++)
{
int sum=0;
for(int j = n-1; j >= 0; j--)
{
int x=dp[j][i];
dp[j][i]=dp[j+1][i];
if(x==sum+1)
{
sum++;
if(j-1-c[i-1] >= 0 && dp[0][i-1]-dp[j-1-c[i-1]+1][i-1] > 0)
dp[j][i]++;
}
}
}
for(int i = 0; i < n; i++)
{
bool done=0;
if(s[i]=='.')
{
for(int j = 0; j < k && !done; j++)
{
int pos=max(0, i-c[j]+1);
if(dp[pos][j]-dp[i+1][j] > 0)
done=1;
}
if(!done)
{
s[i]='_';
}
else
{
done=0;
if((dp[0][k-1]-dp[max(i-c[k-1]+1, 0)][k-1] > 0 && i!=0) || (dp[i+1][0]-dp[n][0] > 0 && i!=n-1))
done=1;
for(int j = 0; j < k-1 && !done && i!=0 && i!=n-1; j++)
{
if(dp[0][j]-dp[max(i-c[j]+1, 0)][j] > 0 && dp[i+1][j+1]-dp[n][j+1] > 0)
done=1;
}
if(!done)
{
s[i]='X';
}
else
s[i]='?';
}
}
}
return s;
}
/*int main()
{
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
string s;
cin >> s;
int k;
cin >> k;
vector<int>v;
for(int i = 0; i < k; i++)
{
int x;
cin >> x;
v.push_back(x);
}
cout << solve_puzzle(s, v) << '\n';
}*/
//size