Submission #230860

#TimeUsernameProblemLanguageResultExecution timeMemory
230860frodakcinPopeala (CEOI16_popeala)C++11
26 / 100
2100 ms6392 KiB
#include <cstdio> #include <cstring> #include <vector> #include <algorithm> #include <deque> /* Can we use dp[T] (1-dimensional) for each S-layer, and sweep for N? */ template<typename T> bool ckmax(T& a, T b){return a<b?a=b,1:0;} template<typename T> bool ckmin(T& a, T b){return a>b?a=b,1:0;} int rpl(int& a, int b){return !~a||b<a?a=b,1:0;} const int MT=1<<15; const int MN=52, MS=52; const int INF=2e9+10; int T, N, S, a[MT], p[MT], pr[MN][MT], dp[2][MT], o[MN]; bool b[MN][MT]; char s[MN]; struct val{public: int i, v;}; struct dque : public std::deque<val> { public: int k, r; bool chk(int nl, int nr) { for(;r <= nr;++r) { if(!~dp[0][r]) continue; val x = {r, dp[0][r]-p[r]*k}; for(;!empty() && x.v <= back().v;) pop_back(); push_back(x); } for(;!empty() && front().i <= nl;) pop_front(); return !empty(); } int get() {return front().v;} } q[MN]; int main(void) { scanf("%d%d%d", &N, &T, &S); for(int i=0;i<T;++i) scanf("%d", a+i), p[i+1]=p[i]+a[i]; for(int i=0;i<N;++i) { scanf(" %s", s); pr[i][0] = -1; for(int j=0;j<T;++j) { b[i][s[j]]=s[j]=='0'; pr[i][j+1] = s[j]=='0'?j:pr[i][j];//prev occurence in [0, j) } } for(int i=0;i<=N;++i) q[i].k=i; memset(dp, -1, sizeof dp); dp[0][0] = 0; o[0]=-1; for(int i=1;i<=S;++i) { for(int j=1;j<=T;++j) { for(int k=0;k<N;++k) o[k+1]=pr[k][j]; std::sort(o+1, o+N+1); o[N+1]=j-1;// CHECK (J-1) IS CORRECT? for(int k=0;k<=N;++k) { //printf("\tRANGE (%d): (%d, %d]\n", k, o[k], o[k+1]); if(q[k].chk(o[k], o[k+1])) rpl(dp[1][j], q[k].get() + k*p[j]);//(] } //printf("dp[%d][%d] = %d\n", i, j, dp[1][j]); } printf("%d\n", dp[1][T]); memcpy(dp[0], dp[1], sizeof dp[1]); memset(dp[1], -1, sizeof dp[1]); for(int j=0;j<=N;++j) q[j].clear(), q[j].r=0; } return 0; }

Compilation message (stderr)

popeala.cpp: In function 'int main()':
popeala.cpp:57:13: warning: array subscript has type 'char' [-Wchar-subscripts]
    b[i][s[j]]=s[j]=='0';
             ^
popeala.cpp:48:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d%d%d", &N, &T, &S);
  ~~~~~^~~~~~~~~~~~~~~~~~~~~~
popeala.cpp:50:19: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d", a+i), p[i+1]=p[i]+a[i];
   ~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~
popeala.cpp:53:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf(" %s", s);
   ~~~~~^~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...