제출 #343770

#제출 시각아이디문제언어결과실행 시간메모리
343770bigDuckPaint By Numbers (IOI16_paint)C++14
100 / 100
674 ms239528 KiB
#include "paint.h" #include <cstdlib> #include<bits/stdc++.h> using namespace std; #define INIT ios_base :: sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); #define mp make_pair #define pb push_back #define ft first #define sc second #define ll long long #define pii pair<int, int> #define count_bits __builtin_popcount string res; int N, K; vector<int> C; string S; bool suf1[200010][101], pref1[200010][101];//negre (numai capete) bool suf2[200010][101], pref2[200010][101];//albe //sufix[i][j], indicele i, ultimele j //prefix[i][j], indicele i, primele j int sum[200010]; int sum2[200010][101], sum3[200010][101]; int get_sum(int l, int r){ return sum[r]-sum[l-1]; } //numarul punctelor din dreapta, care sunt capete drepte ale portiunii j, si portiunea neagra a j-a contine punctul r int get_sum2(int l, int j){ return sum2[min(l+C[j-1]-1, N) ][j]-sum2[l-1][j]; } //numarul punctelor din stanga, care sunt capete stangi ale portiunii j, si portiunea neagra a j-a contine punctul r int get_sum3(int r, int j){ return sum3[r][K-j+1]-sum3[max(r-C[j-1]+1-1, 1) ][K-j+1]; } void build(){ for(int i=1; i<=N; i++){ sum[i]=sum[i-1]; if(S[i-1]=='_'){ sum[i]++; } } pref2[0][0]=true; for(int i=1; i<=N; i++){ for(int j=0; j<=K; j++){ if( (j>0) && (i>=(C[j-1])) && ( get_sum(i-C[j-1]+1, i)==0 ) && ( pref2[i-C[j-1] ][j-1] ) ){ pref1[i][j]=true; } if( (S[i-1]!='X') && ( (pref2[i-1][j]==true) || (pref1[i-1][j]==true) ) ){ pref2[i][j]=true; } } } suf2[N+1][0]=true; for(int i=N; i>=1; i--){ for(int j=0; j<=K; j++){ if((j>0) && ( (i+C[K-j]-1)<=N ) && (get_sum(i, i+C[K-j]-1)==0 ) && (suf2[i+C[K-j] ][j-1]==true) ){ suf1[i][j]=true; } if( (S[i-1]!='X') && ( (suf1[i+1][j]==true) || (suf2[i+1][j]==true) ) ){ suf2[i][j]=true; } } } for(int i=1; i<=N; i++){ for(int j=0; j<=K;j++){ sum2[i][j]=sum2[i-1][j]; if( (pref1[i][j]==true) &&(suf2[i+1][K-j]==true) ){ sum2[i][j]++; } sum3[i][j]=sum3[i-1][j]; if( (suf1[i][j]==true) && (pref2[i-1][K-j]==true) ){ sum3[i][j]++; } } } } void build_res(){ res.resize(N); for(int i=0; i<N; i++){ res[i]='?'; } for(int i=1; i<=N; i++){ bool black=false; bool white=false; for(int j=0; j<=K; j++){ if( ( (j>0) && ( ( get_sum2(i, j)>0 ) ) ) || ( (j>0) && (get_sum3(i, j)) ) ){ black=true; } if( ( (pref2[i][j]==true) && ( (suf1[i+1][K-j]==true) || (suf2[i+1][K-j]==true) ) ) ){ white=true; } } if( (white) && (black) ){ res[i-1]='?'; } else{ if(white){ res[i-1]='_'; } else{ res[i-1]='X'; } } } } std::string solve_puzzle(std::string s, std::vector<int> c) { N=s.length(); K=c.size(); C=c; S=s; build(); build_res(); return res; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...