比赛 2025.3.29 评测结果 AAAAAAAAAA
题目名称 Analysis of Pathes in Functional Graph 最终得分 100
用户昵称 flyfree 运行时间 4.233 s
代码语言 C++ 内存使用 118.59 MiB
提交时间 2025-03-29 09:26:15
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define pir pair<ll,ll>
#define ls first
#define rs second
#define mp make_pair
#define mod
#define MAXN 100010
#define qmod(x) (x>mod?x-mod:x)
inline ll read(){
    ll x = 0,f = 1;
    char c = getchar();
    while(c < '0'||c > '9'){
        if(c == '-')f = -1;
        c = getchar();
    }
    while(c >= '0'&&c <= '9'){
        x = x*10+c-'0';
        c = getchar();
    }
    return x*f;
}
// ll hd[MAXN],ed[MAXN],nxt[MAXN];
// ll idx;
// void build(ll x, ll y){
//     ++ idx;
//     nxt[idx] = hd[x];
//     ed[idx] = y;
//     hd[x] = idx;
// }
// ll dfn[MAXN],lst[MAXN];
// bool ins[MAXN],inrol[MAXN];
// ll stp,scc;
// ll t[MAXN],tp;
// vector <ll> rol[MAXN],vec[MAXN];
ll n,k;
ll val[MAXN];
ll sum[MAXN][50],minz[MAXN][50],fa[MAXN][50];
ll ans_sum[MAXN],ans_minz[MAXN];


// void clear(ll y){
//     ++ scc;
//     while(tp > 0){
//         ll now = t[tp];
//         -- tp;
//         rol[scc].push_back(now);
//         ins[now] = false;
//         inrol[now] = true;
//         if(now == y)break;
//     }
// }


// void Tarjan(ll now){
//     ++ stp;
//     dfn[now] = lst[now] = stp;
//     ++ tp;
//     t[tp] = now;
//     ins[now] = true;
//     for(int i = hd[now];i;i = nxt[i]){
//         ll y = ed[i];
//         if(!dfn[y]){
//             Tarjan(y);
//             lst[now] = min(lst[now], lst[y]);
//         }else if(ins[y])lst[now] = min(lst[now], dfn[y]);
//     }
//     if(lst[now] >= dfn[now]){
//         if(t[tp] == now) -- tp;
//         else clear(now);
//     }
// }


pir get_k(ll x){
    ll re_sum = 0,re_min = 1e18;
    ll res = k;
    for(int i = 40;i >= 0; --i){
        if(res >= (1ll << i)){
            res -= 1ll << i;
            re_sum += sum[x][i];
            re_min = min(re_min, minz[x][i]);
            x = fa[x][i];
        }
    }
    return {re_sum, re_min};
}


// void dfs2(ll now){
//     if(!inrol[now]){
//         sum[now][0] = val[now];
//         minz[now][0] = val[now];
//         for(int i = 1;i <= 40; ++i)fa[now][i] = fa[fa[now][i - 1]][i - 1];
//         for(int i = 1;i <= 40; ++i)sum[now][i] = sum[now][i - 1] + sum[fa[now][i - 1]][i - 1];
//         for(int i = 1;i <= 40; ++i)minz[now][i] = min(minz[now][i - 1], minz[fa[now][i - 1]][i - 1]);
//     }
//     pir res = get_k(now);
//     ans_minz[now] = res.rs;
//     ans_sum[now] = res.ls;
//     for(int i = hd[now];i;i = nxt[i]){
//         ll y = ed[i];
//         if(inrol[y])continue;
//         dfs2(y);
//     }
// }


// void solve(ll now){
//     for(int i = 0;i < rol[now].size(); ++i){
//         ll y = rol[now][i];
//         sum[y][0] = val[y];
//         minz[y][0] = val[y];
//         // if(i == 0)fa[y][0] = rol[now][rol[now].size() - 1];
//         // else fa[y][0] = rol[now][i - 1];
//     }
//     for(int i = 1;i <= 40; ++i){
//         for(int j = 0;j < rol[now].size(); ++j){
//             ll y = rol[now][j];
//             fa[y][j] = fa[fa[y][j - 1]][j - 1];
//             sum[y][j] = sum[y][j -  1] + sum[fa[y][j - 1]][j - 1];
//             minz[y][j] = min(minz[y][j - 1], minz[fa[y][j - 1]][j - 1]);
//         }
//     }
//     for(int i = 0;i < rol[now].size(); ++i){
//         ll y = rol[now][i];
//         dfs2(y);
//     }
// }


int main(){
    freopen("pathsjump.in", "r", stdin);
    freopen("pathsjump.out", "w", stdout);
    n = read(),k = read();
    for(int i = 1;i <= n; ++ i){
        fa[i][0] = read();
        // build(fa[i][0], i);
    }
    for(int i = 1;i <= n; ++i){val[i] = read();
        sum[i][0] = val[i];
        minz[i][0] = val[i];
    }
    // for(int i = 1;i <= n; ++i){
    //     if(!dfn[i]){
    //         ll _stp = scc;
    //         Tarjan(i);
    //         if(scc > _stp){
    //             solve(scc);
    //         }
    //     }
    // }
    for(int i = 1;i <= 40; ++i){
        for(int j = 1;j <= n; ++j){
            // ll y = rol[now][j];
            fa[j][i] = fa[fa[j][i - 1]][i - 1];
            sum[j][i] = sum[j][i -  1] + sum[fa[j][i - 1]][i - 1];
            minz[j][i] = min(minz[j][i - 1], minz[fa[j][i - 1]][i - 1]);
        }
    }
    for(int i = 1;i <= n; ++i){
        pir res = get_k(i);
        cout << res.ls << " " << res.rs << endl;
    }
    return 0;
}