#include<bits/stdc++.h>
using namespace std;
long long n,k;
long long p[5010],c[5010],sum[5010],cnt[5010],ans = -1e18;
int main(){
cin >> n >> k;
for(long long i = 1;i <= n;i++) cin >> p[i];
for(long long i = 1;i <= n;i++) cin >> c[i];
for(long long i = 1;i <= n;i++){
long long x = i;
while(1){
x = p[x];
sum[i] += c[x];
cnt[i]++;
if(x == i) break;
}
}
for(long long i = 1;i <= n;i++){
long long x = i;
long long r = 0;
long long s = 0;
while(1){
x = p[x];
r++;
s += c[x];
if(sum[i] > 0) ans = max(ans,s + sum[i] * ((k - r) / cnt[i]));
else ans = max(ans,s);
if(r == k || x == i) break;
}
}
cout << ans << endl;
return 0;
}
非ac代码
#include<bits/stdc++.h>
using namespace std;
long long n,k;
long long p[5010],c[5010],sum[5010],cnt[5010],ans = -1e18;
int main(){
cin >> n >> k;
for(long long i = 1;i <= n;i++) cin >> p[i];
for(long long i = 1;i <= n;i++) cin >> c[i];
for(long long i = 1;i <= n;i++){
long long x = i;
while(x != i){
x = p[x];
sum[i] += c[x];
cnt[i]++;
}
}
for(long long i = 1;i <= n;i++){
long long x = i;
long long r = 0;
long long s = 0;
while(r != k && x == i){
x = p[x];
r++;
s += c[x];
if(sum[i] > 0) ans = max(ans,s + sum[i] * ((k - r) / cnt[i]));
else ans = max(ans,s);
}
}
cout << ans << endl;
return 0;
}