记录编号 582268 评测结果 AAAAAAAAAA
题目名称 Analysis of Pathes in Functional Graph 最终得分 100
用户昵称 Gravatar┭┮﹏┭┮ 是否通过 通过
代码语言 C++ 运行时间 4.530 s
提交时间 2023-09-07 16:56:15 内存使用 11.08 MiB
显示代码纯文本
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. const int N = 1e5+10;
  5. ll n,k,cnt,tot,mi;
  6. struct made{
  7. ll ed,ver;
  8. }e[N];
  9. ll a[N],fa[N],ans[N],ss,su,d[N];
  10. ll v[N],kk;
  11. void work(ll x,ll end){
  12. if(x == end)return;
  13. d[tot]++;
  14. ss += e[x].ed;
  15. fa[x] = tot;
  16. work(e[x].ver,end);
  17. }
  18. void sou(ll x,ll s){
  19. if(v[x]){
  20. if(v[x] == s){
  21. ss = e[x].ed;
  22. tot++;
  23. d[tot] = 1;
  24. fa[x] = tot;
  25. work(e[x].ver,x);
  26. ans[tot] = ss;
  27. }
  28. return;
  29. }
  30. v[x] = cnt;
  31. sou(e[x].ver,s);
  32. }
  33. void work_(ll x,ll end){
  34. if(x == end)return;
  35. mi = min(e[x].ed,mi);
  36. work_(e[x].ver,end);
  37. }
  38. void dfs(ll x){
  39. if(fa[x]){
  40. su += ans[fa[x]] * ll(kk / d[fa[x]]);
  41. if(kk >= d[fa[x]]){
  42. mi = min(e[x].ed,mi);
  43. work_(e[x].ver,x);
  44. }
  45. kk -= (kk / d[fa[x]]) * d[fa[x]];
  46. }
  47. if(kk == 0)return;
  48. mi = min(mi,e[x].ed);
  49. su += e[x].ed;
  50. kk--;
  51. dfs(e[x].ver);
  52. }
  53. int main() {
  54. freopen("pathsjump.in","r",stdin);
  55. freopen("pathsjump.out","w",stdout);
  56. scanf("%lld%lld",&n,&k);
  57. for(int i = 1;i <= n;i++)scanf("%lld",&a[i]);
  58. for(int i = 1;i <= n;i++){
  59. ll x;
  60. scanf("%lld",&x);
  61. e[i].ver = a[i],e[i].ed = x;
  62. }
  63. for(int i = 1;i <= n;i++){
  64. if(!v[i]){
  65. cnt++;
  66. sou(i,cnt);
  67. }
  68. }
  69. // for(int i = 1;i <= n;i++)printf("%d ",d[i]);
  70. // printf("\n");
  71. for(int i = 1;i <= n;i++){
  72. kk = k,su = 0,mi = INT_MAX;
  73. dfs(i);
  74. printf("%lld %lld\n",su,mi);
  75. }
  76. return 0;
  77. }