请问卡常技巧和方法
查看原帖
请问卡常技巧和方法
168223
ShuKuang楼主2021/7/17 09:22

rt, 正常跑只有54分慢的一批,吸氧后快了一倍跑得飞快,复杂度是log2log^2的,是中间写挂了还是单纯我人傻常数大?

#include <bits/stdc++.h>

using namespace std;

#define int long long

inline int read() {
    int r = 1, s = 0;
    char ch = getchar();
    while (ch < '0' || ch > '9') {
        if (ch == '-')
            r = -1;
        ch = getchar();
    }
    while (ch >= '0' && ch <= '9') {
        s = s * 10 + ch - '0';
        ch = getchar();
    }
    return r * s;
}

inline void write(int x) {
    if (x < 0) {
        putchar('-');
        x = -x;
    }
    if (x > 9) {
        write(x / 10);
    }
    putchar(x % 10 ^ 48);
    return;
}

const int N = 1e5 + 10;
const int M = 5e5 + 10;
int n, m, k, T, ans;

int Node[N], s, t, dis[N];
bool vis[N];
priority_queue <pair <int, int> >q;

struct Graph {
    struct Edge {
        int nxt, to, val;
    }e[M];

    int head[N], cnte;
    void add(int x, int y, int z) {
        e[++ cnte] = (Edge){head[x], y, z};
        head[x] = cnte;
    }   
    void clear() {
        memset(head, 0, sizeof head);
        cnte = 0;
    } 
}g, f;


void dij() {
    memset(dis, 0x3f, sizeof dis);
    memset(vis, 0, sizeof vis);
    while(q.size()) q.pop();
    dis[s] = 0;
    q.push(make_pair(0, s));
    while (q.size()) {
        int u = q.top().second;
        q.pop();
        if (vis[u]) continue;
        vis[u] = true;
        for (int i = f.head[u]; i; i = f.e[i].nxt) {
            int v = f.e[i].to;
            if (vis[v]) continue;
            int w = f.e[i].val;
            if (dis[v] > dis[u] + w) {
                dis[v] = dis[u] + w;
                q.push(make_pair(-dis[v], v));
            }
        }
    }
}

signed main() {
#ifndef ONLINE_JUDGE
    freopen("5304.in", "r", stdin);
    freopen("5304.out", "w", stdout);
#endif
    T = read();
    while (T --) {
        n = read(), m = read(), k = read();
        g.clear();
        ans = 2e18;
        for (int i = 1, u, v, w; i <= m; ++ i) {
            u = read(), v = read(), w = read();
            g.add (u, v, w);
        }
        for (int i = 1; i <= k; ++ i) {
            Node[i] = read();
        }
        s = n + 1, t = n + 2;
        for (int bit = 0; bit < 17; ++ bit) {
            f = g;
            for (int i = 1; i <= k; ++ i) {
                if ((i >> bit) & 1)
                    f.add(Node[i], t, 0);
                else
                    f.add(s, Node[i], 0);
            }

            dij();
            ans = min(ans, dis[t]);
        }
        for (int bit = 0; bit < 17; ++ bit) {
            f = g;
            for (int i = 1; i <= k; ++ i) {
                if (((i >> bit) & 1) == 0)
                    f.add(Node[i], t, 0);
                else
                    f.add(s, Node[i], 0);
            }
            dij();
            ans = min(ans, dis[t]);
        }
        
        write(ans);
        puts(" ");
    }
    
    return 0;
}
2021/7/17 09:22
加载中...