Submission #666681

# Submission time Handle Problem Language Result Execution time Memory
666681 2022-11-29T10:27:27 Z AmirH Robots (APIO13_robots) C++14
60 / 100
1500 ms 145864 KB
#include<iostream>
#include<algorithm>
#include<math.h>
#include<vector>
#include<bitset>
#include<queue>
#include<queue>
#include<deque>
#include<set>
#include<map>
#include<unordered_map>
#include<list>
#include<utility>
#include<stack>
using namespace std;
typedef long long ll;
typedef long double ld;
typedef pair <ll, ll> pll;
typedef pair <int, int> pii;
#define cl clear
#define F  first
#define S  second
#define pb push_back
#define Sz(x) int((x).size())
#define all(x) (x).begin(), (x).end()
#define faster ios::sync_with_stdio(0), cin.tie(0), cout.tie(0)
const int MAX_N = 5e2 + 10;
const ll INF = 1e18;
const int inf = 1e9;
void free() {
    #ifndef ONLINE_JUDGE
        freopen("input.txt", "r", stdin);
        freopen("output.txt", "w", stdout);
    #endif
}
int n, w, h;
char ch[MAX_N][MAX_N];
set<int> sat[MAX_N], sot[MAX_N];
set<int> satan[MAX_N], sotan[MAX_N];
vector<int> adj[MAX_N * MAX_N];
int heightst[MAX_N * MAX_N][10];
int rast[MAX_N * MAX_N], chap[MAX_N * MAX_N], bala[MAX_N * MAX_N], paiin[MAX_N * MAX_N];
// dir : chap = 0, rast = 1, paiin = 2, bala = 3
bool check[MAX_N][MAX_N][5];
int final_ex[MAX_N][MAX_N][5];
int dp[MAX_N * MAX_N][10][10];
int get(int x, int y) {
    return (x - 1) * w + y;
}
int find_ex(int x, int y, int dir) {
    if(final_ex[x][y][dir] != 0)
        return final_ex[x][y][dir];
    if(check[x][y][dir])
        return 0;
    check[x][y][dir] = 1;
    int st;
    if(dir == 0) {
        st = *(--sat[x].lower_bound(y));
        if(ch[x][st] == 'x')
            return final_ex[x][y][dir] = get(x, st + 1);
        else if(ch[x][st] == 'A')
           return final_ex[x][y][dir] = find_ex(x, st, 2);
        else
           return final_ex[x][y][dir] = find_ex(x, st, 3);
    }
    if(dir == 1) {
        st = *(sat[x].upper_bound(y));
        if(ch[x][st] == 'x')
            return final_ex[x][y][dir] = get(x, st - 1);
        else if(ch[x][st] == 'A') 
            return final_ex[x][y][dir] = find_ex(x, st, 3);
        else
           return final_ex[x][y][dir] = find_ex(x, st, 2);
    }
    if(dir == 2) {
        st = *(sot[y].upper_bound(x));
        if(ch[st][y] == 'x')
            return final_ex[x][y][dir] = get(st - 1, y);
        else if(ch[st][y] == 'A')
            return final_ex[x][y][dir] = find_ex(st, y, 1);
        else
            return final_ex[x][y][dir] = find_ex(st, y, 0);
    }
    if(dir == 3) {
        st = *(--sot[y].lower_bound(x));
        if(ch[st][y] == 'x')
            return final_ex[x][y][dir] = get(st + 1, y);
        else if(ch[st][y] == 'A')
            return final_ex[x][y][dir] = find_ex(st, y, 0);
        else
            return final_ex[x][y][dir] = find_ex(st, y, 1);
    }
}

void bfs(int st, int d) {
    int height[MAX_N * MAX_N];
    bool mark[MAX_N * MAX_N];
    for(int i = 1; i <= h * w; i++)
        height[i] = inf, mark[i] = false;
    queue<int> q;
    q.push(st);
    mark[st] = true;
    height[st] = 0;
    while(q.size()) {
        int x = q.front();
        q.pop();
        for(auto i : adj[x])
            if(!mark[i]) {
                mark[i] = true;
                q.push(i);
                height[i] = height[x] + 1;
            }
    }
    for(int i = 1; i <= h * w; i++)
        heightst[i][d] = height[i];
}
void find(int x, int y) {
    int st = get(x, y);
    rast[st] = find_ex(x, y, 1);
    chap[st] = find_ex(x, y, 0);
    bala[st] = find_ex(x, y, 3);
    paiin[st] = find_ex(x, y, 2);
    if(rast[st] != st && rast[st] != 0) {
        adj[st].pb(rast[st]);
    }
    if(chap[st] != st && chap[st] != 0) {
        adj[st].pb(chap[st]);
    }
    if(paiin[st] != st && paiin[st] != 0) {
        adj[st].pb(paiin[st]);
    }
    if(bala[st] != st && bala[st] != 0) {
        adj[st].pb(bala[st]);
    }
}
void setdef() {
    for(int i = 1; i <= h; i++) {
        for(int j = 1; j <= w; j++) {
            if(ch[i][j] == 'x')
                continue;
            for(int k = 1; k <= 9; k++) {
                for(int p = 1; p <= 9; p++) {
                    dp[get(i, j)][k][p] = inf;
                }
            }
        }
    }
}

