1 条题解
-
0
本题可以看出来一定是一个环的问题,需要找到这个环中的和的最大值,因为是可能得到的最大值,根据样例可以发现中间所到达的点的值也可以被记录,所以只需判环将该环中的值取一个最大值即可 注意:这里可以是负数
#include<cstdio> #include<iostream> #include<vector> #include<map> #include<cstring> #include<array> #include<queue> #include<algorithm> #include<set> #include<cmath> using namespace std; using i64=long long; //using i128=__int128; const i64 INF=1e18; const int mod=998244353; //const int N=1e9+7; void solve(){ int n,k; cin>>n>>k; vector<i64>p(n+1),c(n+1); i64 ans=-INF; for(int i=1;i<=n;i++)cin>>p[i]; for(int i=1;i<=n;i++)cin>>c[i]; for(int i=1;i<=n;i++){ int j=i; i64 sum=0; vector<i64>vec; while(true){ j=p[j]; sum+=c[j]; vec.push_back(sum); if(i==j)break; } for(int s=0;s<vec.size()&&s<k;s++){ if(sum<=0)ans=max(ans,vec[s]); else{ int cnt=(k-s-1)/vec.size(); ans=max(ans,vec[s]+cnt*sum); } } } cout<<ans<<'\n'; } int main(){ int _=1; //cin>>_; while(_--)solve(); return 0; }
信息
- ID
- 290
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 8
- 标签
- (无)
- 递交数
- 32
- 已通过
- 6
- 上传者