제출 #1232350

#제출 시각아이디문제언어결과실행 시간메모리
1232350inesfiPaint By Numbers (IOI16_paint)C++20
0 / 100
0 ms320 KiB
#include "paint.h" #include<bits/stdc++.h> using namespace std; const int TAILLEMAXI=200*1000+2,KMAXI=102; const int BLANC=0,NOIR=1,RIEN=2; int n,k; vector<int> couleurs; vector<int> taille; int cumu[TAILLEMAXI]; int memo[TAILLEMAXI][KMAXI]; int okblanc[TAILLEMAXI],oknoir[TAILLEMAXI]; void init(){ for (int j=0;j<=n;j++){ cumu[j]=0; for (int l=0;l<=k;l++){ memo[j][l]=-1; } } for (int j=0;j<n;j++){ if (couleurs[j]==BLANC){ cumu[j]++; } if (j!=0){ cumu[j]+=cumu[j-1]; } } } int dp(int ec,int cb){ if (ec==n+1){ if (cb==k){ return 1; } return 0; } if (memo[ec][cb]!=-1){ return memo[ec][cb]; } if (ec==n){ if (cb==k){ memo[ec][cb]=1; return 1; } memo[ec][cb]=0; return 0; } if (cb==k){ if (couleurs[ec]==NOIR){ memo[ec][cb]=0; return 0; } memo[ec][cb]=dp(ec+1,cb); okblanc[ec]=max(okblanc[ec],memo[ec][cb]); return memo[ec][cb]; } if (couleurs[ec]==BLANC){ memo[ec][cb]=dp(ec+1,cb); return memo[ec][cb]; } if (couleurs[ec]==NOIR){ if (ec+taille[cb]>n){ memo[ec][cb]=0; return 0; } if ((ec==0 and cumu[ec+taille[cb]-1]!=0) or (ec!=0 and cumu[ec+taille[cb]-1]-cumu[ec-1]!=0) or (ec+taille[cb]<n and couleurs[ec+taille[cb]]==NOIR)){ memo[ec][cb]=0; return 0; } memo[ec][cb]=dp(ec+taille[cb]+1,cb+1); if (memo[ec][cb]==1){ oknoir[ec]++; oknoir[ec+taille[cb]]--; okblanc[ec+taille[cb]]=1; } return memo[ec][cb]; } int r=0; r=max(r,dp(ec+1,cb)); okblanc[ec]=max(r,okblanc[ec]); if (ec+taille[cb]<=n){ if (!(ec==0 and cumu[ec+taille[cb]-1]!=0) and !(ec!=0 and cumu[ec+taille[cb]-1]-cumu[ec-1]!=0) and !(ec+taille[cb]<n and couleurs[ec+taille[cb]]==NOIR)){ r=max(r,dp(ec+taille[cb]+1,cb+1)); if (dp(ec+taille[cb]+1,cb+1)==1){ oknoir[ec]++; oknoir[ec+taille[cb]]--; okblanc[ec+taille[cb]]=1; } } } memo[ec][cb]=r; return r; } string solve_puzzle (string s, vector<int> c) { n=s.size(); k=c.size(); taille=c; for (int i=0;i<n;i++){ if (s[i]=='.'){ couleurs.push_back(RIEN); } else if (s[i]=='X'){ couleurs.push_back(NOIR); } else { couleurs.push_back(BLANC); } } init(); dp(0,0); string rep=""; for (int i=0;i<n;i++){ if (i!=0){ oknoir[i]+=oknoir[i-1]; } if (couleurs[i]==RIEN){ if (okblanc[i]>=1 and oknoir[i]>=1){ rep.push_back('?'); } else if (okblanc[i]>=1){ rep.push_back('_'); } else { rep.push_back('X'); } } else { rep.push_back(s[i]); } cout<<okblanc[i]<<" "<<oknoir[i]<<endl; } return rep; }

컴파일 시 표준 에러 (stderr) 메시지

paint.h:1:9: warning: #pragma once in main file
    1 | #pragma once
      |         ^~~~
paint_c.h:1:9: warning: #pragma once in main file
    1 | #pragma once
      |         ^~~~
#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...