void bfs2(set<pii> &s, int l, int r) {
    while(s.size()) {
        int x = s.begin()->first;
        int y = s.begin()->second;
        s.erase(s.begin());
        for(auto i : adj[y]) {
            if(x + 1 < dp[i][l][r]) {
                s.erase({dp[i][l][r], i});
                dp[i][l][r] = x + 1;
                s.insert({dp[i][l][r], i});
            }
        }
    }
}
int main() {
    faster; //free();
    cin >> n >> w >> h;
    for(int i = 0; i <= h + 1; i++){
        for(int j = 0; j <= w + 1; j++) {
            if(i == 0 || i == h + 1 || j == 0 || j == w + 1)
                ch[i][j] = 'x';
            else
                cin >> ch[i][j];
            if(ch[i][j] == 'x' || ch[i][j] == 'A' || ch[i][j] == 'C') {
                sat[i].insert(j);
                sot[j].insert(i);
            }
        }
    }
    vector<pair<pii, int>> nodes;
    for(int i = 1; i <= h; i++) {
        for(int j = 1; j <= w; j++) {
            if(ch[i][j] == 'x')
                continue;
            find(i, j);
            if(ch[i][j] - '0' >= 1 && ch[i][j] - '0' <= 9)
                nodes.pb({{i, j}, ch[i][j] - '0'});
        }
    }
    for(auto i : nodes) {
        bfs(get(i.first.first, i.first.second), i.second);
    }
    // for(int i = 1; i <= n; i++) {
    //     for(int j = 1; j <= w * h; j++)
    //         cout << heightst[j][i] << " ";
    //     cout << '\n';
    // }
    setdef();
    for(int i = 1; i <= h; i++) {
        for(int j = 1; j <= w; j++) {
            if(ch[i][j] == 'x')
                continue;
            for(int k = 1; k <= n; k++)
                dp[get(i, j)][k][k] = heightst[get(i, j)][k];
        }
    }
    for(int len = 1; len < n; len++) {
        for(int l = 1; l <= n - len; l++) {
            int r = l + len;
            set<pii> s;
            for(int i = 1; i <= h; i++) {
                for(int j = 1; j <= w; j++) {
                    if(ch[i][j] == 'x')
                        continue;
                    for(int k = l; k < r; k++) {
                        dp[get(i, j)][l][r] = min(dp[get(i, j)][l][k] + dp[get(i, j)][k + 1][r], dp[get(i, j)][l][r]);
                    }
                    s.insert({dp[get(i, j)][l][r], get(i, j)});
                }
            }
            bfs2(s, l, r);
            // cout << l << " " << r << '\n';
            // for(int i = 1; i <= w * h; i++)
            //     cout << dp[i][l][r] << " ";
            // cout << '\n';
        }
    }
    int res = inf;
    for(int i = 1; i <= h; i++) {
        for(int j = 1; j <= w; j++) 
            if(ch[i][j] != 'x')
                res = min(res, dp[get(i, j)][1][n]);
    }
    if(res == inf)
        cout << -1;
    else
        cout << res;
}

Compilation message

robots.cpp: In function 'void free()':
robots.cpp:32:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   32 |         freopen("input.txt", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
robots.cpp:33:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   33 |         freopen("output.txt", "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~
robots.cpp: In function 'int find_ex(int, int, int)':
robots.cpp:93:1: warning: control reaches end of non-void function [-Wreturn-type]
   93 | }
      | ^
# Verdict Execution time Memory Grader output
1 Correct 5 ms 7764 KB Output is correct
2 Correct 4 ms 7764 KB Output is correct
3 Correct 4 ms 7764 KB Output is correct
4 Correct 4 ms 7892 KB Output is correct
5 Correct 4 ms 7892 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 5 ms 7764 KB Output is correct
2 Correct 4 ms 7764 KB Output is correct
3 Correct 4 ms 7764 KB Output is correct
4 Correct 4 ms 7892 KB Output is correct
5 Correct 4 ms 7892 KB Output is correct
6 Correct 5 ms 7764 KB Output is correct
7 Correct 4 ms 7764 KB Output is correct
8 Correct 5 ms 7764 KB Output is correct
9 Correct 4 ms 7764 KB Output is correct
10 Correct 4 ms 7892 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 5 ms 7764 KB Output is correct
2 Correct 4 ms 7764 KB Output is correct
3 Correct 4 ms 7764 KB Output is correct
4 Correct 4 ms 7892 KB Output is correct
5 Correct 4 ms 7892 KB Output is correct
6 Correct 5 ms 7764 KB Output is correct
7 Correct 4 ms 7764 KB Output is correct
8 Correct 5 ms 7764 KB Output is correct
9 Correct 4 ms 7764 KB Output is correct
10 Correct 4 ms 7892 KB Output is correct
11 Correct 426 ms 47140 KB Output is correct
12 Correct 44 ms 45180 KB Output is correct
13 Correct 247 ms 59796 KB Output is correct
14 Correct 731 ms 51300 KB Output is correct
15 Correct 387 ms 47232 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 5 ms 7764 KB Output is correct
2 Correct 4 ms 7764 KB Output is correct
3 Correct 4 ms 7764 KB Output is correct
4 Correct 4 ms 7892 KB Output is correct
5 Correct 4 ms 7892 KB Output is correct
6 Correct 5 ms 7764 KB Output is correct
7 Correct 4 ms 7764 KB Output is correct
8 Correct 5 ms 7764 KB Output is correct
9 Correct 4 ms 7764 KB Output is correct
10 Correct 4 ms 7892 KB Output is correct
11 Correct 426 ms 47140 KB Output is correct
12 Correct 44 ms 45180 KB Output is correct
13 Correct 247 ms 59796 KB Output is correct
14 Correct 731 ms 51300 KB Output is correct
15 Correct 387 ms 47232 KB Output is correct
16 Execution timed out 1585 ms 145864 KB Time limit exceeded
17 Halted 0 ms 0 KB -