Submission #1297397

#TimeUsernameProblemLanguageResultExecution timeMemory
1297397huudaiSelotejp (COCI20_selotejp)C++20
110 / 110
47 ms48804 KiB
#include <bits/stdc++.h>

using namespace std;

#define ll long long
#define fi first
#define se second
#define pii pair<int, int>
#define pll pair<ll,ll>
#define mp make_pair
#define pb push_back

#define BIT(x,i) (((x)>>(i))&1)
#define MASK(i) (1LL<<(i))  

template<typename T1, typename T2> bool minimize(T1 &a, T2 b)
    {if(a>=b) a=b; else return 0; return 1;}
template<typename T1, typename T2> bool maximize(T1 &a, T2 b)
    {if(a<b) a=b; else return 0; return 1;}

#define file "task"

const int maxn = 1e4 + 5;
const int MOD  = 1e9 + 7;
const int oo   = 1e9;
const ll  OO   = 1e18;

int n, m;
int f[1005][12][MASK(10)];
int a[1005][12];

void input(){
    cin >> n >> m;
    for(int i = 1; i <= n; i++){
        string st; cin >> st;
        for(int j = 0; j < m; j++){
            a[i][j + 1] = st[j] == '#';
            // cout << i << " "<< j + 1 << " "<< a[i][j + 1] << " \n"[j == m - 1];
        }
    }
}

void proc(){
    memset(f, 0x3f, sizeof(f));
    f[0][m][0] = 0;

    for(int i = 0; i <= n; i++){
        for(int j = 0; j <= m; j++){
            for(int mask = 0; mask < MASK(m); mask++){
                if(f[i][j][mask] >= oo) continue;
                if(j == m)
                    minimize(f[i + 1][0][mask], f[i][j][mask]);
                else {
                    if(a[i][j + 1]){
                        if(BIT(mask, j)){
                            minimize(f[i][j + 1][mask], f[i][j][mask]);
                            if(j >= 1 && a[i][j] && BIT(mask, j - 1) == 0){
                                minimize(f[i][j + 1][mask ^ MASK(j)], f[i][j][mask]);
                            } else
                                minimize(f[i][j + 1][mask ^ MASK(j)], f[i][j][mask] + 1);

                        } else {
                            minimize(f[i][j + 1][mask ^ MASK(j)], f[i][j][mask] + 1);
                            if(j >= 1 && a[i][j] && BIT(mask, j - 1) == 0){
                                minimize(f[i][j + 1][mask], f[i][j][mask]);
                            } else 
                                minimize(f[i][j + 1][mask], f[i][j][mask] + 1);
                        }
                    } else {
                        if(BIT(mask, j))
                            minimize(f[i][j + 1][mask ^ MASK(j)], f[i][j][mask]);
                        else
                            minimize(f[i][j + 1][mask], f[i][j][mask]);
                    }
                }
            }
        }
    }

    int ans = oo;
    for(int mask = 0; mask < MASK(m); mask++){
        minimize(ans, f[n][m][mask]);
    }
    cout << ans << '\n';
}

signed main(){
    cin.tie(nullptr)->sync_with_stdio(0); cout.tie(nullptr);    
    if(fopen(file".inp", "r")){
        freopen(file".inp", "r", stdin);
        freopen(file".out", "w", stdout);
    }
    
    input();
    proc();

    return 0;
}

Compilation message (stderr)

Main.cpp: In function 'int main()':
Main.cpp:90:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   90 |         freopen(file".inp", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
Main.cpp:91:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   91 |         freopen(file".out", "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...