Problem p02585 (C++) — buggy submission, verdict: Time Limit Exceeded

#include <bits/stdc++.h> //全てのヘッダファイルをインクルード

// ループ
#define rep(i, n) for (int i = 0; i < (n); i++) // 普通のループ
#define repr(i, n) for (int i = n; i >= 0; i--) // 逆ループ

// 型名省略
typedef long long ll;
// 値
static const ll MX = 100005;
static const ll MX_ll = 1e18;
const double PI = acos(-1); // π

using namespace std;

// ソート
#define SIZE_OF_ARRAY(array) (sizeof(array) / sizeof(array[0]))

// #include "./lib/generic/search.h"

// 文字列入力した小数値を小数点なくして返す
int changeDoubleToInt(string decimal) {
  decimal.erase(1, 1);                   // 小数点削除
  int n_decimal = atoi(decimal.c_str()); // c_strでchar*に変換後、atoiでintに変換
  return n_decimal;
}

// 最大公約数
int gcd(int a, int b) {
  if (b == 0)
    return a;
  return gcd(b, a % b);
}

// 素数判定(True/Falseを返却)
int IsPrime_tf(ll num) {
  if (num < 2)
    return false; // 0、1は素数でない
  else if (num == 2)
    return true; // 2は素数
  else if (num % 2 == 0)
    return false;                        // 偶数はあらかじめ除く
  for (ll i = 3; i * i <= num; i += 2) { // チェックは2～√nで十分
    if (num % i == 0)
      return false; // 素数でない
  }
  return true; // 素数である
}

// 素数判定(割れる値を返却)
ll IsPrime_value(ll num) {
  if (num < 2)
    return -1; // 0、1は素数でない
  else if (num == 2)
    return 2;                            // 2は素数
  for (ll i = 2; i * i <= num; i += 1) { // チェックは2～√nで十分
    if (num % i == 0)
      return i; // 素数でない
  }
  return num; // 素数である
}

int main() {
  ll n, k;
  cin >> n >> k;
  vector<ll> p(n), c(n);
  rep(i, n) cin >> p[i];
  rep(i, n) cin >> c[i];
  rep(i, n) p[i]--;
  ll ans = -1e18;
  rep(si, n) {
    int x = si; // 現在のポジション
    vector<int> s;
    ll tot = 0;
    while (1) {
      x = p[x];
      s.push_back(c[x]);
      tot += c[x];
      if (x == si)
        break; // 元の位置に戻ってきた
    }
    int l = s.size(); // 周期の流れ
    ll t = 0;
    rep(i, l) {
      t += s[i];
      if (i + 1 > k)
        break;
      ll now = t;
      if (tot > 0) {              // 1周期の値の合計が正
        ll e = (k - (i + 1)) / l; // l個で1周なので(k-i-1)/l周できる
        now += tot * e;
      }
      ans = max(ans, now);
    }
  }
  cout << ans << endl;
}

Error: TLE

Fixed submission:

#include <bits/stdc++.h> //全てのヘッダファイルをインクルード

// ループ
#define rep(i, n) for (int i = 0; i < (n); i++) // 普通のループ
#define repr(i, n) for (int i = n; i >= 0; i--) // 逆ループ

// 型名省略
typedef long long ll;
// 値
static const ll MX = 100005;
static const ll MX_ll = 1e18;
const double PI = acos(-1); // π

using namespace std;

// ソート
#define SIZE_OF_ARRAY(array) (sizeof(array) / sizeof(array[0]))

// #include "./lib/generic/search.h"

// 文字列入力した小数値を小数点なくして返す
int changeDoubleToInt(string decimal) {
  decimal.erase(1, 1);                   // 小数点削除
  int n_decimal = atoi(decimal.c_str()); // c_strでchar*に変換後、atoiでintに変換
  return n_decimal;
}

// 最大公約数
int gcd(int a, int b) {
  if (b == 0)
    return a;
  return gcd(b, a % b);
}

// 素数判定(True/Falseを返却)
int IsPrime_tf(ll num) {
  if (num < 2)
    return false; // 0、1は素数でない
  else if (num == 2)
    return true; // 2は素数
  else if (num % 2 == 0)
    return false;                        // 偶数はあらかじめ除く
  for (ll i = 3; i * i <= num; i += 2) { // チェックは2～√nで十分
    if (num % i == 0)
      return false; // 素数でない
  }
  return true; // 素数である
}

// 素数判定(割れる値を返却)
ll IsPrime_value(ll num) {
  if (num < 2)
    return -1; // 0、1は素数でない
  else if (num == 2)
    return 2;                            // 2は素数
  for (ll i = 2; i * i <= num; i += 1) { // チェックは2～√nで十分
    if (num % i == 0)
      return i; // 素数でない
  }
  return num; // 素数である
}

int main() {
  ll n, k;
  cin >> n >> k;
  vector<ll> p(n), c(n);
  rep(i, n) cin >> p[i];
  rep(i, n) cin >> c[i];
  ll ans = 0, ans_tmp = 0, ans_tmp_max = -100000000000, pos;
  rep(i, n) {
    ans_tmp = 0;
    ans_tmp_max = -100000000000;
    pos = i;
    rep(j, k) {
      ans_tmp += c[p[pos] - 1];
      pos = p[pos] - 1;
      if (ans_tmp > ans_tmp_max)
        ans_tmp_max = ans_tmp;
    }
    if (i == 0)
      ans = ans_tmp_max;
    else {
      if (ans_tmp_max > ans)
        ans = ans_tmp_max;
    }
  }
  cout << ans << endl;
}