Submission #1204848

#TimeUsernameProblemLanguageResultExecution timeMemory
1204848andrei_nT-Covering (eJOI19_covering)C++20
0 / 100
2 ms580 KiB
#include <bits/stdc++.h>
#define NO cout<<"No"; exit(0);

using namespace std;

const int dx[] = {-1,0,1,0,-1,1,1,-1};
const int dy[] = {0,1,0,-1,1,1,-1,-1};
vector<vector<int>> v;
vector<vector<int>> is;
const int INF = 999999999;

inline bool overlap(int d)
{
    return d == 0 || d == 2 || d == 4 || d == 6;
}

inline void fix(int x, int y)
{
    if(abs(is[x+1][y]) == 1) {NO}
    is[x+1][y] = 2;
    if(abs(is[x-1][y]) == 1) {NO}
    is[x-1][y] = 2;
    if(abs(is[x][y+1]) == 1) {NO}
    is[x][y+1] = 2;
    if(abs(is[x][y-1]) == 1) {NO}
    is[x][y-1] = 2;
}

inline void fix2(int x, int y)
{
    if(abs(is[x+1][y])) {NO}
    is[x+1][y] = 2;
    if(abs(is[x-1][y])) {NO}
    is[x-1][y] = 2;
    if(abs(is[x][y+1])) {NO}
    is[x][y+1] = 2;
    if(abs(is[x][y-1])) {NO}
    is[x][y-1] = 2;
}

void propagate(int x, int y)
{
    if(is[x][y] != -1) return;
    for(int i=0; i<4; ++i)
    {
        if(x+dx[i]*2 < 0 || y+dy[i]*2 < 0) continue;
        if(is[x+dx[i]*2][y+dy[i]*2] == 1)
        {
            fix(x+dx[i]*2, y+dy[i]*2);
            is[x+dx[i]*2][y+dy[i]*2] = -1;
            propagate(x+dx[i]*2, y+dy[i]*2);
        }
//        else if(is[x+dx[i]*2][y+dy[i]*2] != 0)
//            {NO}
    }
}

signed main()
{
    ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    int n,m; cin>>n>>m;
    v.assign(n+3, vector<int>(m+3, INF));
    is.assign(n+3, vector<int>(m+3, 0));
    for(int i=1; i<=n; ++i)
        for(int j=1; j<=m; ++j)
            cin>>v[i][j];
    for(int i=0; i<=n+2; ++i)
        for(int j=0; j<=m+2; ++j)
            if(i == 0 || i > n || j == 0 || j > m)
                is[i][j] = 2;
    int k; cin>>k;
    for(int i=0; i<k; ++i)
    {
        int x,y; cin>>x>>y; ++x; ++y;
        is[x][y] = 1;
    }
    for(int i=1; i<=n; ++i)
        for(int j=1; j<=m; ++j)
            if(is[i][j] == 1)
            {
                for(int d=0; d<8; ++d)
                    if(is[i+dx[d]][j+dy[d]] == 1)
                    {
                        is[i+dx[d]][j+dy[d]] = 0;
                        fix(i,j);
                        is[i+dx[d]][j+dy[d]] = -1;
                        is[i][j] = 0;
                        fix(i+dx[d],j+dy[d]);
                        is[i][j] = -1;
                    }
                    else if(is[i+dx[d]][j+dy[d]] == -1) {NO}
            }
    for(int i=1; i<=n; ++i)
        for(int j=1; j<=m; ++j)
            propagate(i, j);
    for(int i=1; i<=n; ++i)
        for(int j=1; j<=m; ++j)
            if(is[i][j] == 1)
            {
                fix2(i, j);
                is[i][j] = -1;
                int mini = min({v[i-1][j], v[i+1][j], v[i][j+1], v[i][j-1]});
                if(v[i-1][j] == mini)
                    is[i-1][j] = 0;
                else if(v[i+1][j] == mini)
                    is[i+1][j] = 0;
                else if(v[i][j-1] == mini)
                    is[i][j-1] = 0;
                else
                    is[i][j+1] = 0;
            }
    int sum = 0;
    for(int i=1; i<=n; ++i)
        for(int j=1; j<=m; ++j)
            if(is[i][j] == 2 || is[i][j] == -1)
                sum += v[i][j];
    cout<<sum;
    return 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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...