社区讨论

是不是BUG啊,蜜汁TLE

P1967[NOIP 2013 提高组] 货车运输参与者 2已保存回复 4

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
4 条
当前快照
1 份
快照标识符
@mi6w6ypk
此快照首次捕获于
2025/11/20 11:49
4 个月前
此快照最后确认于
2025/11/20 11:49
4 个月前
查看原帖
交上去没过几秒钟全部TLE,下了第一个数据用在线IDE跑没毛病。。。
CPP
#include<bits/stdc++.h>

using namespace std;

const int maxn = 10000 + 5;
const int maxm = 50000 + 5;
const int maxq = 30000 + 5;

int n, m, q;

int root, fa[maxn + maxm], deep[maxn + maxm], size[maxn + maxm], son[maxn + maxm], top[maxn + maxm];
bool used[maxn + maxm];
struct Node {
    int u, v, z;
    bool operator<(const Node &r) const {
        return z > r.z;
    }
} node[maxn + maxm];

int pre[maxn + maxm];
int find(int x) { return pre[x] ? pre[x] = find(pre[x]) : x; }

void inline Debug();

void inline Init()
{
    cin >> n >> m;
    int u, v, z;
    for(int i = 1; i <= m; ++i) {
        cin >> u >> v >> z;
        node[i + n] = (Node) { u, v, z };
    }
    sort(node + n + 1, node + n + m + 1);
}

void inline Kruskal()
{
    for(int i = n + 1; i <= n + m + 1; ++i) {
        int u =node[i].u, v = node[i].v;
        if(find(u) == find(v)) continue;
//        cout << "Connect " << find(u) << ' ' << find(v) << " with " << i << endl;
        node[i].u = find(u), node[i].v = find(v);
        fa[find(u)] = fa[find(v)] = pre[find(u)] = pre[find(v)] = i;
        used[i] = true;
    }
}

void dfs1(int i)
{
    size[i] = 1;
    int u = node[i].u, v = node[i].v;
    if(!u) return;
    
    deep[u] = deep[v] = deep[i] + 1;
//    cout << "In " << i << ", left is " << u << ", right is " << v << endl;
    dfs1(u);
    dfs1(v);
    size[i] += size[u] + size[v];
    if(size[u] > size[v]) son[i] = u;
    else son[i] = v;
//    cout << "Out " << i << ", size is " << size[i] << ", hson is " << son[i] << endl;
}

void dfs2(int i)
{
    int u = node[i].u, v = node[i].v;
    if(!u) return;
    
    if(son[i] == u) {
        top[u] = top[i];
        top[v] = v;
    } else {
        top[u] = u;
        top[v] = top[i];
    }
    dfs2(u); dfs2(v);
}

int inline lca(int u, int v) 
{
    while(top[u] != top[v]) {
        if(deep[top[u]] > deep[top[v]]) u = fa[top[u]];
        else v = fa[top[v]];
    }
    return deep[u] < deep[v] ? u : v;
}

void inline Solve()
{
    cin >> q;
    int u, v;
    Kruskal();
    top[root] = root;
    for(int i = n + 1; i <= n + m + 1; ++i) {
        if(used[i] && !fa[i]) {
            top[i] = i;
            deep[i] = 0;
            dfs1(i), dfs2(i);
        }
    }
    for(int i = 1; i <= n; ++i) if(!fa[i]) top[i] = i;
//    Debug();
    while(q--) {
        cin >> u >> v;
        cout << (find(u) == find(v) ? node[lca(u, v)].z : -1) << endl;
    } 
}

void inline Debug()
{
    cout << "Debuging------------------------\n";
    for(int i = 1; i <= n + m + 1; ++i) {
        cout << top[i] << endl;
    }
    cout << "End Debug-----------------------\n";
}

int main()
{
    Init();
    Solve();
    return 0;
}
kkksc03chen_zhelin_toto

回复

4 条回复,欢迎继续交流。

正在加载回复...