Submission #968386

#TimeUsernameProblemLanguageResultExecution timeMemory
968386berrPopeala (CEOI16_popeala)C++17
100 / 100
508 ms15696 KiB
#include <bits/stdc++.h>
using namespace std;
const int N = 2e4+30;
 
int gh[57][57];
int pref[55][N];
vector<int> v;
 int n, s, t;
long long dis[N][55];

int r(int l, int r){
    int ans=0;
    for(int i=0; i<n; i++){
        int val=pref[i][r];
        if(l>0) val-=pref[i][l-1];

        if(val==r-l+1) ans++;
    }
    return ans;
}
long long calc(int ri, int l, int f, long long kac){
    if(l<=t && f <= s && ri <t){
        if(dis[l][f]==(long long)1e10) return (long long)1e10;
        long long h = dis[l][f];
        long long gh = v[ri];
        if(l) gh-=v[l-1];
        return h+kac*gh;
    }
    return (long long) 1e10;
};

void solve(){
     cin >> n >> t >> s;
    v.resize(t);
    for(int i=0; i<=t; i++){
        for(int l=0; l<=s; l++){
            dis[i][l] = 1e10;
        }
    }
 
    for(auto &i: v) cin >> i;
 
    vector<string> se(n);
 
    for(auto &i: se){
        cin >> i;
    } 
    
    for(int i=0; i<n; i++){
        if(se[i][0]=='1') pref[i][0]++;
        for(int l=1; l<t; l++){
            pref[i][l] = pref[i][l-1] + se[i][l]-'0';

        }
    }

    for(int i=1; i<t; i++) v[i] += v[i-1];
 
    int h=0;
 
 
    for(int i=0; i<55; i++){
        for(int l=0; l<55; l++){
            gh[i][l]=-1;
        }
    }
 
   // assert((h < 55*t));
    gh[0][0]=0;
    dis[0][0]=0;
        
    vector<int> val(t, n);
    vector<int> last(t, -1);

    for(int i=0; i<=t; i++){
        //hah;  

         for(int j=0; j<50; j++){
            for(int el=0; el<=50; el++){
                if(gh[j][el]!=-1){
                    if(i!=0)
                    dis[i][j+1] = min(dis[i][j+1], calc(i-1, gh[j][el], j, val[gh[j][el]]));
                 
                }
            }
        }


    
        val[i]=n;
        for(int l=0; l<n; l++){
            if(se[l][i]=='0'){
                for(int j=i; j>last[l]; j--){
                    val[j]--;
                }
                last[l] = i;
            }
        }
   

        if(i!=t)
        for(int l=0; l<n; l++){
            if(se[l][i]=='0'){
                for(int j=i-1; j>=0; j--){
                    if(se[l][j]=='0') break;
                    
                    int el = val[j];// kaç tane
         
                    for(int k=0; k<s; k++){
         
                        if(gh[k][el]==-1) gh[k][el]=j;
                        else{
                            int tel = val[gh[k][el]];
                            int val_new = calc(i, j, k, el);
                            int val_old = calc(i, gh[k][el], k, tel);
                            if(val_new < val_old){
                                gh[k][el] = j;  
                            }
                        }
                    }
                }
            }
        }
        int el = val[i]; // kaç tane
         
         
        for(int k=0; k<s; k++){

            if(gh[k][el]==-1) gh[k][el]=i;
            else{
                int tel = r(gh[k][el], i);
                int val_new = calc(i, i, k, el);
                int val_old = calc(i, gh[k][el], k, tel);
                if(val_new < val_old){
                    gh[k][el] = i;  
                }
            }
        }
    
    
    }
 
    for(int i=1; i<=s; i++) cout<<dis[t][i]<<"\n";
}
 
signed main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    /*freopen("popeala.in", "r", stdin);
    freopen("popeala.out", "w", stdout);
*/
    solve();

    cerr<<clock()/1000.0;
}

Compilation message (stderr)

popeala.cpp: In function 'void solve()':
popeala.cpp:59:9: warning: unused variable 'h' [-Wunused-variable]
   59 |     int h=0;
      |         ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...