이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include "paint.h"
#define here cerr<<"===========================================\n"
#define dbg(x) cerr<<#x<<": "<<x<<endl;
#include <bits/stdc++.h>
#include <ext/pb_ds/tree_policy.hpp>
#include <ext/pb_ds/assoc_container.hpp>
#define ld double
#define ll int
#define llinf 100000000000000000LL // 10^17
#define pb push_back
#define popb pop_back
#define fi first
#define sc second
#define endl '\n'
#define pll pair<ll,ll>
#define pld pair<ld,ld>
#define sz(a) (ll)(a.size())
#define all(a) a.begin(),a.end()
#define ceri(a,l,r) {cerr<<#a<<": ";for(ll i_ = l;i_<=r;i_++) cerr<<a[i_]<< " ";cerr<<endl;}
#define cer(a) {cerr<<#a<<": ";for(ll x_ : a) cerr<<x_<< " ";cerr<<endl;}
#define daj_mi_malo_vremena ios_base::sync_with_stdio(false);cerr.tie(0);cout.tie(0);cin.tie(0);
using namespace std;
#define maxn 200005
#define maxk 105
ll n,k;
ll ps[maxn][2];
ll a[maxn];
ll v[maxk];
bool dp[maxn][maxk][2][2];
ll ok[maxn][2];
ll cnt[maxn];
string solve_puzzle(string s, vector<ll> c){
n = sz(s); k = sz(c);
for(ll i = 1;i<=k;i++) v[i] = c[i-1];
for(ll i = 1;i<=n;i++){
if(s[i-1]=='X') a[i] = 1;
else if(s[i-1]=='_') a[i] = 0;
else a[i] = 2;
}
for(ll e = 0;e<=1;e++){
for(ll i = 0;i<=n;i++) for(ll j = 0;j<=k;j++) for(ll r = 0;r<=1;r++) dp[i][j][r][e] = 0;
for(ll i = 0;i<=n;i++) for(ll j = 0;j<=1;j++) ps[i][j] = 0;
for(ll i = 1;i<=n;i++){
for(ll j = 0;j<=1;j++) ps[i][j] = ps[i-1][j];
if(a[i]!=2) ps[i][a[i]]++;
}
dp[0][0][0][e] = 1;
dp[0][0][1][e] = 1;
for(ll i = 1;i<=n;i++){
if(ps[i][1]==0) dp[i][0][0][e] = 1;
for(ll j = 1;j<=k;j++){
if(a[i]!=1) dp[i][j][0][e] = dp[i-1][j][0][e]|dp[i-1][j][1][e];
if(i-v[j]>=0&&ps[i][0]-ps[i-v[j]][0]==0) dp[i][j][1][e]|= dp[i-v[j]][j-1][0][e];
}
}
reverse(a+1,a+1+n); reverse(v+1,v+1+k);
}
for(ll i = 0;i<=n;i++) for(ll j = 0;j<=1;j++) ps[i][j] = 0;
for(ll i = 1;i<=n;i++){
for(ll j = 0;j<=1;j++) ps[i][j] = ps[i-1][j];
if(a[i]!=2) ps[i][a[i]]++;
}
for(ll i = 1;i<=n;i++){
for(ll j = 0;j<=k;j++){
bool f = (dp[i-1][j][0][0]|dp[i-1][j][1][0])&(dp[n-i][k-j][1][1]|dp[n-i][k-j][0][1])&(a[i]!=0);
ok[i][0]|=f;
if(j&&i-v[j]>=0){
bool g = 1;
if(n-i>=0) g = dp[n-i][k-j][0][1];
if(dp[i][j][1][0]&&g){
cnt[i+1]--;
cnt[i-v[j]+1]++;
}
}
}
}
for(ll i = 1;i<=n;i++) cnt[i]+=cnt[i-1];
for(ll i = 1;i<=n;i++) ok[i][1] = cnt[i];
string ans;
for(ll i = 1;i<=n;i++){
if(a[i]!=2){
if(a[i]==1) ans.pb('X');
else ans.pb('_');
}else{
if(ok[i][1]&&ok[i][0]) ans.pb('?');
else if(ok[i][1]) ans.pb('X');
else ans.pb('_');
}
}
return ans;
}
/*
.X........
1
3
..._._....
1
3
........
2
3 4
..........
2
3 4
*/
# | 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... |