답안 #677727

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
677727 2023-01-04T08:51:55 Z Cross_Ratio 송금 (JOI19_remittance) C++14
0 / 100
0 ms 340 KB
#include <bits/stdc++.h>
using namespace std;
int dx[4] = {0, 1, 0, -1};
int dy[4] = {1, 0, -1, 0};
int A[100005];
int B[200005];
int res[805][805];
bool vis[805][805];
int T[805][805];
int N, R, C;
int val[16];
bool in(int x, int y) {
    return 0<=x&&x<R&&0<=y&&y<C;
}
int D[805][805];
typedef pair<int,int> P;
bool pos[805][805][4];
int dir_map[3][3] = {
    { -1,3,-1 },
    { 2,-1,0  },
    { -1,1,-1 }
};
int all_cnt = 0;
int num(int x, int y) {
    return C*x+y;
}
set<P> S;
signed main() {
    cin.sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cin >> N >> R >> C;
    string s;
    cin >> s;
    int i, j;
    for(i=0;i<N;i++) {
        for(j=0;j<4;j++) {
            if(s[i]=="WNES"[j]) A[i] = j;
        }
    }
    for(j=0;j<16;j++) {
        for(i=0;i<N;i++) B[i] = 0;
        bool VS[4] = {0, 0, 0, 0};
        for(int k = 0; k < 4; k++) {
            if(j&(1<<k)) VS[k] = true;
        }
        for(i=0;i<N;i++) {
            if(VS[A[i]]) B[i] = 1;
        }
        for(i=N;i<2*N;i++) B[i] = B[i-N];
        for(i=1;i<2*N;i++) {
            if(B[i]!=0) B[i] = B[i-1] + 1;
        }
        for(i=0;i<2*N;i++) val[j] = max(val[j], B[i]);
        if(val[j] >= N) val[j] = 100001;
    }
    for(i=0;i<R;i++) {
        for(j=0;j<C;j++) cin >> D[i][j];
    }
    for(i=0;i<R;i++) {
        for(j=0;j<C;j++) {
            T[i][j] = 0;
        }
    }
    for(i=0;i<R;i++) {
        for(j=0;j<C;j++) {
            if(D[i][j]==0) continue;
            //cout << i << ' ' << j << "'s Turn\n";
            vis[i][j] = true;
            res[i][j] = 1;
            queue<P> Q;
            vector<array<int, 2>> F;
            F.push_back({i, j});
            for(int dir = 0; dir < 4; dir++) {
                int x1 = i + dx[dir], y1 = j + dy[dir];
                if(in(x1, y1)) {
                    if(T[x1][y1]==0) F.push_back({x1, y1});
                    T[x1][y1] += (1<<dir);
                    if(D[x1][y1]!=0&&val[T[x1][y1]]>=D[x1][y1]) Q.push(P(x1, y1));
                }
            }
            while(!Q.empty()) {
                P k = Q.front();
                Q.pop();
                int x = k.first, y = k.second;
                //cout << x << ' ' << y <<'\n';
                all_cnt++;
                if(vis[x][y]) continue;
                vis[x][y] = true;
                S.insert(P(num(i, j), num(x, y)));
                if(S.find(P(num(x, y), num(i, j)))!=S.end()) {
                    //res[i][j] = res[x][y];
                    //break;
                }
                res[i][j]++;
                for(int k2 = 0; k2 < 4; k2++) {
                    int x1 = x + dx[k2], y1 = y + dy[k2];
                    if(in(x1, y1)) {
                        if(vis[x1][y1]) continue;
                        if(val[T[x1][y1]]>=D[x1][y1]) continue;
                        if(T[x1][y1]==0) F.push_back({x1, y1});
                        T[x1][y1] += (1<<k2);
                        if(D[x1][y1]!=0&&val[T[x1][y1]]>=D[x1][y1]) Q.push(P(x1, y1));
                    }
                }
            }
            for(auto k : F) T[k[0]][k[1]] = 0;
            for(auto k : F) vis[k[0]][k[1]] = false;
        }
    }
    int mi = R*C+1, micnt = 0;
    for(i=0;i<R;i++) {
        for(j=0;j<C;j++) {
            if(D[i][j]==0) continue;
            if(res[i][j] < mi) {
                mi = res[i][j];
                micnt = 0;
            }
            if(res[i][j]==mi) micnt++;
        }
    }
    /*for(i=0;i<R;i++) {
        for(j=0;j<C;j++) cout << res[i][j] << ' ';
        cout << '\n';
    }*/
    cout << mi << '\n' << micnt;
    //cout <<'\n' << all_cnt;
}
# 결과 실행 시간 메모리 Grader output
1 Incorrect 0 ms 340 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 0 ms 340 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 0 ms 340 KB Output isn't correct
2 Halted 0 ms 0 KB -