답안 #210607

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
210607 2020-03-17T20:36:53 Z tatyam 로봇 (APIO13_robots) C++17
100 / 100
1151 ms 125096 KB
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,avx2,tune=native")
#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
#include <bits/stdc++.h>
using namespace std;
using pii = pair<int, int>;
using tuplis = array<int, 3>;
template<class T> using pq = priority_queue<T, vector<T>, greater<T>>;
#define overload4(_1,_2,_3,_4,name,...) name
#define rep1(n) for(int i=0;i<n;++i)
#define rep2(i,n) for(int i=0;i<n;++i)
#define rep3(i,a,b) for(int i=a;i<b;++i)
#define rep4(i,a,b,c) for(int i=a;i<b;i+=c)
#define rep(...) overload4(__VA_ARGS__,rep4,rep3,rep2,rep1)(__VA_ARGS__)
#define each(i,a) for(auto&& i : a)
#define all(a) begin(a), end(a)
template<class T, class U> bool chmin(T& a, const U& b){ if(a > b){ a = b; return 1; } return 0; }
const int dx[] = {0, 1, 0, -1};
const int dy[] = {1, 0, -1, 0};
const int INF = 0x33333333;


int n, w, h;
pii mem[500][500][4];
char s[501][501];
vector<pii> g[500][500];
int cost[10][10][500][500];
pii dfs(int x, int y, int d, int cnt = 0){
    if(x < 0) return {x + 1, y};
    if(y < 0) return {x, y + 1};
    if(x >= h) return {x - 1, y};
    if(y >= w) return {x, y - 1};
    if(s[x][y] == 'x') return {x + dx[d ^ 2], y + dy[d ^ 2]};
    if(mem[x][y][d] != pii{-1, -1}) return mem[x][y][d];
    if(cnt > 1000000) return mem[x][y][d] = {-2, -2};
    int d2 = d;
    if(s[x][y] == 'A'){
        d2 += 3;
        d2 &= 3;
    }
    else if(s[x][y] == 'C'){
        d2 += 1;
        d2 &= 3;
    }
    return mem[x][y][d] = dfs(x + dx[d2], y + dy[d2], d2, cnt + 1);
}
void bfs(int from, int to){
    auto c = cost[from][to];
    rep(cen, from + 1, to) rep(h) rep(j, w) chmin(c[i][j], cost[from][cen][i][j] + cost[cen][to][i][j]);
    queue<tuplis> q;
    vector<tuplis> q2;
    rep(h) rep(j, w) if(c[i][j] != INF) q2.push_back({c[i][j], i, j});
    sort(all(q2), greater<tuplis>());
    while(q.size() || q2.size()){
        bool flag = 0;
        if(!q2.size()) flag = 1;
        else if(q.size() && q.front()[0] < q2.back()[0]) flag = 1;
        auto [cost, x, y] = flag ? q.front() : q2.back();
        if(flag) q.pop();
        else q2.pop_back();
        for(auto [x2, y2] : g[x][y]) if(chmin(c[x2][y2], cost + 1)){
            q.push({c[x2][y2], x2, y2});
        }
    }
}
int main(){
    memset(mem, 0xff, sizeof(mem));
    memset(cost, 0x33, sizeof(cost));
    scanf("%d%d%d", &n, &w, &h);
    rep(h) scanf("%s", s[i]);
    rep(h) rep(j, w) rep(d, 4) dfs(i, j, d);
    rep(h) rep(j, w) rep(d, 4) if(mem[i][j][d] != pii{-2, -2} && mem[i][j][d] != pii{i, j}) g[i][j].push_back(mem[i][j][d]);
    rep(h) rep(j, w) if(isdigit(s[i][j]))cost[s[i][j] - '1'][s[i][j] - '0'][i][j] = 0;
    rep(i, 1, n + 1) rep(j, 0, n + 1 - i) bfs(j, j + i);
    int ans = INF;
    rep(h) rep(j, w) chmin(ans, cost[0][n][i][j]);
    if(ans == INF) ans = -1;
    printf("%d\n", ans);
}

Compilation message

robots.cpp: In function 'int main()':
robots.cpp:69:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d%d%d", &n, &w, &h);
     ~~~~~^~~~~~~~~~~~~~~~~~~~~~
robots.cpp:70:17: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     rep(h) scanf("%s", s[i]);
            ~~~~~^~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 62 ms 111864 KB Output is correct
2 Correct 60 ms 111864 KB Output is correct
3 Correct 60 ms 111864 KB Output is correct
4 Correct 62 ms 111864 KB Output is correct
5 Correct 61 ms 111736 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 62 ms 111864 KB Output is correct
2 Correct 60 ms 111864 KB Output is correct
3 Correct 60 ms 111864 KB Output is correct
4 Correct 62 ms 111864 KB Output is correct
5 Correct 61 ms 111736 KB Output is correct
6 Correct 59 ms 111864 KB Output is correct
7 Correct 60 ms 111864 KB Output is correct
8 Correct 61 ms 111864 KB Output is correct
9 Correct 60 ms 111868 KB Output is correct
10 Correct 61 ms 111912 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 62 ms 111864 KB Output is correct
2 Correct 60 ms 111864 KB Output is correct
3 Correct 60 ms 111864 KB Output is correct
4 Correct 62 ms 111864 KB Output is correct
5 Correct 61 ms 111736 KB Output is correct
6 Correct 59 ms 111864 KB Output is correct
7 Correct 60 ms 111864 KB Output is correct
8 Correct 61 ms 111864 KB Output is correct
9 Correct 60 ms 111868 KB Output is correct
10 Correct 61 ms 111912 KB Output is correct
11 Correct 168 ms 116244 KB Output is correct
12 Correct 76 ms 115576 KB Output is correct
13 Correct 87 ms 115576 KB Output is correct
14 Correct 408 ms 116924 KB Output is correct
15 Correct 124 ms 115972 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 62 ms 111864 KB Output is correct
2 Correct 60 ms 111864 KB Output is correct
3 Correct 60 ms 111864 KB Output is correct
4 Correct 62 ms 111864 KB Output is correct
5 Correct 61 ms 111736 KB Output is correct
6 Correct 59 ms 111864 KB Output is correct
7 Correct 60 ms 111864 KB Output is correct
8 Correct 61 ms 111864 KB Output is correct
9 Correct 60 ms 111868 KB Output is correct
10 Correct 61 ms 111912 KB Output is correct
11 Correct 168 ms 116244 KB Output is correct
12 Correct 76 ms 115576 KB Output is correct
13 Correct 87 ms 115576 KB Output is correct
14 Correct 408 ms 116924 KB Output is correct
15 Correct 124 ms 115972 KB Output is correct
16 Correct 161 ms 124136 KB Output is correct
17 Correct 1151 ms 125096 KB Output is correct
18 Correct 216 ms 123580 KB Output is correct
19 Correct 145 ms 122104 KB Output is correct
20 Correct 726 ms 124624 KB Output is correct