# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
192185 | FieryPhoenix | Paint By Numbers (IOI16_paint) | C++11 | 0 ms | 0 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <map>
#include <queue>
#include <set>
#include <iomanip>
#include <deque>
#include <cassert>
#include <ctime>
#include <cstring>
#include <cstdlib>
#include <chrono>
#include <ctime>
#include <random>
#include <stack>
#include <unordered_set>
#include <unordered_map>
#include <iterator>
#include <climits>
using namespace std;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
typedef long long ll;
typedef long double ld;
#define INF 2001001001
#define MOD 1000000007
int N,K,arr[105];
int earliest[105],latest[105];
int sum[200001];
int black[200005],white[200005];
int query(int l, int r){
return sum[r]-((l==0)?0:sum[l-1]);
}
string solve_puzzle(string s, vector<int>v){
N=s.length();
K=arr.size();
for (int i=0;i<K;i++)
arr[i+1]=v[i];
for (int i=0;i<N;i++){
if (s[i]=='_')
sum[i]++;
if (i>0) sum[i]+=sum[i-1];
}
int cur=1;
for (int i=0;i<N;i++){
if (query(i,i+arr[cur]-1)==0 && (i+arr[cur]==N || s[i+arr[cur]]!='B')){
earliest[cur]=i+arr[cur]-1;
i+=arr[cur];
cur++;
if (cur>K)
break;
}
}
cur=K;
for (int i=N-1;i>=0;i--){
if (query(i-arr[cur]+1,i)==0 && (i-arr[cur]==0 || s[i-arr[cur]]!='B')){
latest[cur]=i-arr[cur]+1;
i-=arr[cur];
cur--;
if (cur<0)
break;
}
}
earliest[0]=-2;
latest[K+1]=N+1;
for (int i=1;i<=K;i++){
int l=earliest[i-1]+2;
int r=latest[i+1]-2;
for (int j=l;j+arr[i]-1<=r;j++)
if (query(j,j+arr[i]-1)==0){
black[j]++;
black[j+arr[i]]--;
white[max(0,l-1)]++;
white[j]--;
white[j+arr[i]]++;
white[r+2]--;
}
}
for (int i=1;i<N;i++){
white[i]+=white[i-1];
black[i]+=black[i-1];
}
for (int i=0;i<N;i++)
if (s[i]=='.'){
if (white[i]==0)
s[i]='X';
else if (black[i]==0)
s[i]='_';
else
s[i]='?';
}
return s;
}