求卡常
  • 板块学术版
  • 楼主xnmzyz
  • 当前回复3
  • 已保存回复3
  • 发布时间2024/4/4 17:23
  • 上次更新2024/4/4 20:10:50
查看原帖
求卡常
384730
xnmzyz楼主2024/4/4 17:23

P4667有一个点差8ms(不能用O2)

#include <cstring>
#include <iostream>
#include <queue>
using namespace std;
int n, m, cnt, sum;
int left_up, left_down, right_up, right_down;
char f[510];
int head[1100010], d[1100010];
struct edge {
    int next, w, v;
} e[1100010];
inline void add(int u, int v, int w) {
    e[++cnt].v = v;
    e[cnt].w = w;
    e[cnt].next = head[u];
    head[u] = cnt;
}

struct node {
    int u, d;
    bool operator <(const node& num) const {
        return d > num.d;
    }
};
inline int read() { 
	int x = 0;
	char s = getchar();
	while (s >= '0' && s <= '9') {
		x = x * 10 + s - '0';
		s = getchar();
	}
	return x ;
}
inline void Dijkstra() {
    sum = (m + 1) * (n + 1);
    priority_queue<node> q;
    for (register int i = 1; i <= sum; i++) {
        d[i] = 0x7f7f7f;
    }
    d[1] = 0;
    q.push({1, d[1]});
    while (!q.empty()) {
        node x = q.top();
        q.pop();
        int u = x.u;
        if (x.d != d[u]) {
            continue;
        }
        for (register int i = head[u]; i; i = e[i].next) {
            int v = e[i].v, w = e[i].w;
            if (d[u] + w < d[v]) {
                d[v] = d[u] + w;
                q.push({v, d[v]});
            }
        }
    }
    d[sum] == 0x7f7f7f ? printf("NO SOLUTION") : printf("%d", d[sum]);
} 

int main() {
    n = read(), m = read();
    for (register int i = 0; i < n; i++) {
    	scanf("%s", f);
        for (register int j = 0; j < m; j++) {
        	left_up = (m + 1) * i + j + 1;
    		right_up=(m + 1) * i + j + 2;
    		left_down = (m + 1) * (i + 1) + j + 1;
    		right_down = (m + 1) * (i + 1) + j + 2;
            if (f[j] == 92) {
               	add(left_up, right_down, 0);
               	add(right_down, left_up, 0);
               	add(left_down, right_up, 1);
                add(right_up, left_down ,1);
           	}
            if (f[j] == 47) {
            	add(left_down, right_up, 0);
                add(right_up, left_down, 0);
                add(left_up, right_down, 1);
                add(right_down, left_up, 1);
            }
        }
    }
    Dijkstra();
}
2024/4/4 17:23
加载中...