90 pts WA on #2 求调
查看原帖
90 pts WA on #2 求调
817044
cjwdyzxfblzs楼主2023/8/18 11:28

思路大概就是记录一下一条边是否为树边,通过找LCA确定优先级,然后输出答案。

但是不知道为什么会一直WA on #2

My code :

#include <bits/stdc++.h>
using namespace std;
#define  debug(_)  std::cout << "it is ok " << (_) << std::endl
#define int long long
inline int read(){
    int x = 0; int f = 1; char ch = getchar();
    while (ch < '0' || ch > '9') { if (ch == '-') f = 0; ch = getchar(); }
    while (ch >= '0' && ch <= '9') { x = (x << 3) + (x << 1) + (ch ^ 48); ch = getchar(); }
    return f ? x : -x;
}
inline void write(int x){
    if (x < 0) putchar('-'), x = -x;
    if (x > 9) write(x / 10);
    putchar(x % 10 + 48);
}
const int N = 2e6;
std::vector<int> graph[N];
std::pair<int, int> g[N];
std::queue<int> q;
std::bitset<N> st, vis;
std::pair<int, int> G[N], g2[N];
int n, m, result[N];
int dep[N], fa[N][32], pa[N];
int size[N], son[N], id, length;
int isit[N], sta[N], top;
inline void dfs(int u, int ff)
{
    dep[u] = dep[ff] + 1;
    fa[u][0] = ff;
    for(int i = 1; i <= 30; ++ i )
        fa[u][i] = fa[fa[u][i - 1]][i - 1];
    for (auto v : graph[u])
    {
        if (v == ff) continue;
        dfs(v, u);
    }
}
inline void lca(int x, int y){
    if(x == y) return;
    if(dep[x] < dep[y]) std::swap(x, y);
    int t = dep[x] - dep[y];
    for(int i = 30; i >= 0; -- i )
        if(t >= 1 << i){
            t -= 1 << i;
            x = fa[x][i];
        }
    if(x == y) return;
    for(int i = 30; i >= 0; -- i )
        if(fa[x][i] ^ fa[y][i]){
            x = fa[x][i];
            y = fa[y][i];
        }
    
    pa[y] = x;
}
void Work(int u, int ff)
{
    for (auto v : graph[u]) {
        if (v == ff) continue;
        int o = v; top = 0;
        if (isit[v] ^ u) sta[ ++ top] = v; 
        while(pa[v]){
            if (isit[pa[v]]) break;
            v = pa[v];
            sta[++top] = v;
        }
        while(top){
            write(sta[top]), putchar(32), write(u), putchar(10);
            isit[sta[top--]] = u;
        }
        Work(o, u);
    }
}
bool cmp(pair<int, int> &a, pair<int, int> &b) {
    if (a.first != b.first) return a.first < b.first;
    return a.second <= b.second;
}
signed main()
{
    n = read(), m = read();
    for (int i = 1; i <= m; i ++ ) {
        int u, v; u = read(), v = read();
        if (u > v) std::swap(u, v);
        g2[i] = std::make_pair(u, v);
    }
    std::sort(g2 + 1, g2 + m + 1, cmp);
    g[ ++ length] = g2[1];
    for (int i = 2; i <= m; i ++ ) {
        if (g2[i] == g2[i - 1] || g2[i] == make_pair(g2[i - 1].second, g2[i - 1].second)) {
            G[ ++ id] = g2[i];
            continue;
        } else 
            g[ ++ length] =  g2[i];
    }
    for (int i = 1; i <= n; i ++ )
        result[i] = read();
    for (int i = 2; i <= n; i ++ ) {
        graph[i].push_back(result[i]), graph[result[i]].push_back(i);
        int it = std::lower_bound(g + 1, g + length + 1, std::make_pair(std::min(i, result[i]), std::max(i, result[i]))) - g;
        vis[it] = true;
    }
    dfs(1, 0);
    for (int i = 1; i <= length; i ++ )
        if (!vis[i])
        {
            lca(g[i].first, g[i].second);
            G[ ++ id] = g[i];
        }
    Work(1, 1);
    for (int i = 1; i <= id; i ++ )
        write(G[i].first), putchar(32), write(G[i].second), putchar(10);
    return 0;
}
2023/8/18 11:28
加载中...