이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#include <ext/rope>
#define ll long long
#define pb push_back
#define sz(x) (int)(x).size()
#define mp make_pair
#define f first
#define s second
#define all(x) x.begin(), x.end()
#define D(x) cerr << #x << " is " << (x) << "\n";
using namespace std;
using namespace __gnu_pbds;
using namespace __gnu_cxx;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
template<class T> using ordered_set = tree<T, null_type, less<T>, rb_tree_tag,tree_order_statistics_node_update>; ///find_by_order(),order_of_key()
template<class T1, class T2> ostream& operator<<(ostream& os, const pair<T1,T2>& a) { os << '{' << a.f << ", " << a.s << '}'; return os; }
template<class T> ostream& operator<<(ostream& os, const vector<T>& a){os << '{';for(int i=0;i<sz(a);i++){if(i>0&&i<sz(a))os << ", ";os << a[i];}os<<'}';return os;}
template<class T> ostream& operator<<(ostream& os, const set<T>& a) {os << '{';int i=0;for(auto p:a){if(i>0&&i<sz(a))os << ", ";os << p;i++;}os << '}';return os;}
template<class T> ostream& operator<<(ostream& os, const multiset<T>& a) {os << '{';int i=0;for(auto p:a){if(i>0&&i<sz(a))os << ", ";os << p;i++;}os << '}';return os;}
template<class T1,class T2> ostream& operator<<(ostream& os, const map<T1,T2>& a) {os << '{';int i=0;for(auto p:a){if(i>0&&i<sz(a))os << ", ";os << p;i++;}os << '}';return os;}
int n,m;
const int N=2e5+5;
int sum[N],cnt[2];
int getSum(int l,int r)
{
int sol=sum[r];
if(l)
sol-=sum[l-1];
return sol;
}
string st;
vector<int> k;
vector<pair<pair<int,int>,int> > e;
bool stavio[N];
int godDamnMemoryLimit[N];
short dp[N][101];
bool calc(int tr,int i)
{
if(tr>=n)
return i==m;
if(dp[tr][i]!=-1)
return dp[tr][i];
dp[tr][i]=0;
if(i<m&&n-tr>=k[i]&&getSum(tr,tr+k[i]-1)==0&&st[tr+k[i]]!='X')
if(calc(tr+k[i]+1,i+1)){
dp[tr][i]=1;
if(godDamnMemoryLimit[tr]<k[i])
godDamnMemoryLimit[tr]=k[i];
if(!stavio[tr+k[i]])
e.pb({{tr+k[i],1},0}),e.pb({{tr+1+k[i],-1},0}),stavio[tr+k[i]]=1;
}
if(st[tr]!='X'&&calc(tr+1,i)){
dp[tr][i]=1;
if(!stavio[tr])
e.pb({{tr,1},0}),e.pb({{tr+1,-1},0}),stavio[tr]=1;
}
return dp[tr][i];
}
string solve_puzzle(string s,vector<int> c)
{
memset(dp,-1,sizeof(dp));
k=c;
st=s;
st+='_';
n=s.size();
m=c.size();
for(int i=0;i<n;i++)
{
if(s[i]=='_')
sum[i]++;
if(i)
sum[i]+=sum[i-1];
}
calc(0,0);
for(int i=0;i<n;i++)
if(godDamnMemoryLimit[i])
e.pb({{i,1},1}),e.pb({{i+godDamnMemoryLimit[i],-1},1});
string ans;
sort(all(e));
e.pb({{n,n},n});
int j=0;
for(int i=0;i<n;i++)
{
while(e[j].f.f==i)
cnt[e[j].s]+=e[j].f.s,j++;
if(cnt[0]==0)
ans+='X';
if(cnt[1]==0)
ans+='_';
if(cnt[0]!=0&&cnt[1]!=0)
ans+='?';
}
return ans;
}
# | 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... |