P3645 [APIO2015]分割統治+ BFS

題名

ポータルP3645 [APIO2015]ジャカルタの高層ビル

回答

エッジの重みは11です1BFS BFSB FS問題ありません。ドージェドージェを検討してくださいD o g eの状態は、(b、p)(b、p)を使用した2タプルの位置とジャンプ能力です。b p はを意味します。ジャンプ能力がppの場合p、到達可能な位置の数はN / p N / pです。N / p

分割統治をルートで検討してください。p <N p <\ sqrtNの場合p<N 、状態の数は最大でO(NN)O(N \ sqrt N)O NN ;p≥Nの場合p \ geq \ sqrt NpN 、状態の数は最大でO(MN)O(M \ sqrt N)O MN STLビットセットSTL \ビットセットS T L b i t s e t レコードステータス、BFS BFSB F Sソリューション、合計時間計算量O(NN)O(N \ sqrt N)O NN

#include <bits/stdc++.h>
using namespace std;
const int maxn = 30005, maxs = 10000005;
struct node
{
    
    
    int b, p, d;
} Q[maxs];
int N, M, S, T, L, R;
bool vsb[maxn];
vector<int> pos[maxn];
bitset<maxn> vs[maxn];

inline void psh(int b, int p, int d)
{
    
    
    if (!vs[b][p])
        Q[++R] = node{
    
    b, p, d}, vs[b][p] = 1;
}

inline void upd(int b, int p, int d)
{
    
    
    psh(b, p, d);
    if (!vsb[b])
    {
    
    
        vsb[b] = 1;
        for (auto &q : pos[b])
            psh(b, q, d);
    }
}

int bfs()
{
    
    
    vsb[S] = 1;
    L = 1, R = 0;
    for (auto &p : pos[S])
        psh(S, p, 0);
    while (L <= R)
    {
    
    
        node &t = Q[L++];
        if (t.b == T)
            return t.d;
        if (t.b - t.p >= 0)
            upd(t.b - t.p, t.p, t.d + 1);
        if (t.b + t.p < N)
            upd(t.b + t.p, t.p, t.d + 1);
    }
    return -1;
}

int main()
{
    
    
    scanf("%d%d", &N, &M);
    for (int i = 0, b, p; i < M; ++i)
    {
    
    
        scanf("%d%d", &b, &p), pos[b].push_back(p);
        if (i == 0)
            S = b;
        if (i == 1)
            T = b;
    }
    printf("%d\n", bfs());
    return 0;
}

おすすめ

転載: blog.csdn.net/neweryyy/article/details/114852125