玄学啊!
查看原帖
玄学啊!
1265632
xhxxwcr楼主2024/8/14 16:03
#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;
}
2024/8/14 16:03
加载中...