0分求调AC+MLE+WA
查看原帖
0分求调AC+MLE+WA
1074696
tmlrock楼主2023/8/29 21:42
#include <bits/stdc++.h>
using namespace std;

int n, m;
vector<int>a[2000010];
char c[1010][1010];
int qi[1010][1010][4];//前缀和
inline int ziped ( int x, int y ) {
    return x * 1001 + y;
}
inline int unzip_x ( int zip ) {
    return zip / 1001;
}
inline int unzip_y ( int zip ) {
    return zip % 1001;
}
inline void p ( int t, int x, int y ) {
    //push_back
    if ( x <= n && x && y && y <= m ) a[t].push_back ( ziped ( x, y ) );
}
//二维压一维
int main() {
    //Floyd n^3 , 即1e6^3=1e18
    //本题n=1e6, m=8e6~4e6 dijstra可以
    //鉴于本题边权为1,可用BFS,不加堆优化 和 加上堆优化皆可
    cin >> n >> m;
    int sx, sy, cx, cy;

    for ( int i = 1; i <= n; ++i )
        for ( int j = 1; j <= m; ++j ) {
            cin >> c[i][j];

            if ( c[i][j] == 'S' ) sx = i, sy = j;
            else if ( c[i][j] == 'C' ) cx = i, cy = j;
        }

    for ( int i = 1; i <= n; ++i )
        for ( int j = 1; j <= m; ++j ) {
            if ( c[i][j] == '#' ) {
                int t = ziped ( i, j );
                qi[i][j][0] = t;
                qi[i][j][1] = t;
                qi[i][j][2] = t;
                qi[i][j][3] = t;
            } else {
                qi[i][j][0] = qi[i - 1][j][0]; //上
                qi[i][j][0] = qi[i + 1][j][0]; //下
                qi[i][j][0] = qi[i][j - 1][0]; //左
                qi[i][j][0] = qi[i][j + 1][0]; //右
                /*qi[i][j][op]表示从i,j op方向开始数,第一个障碍(即门在这个方向在哪)*/
            }
        }

    for ( int i = 1; i <= n; ++i )
        for ( int j = 1; j <= m; ++j ) {
            int z = ziped ( i, j );
            p ( z, i, j + 1 );
            p ( z, i, j - 1 );
            p ( z, i + 1, j );
            p ( z, i - 1, j );

            for ( int k = 0; k < 4; ++k ) p ( qi[i][j][k ^ 1], unzip_x ( qi[i][j][k] ), unzip_y ( qi[i][j][k] ) );
        }

    queue< pair<int, int> >q;//距离 和 点号
    q.push ( make_pair ( 0, ziped ( sx, sy ) ) );
    int ans = ziped ( cx, cy );

    while ( q.size() ) {
        int step = q.front().first;
        int hao = q.front().second;
        q.pop();

        if ( hao == ans ) {
            cout << step;
            return 0;
        }
		for(int i :a[hao]) {
			q.push(make_pair(step+1,i));//入队
		}
    }

    return 0;
}
2023/8/29 21:42
加载中...