Wrong answer on test 5 求调
查看原帖
Wrong answer on test 5 求调
923947
_sunkuangzheng_楼主2023/10/27 18:44

想 + 写 + 调这题 2h 了,真不知道哪错了,思路基本和第一篇题解一样,可能在扩展链的时候寄了,求助 /kel

/**
 *    author: sunkuangzheng
 *    created: 27.10.2023 17:37:28
**/
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N = 5e5+5;
int t,n,u,v,fa[N][24],dep[N],uu,ans[N],siz[N],l,r;vector<int> g[N];
void dfs(int u,int f){
    fa[u][0] = f,dep[u] = dep[f] + 1,siz[u] = 1;
    for(int i = 1;i <= 20;i ++) fa[u][i] = fa[fa[u][i-1]][i-1];
    for(int v : g[u]) if(v != f) dfs(v,u),siz[u] += siz[v];
}int lca(int u,int v){
    if(dep[u] < dep[v]) swap(u,v);
    while(dep[u] > dep[v]) u = fa[u][__lg(dep[u] - dep[v])];
    for(int i = 20;i >= 1;i --) if(fa[u][i] != fa[v][i]) u = fa[u][i],v = fa[v][i];
    return (u == v ? u : fa[u][0]);
}signed main(){
    ios::sync_with_stdio(0),cin.tie(0);
    cin >> t;
    while(t --){
        cin >> n,ans[n + 1] = 0;
        for(int i = 1;i <= n;i ++) ans[i] = 0;
        for(int i = 1;i <= n;i ++) g[i].clear();int nb = 1;
        for(int i = 1;i <= n;i ++) for(int j = 0;j <= 22;j ++) fa[i][j] = 0;
        for(int i = 1;i < n;i ++) cin >> u >> v,g[++u].push_back(++v),g[v].push_back(u);
        dfs(1,0),l = r = 1,ans[1] = 0;int ed = 0;
        for(int v : g[1]) ans[1] += siz[v] * nb,nb += siz[v]; 
        cout << n * (n - 1) / 2 - ans[1] << " ";
        for(int i = 2;i <= n;i ++){
            int l1 = lca(l,i),l2 = lca(r,i);
            if(l2 == r) r = i; else if(l1 == l && (lca(l,r) != l || lca(i,r) == l)) l = i;
            else if(l1 == i || l2 == i);
            else {ans[i] = 0;break;}
            if(dep[r] < dep[l]) swap(l,r);
            if(l == 1){
                if(!ed){for(u = r;fa[u][0] != 1;u = fa[u][0]);ed = u;}
                ans[i] = siz[r] * (siz[l] - siz[ed]);
            }else ans[i] = siz[l] * siz[r];
        }for(int i = 1;i <= n;i ++) cout << ans[i] - ans[i+1] << " ";
        cout << "\n";
    }
}

说句闲话:开始写这道题的时候它还是紫的 qwq。

2023/10/27 18:44
加载中...