結果

問題 No.5016 Worst Mayor
ユーザー ogawakunogawakun
提出日時 2023-04-29 16:59:17
言語 C++17
(gcc 12.3.0 + boost 1.83.0)
結果
AC  
実行時間 229 ms / 2,000 ms
コード長 5,759 bytes
コンパイル時間 4,882 ms
コンパイル使用メモリ 270,424 KB
実行使用メモリ 24,396 KB
スコア 3,365,079,900
平均クエリ数 400.00
最終ジャッジ日時 2023-04-29 17:01:17
合計ジャッジ時間 18,719 ms
ジャッジサーバーID
(参考情報)
judge11 / judge16
純コード判定しない問題か言語
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 200 ms
23,664 KB
testcase_01 AC 201 ms
23,376 KB
testcase_02 AC 203 ms
23,400 KB
testcase_03 AC 225 ms
23,664 KB
testcase_04 AC 199 ms
23,376 KB
testcase_05 AC 201 ms
24,024 KB
testcase_06 AC 200 ms
23,520 KB
testcase_07 AC 198 ms
24,300 KB
testcase_08 AC 202 ms
23,640 KB
testcase_09 AC 202 ms
23,340 KB
testcase_10 AC 225 ms
23,412 KB
testcase_11 AC 200 ms
24,036 KB
testcase_12 AC 227 ms
23,844 KB
testcase_13 AC 202 ms
23,640 KB
testcase_14 AC 199 ms
24,036 KB
testcase_15 AC 199 ms
23,376 KB
testcase_16 AC 200 ms
23,424 KB
testcase_17 AC 201 ms
23,664 KB
testcase_18 AC 200 ms
23,424 KB
testcase_19 AC 204 ms
23,628 KB
testcase_20 AC 202 ms
24,024 KB
testcase_21 AC 201 ms
23,988 KB
testcase_22 AC 200 ms
23,520 KB
testcase_23 AC 200 ms
23,556 KB
testcase_24 AC 228 ms
24,024 KB
testcase_25 AC 200 ms
23,676 KB
testcase_26 AC 203 ms
24,036 KB
testcase_27 AC 203 ms
23,988 KB
testcase_28 AC 203 ms
24,036 KB
testcase_29 AC 204 ms
24,312 KB
testcase_30 AC 200 ms
24,012 KB
testcase_31 AC 200 ms
24,036 KB
testcase_32 AC 201 ms
23,832 KB
testcase_33 AC 203 ms
24,396 KB
testcase_34 AC 203 ms
24,300 KB
testcase_35 AC 197 ms
23,628 KB
testcase_36 AC 194 ms
23,424 KB
testcase_37 AC 200 ms
23,712 KB
testcase_38 AC 199 ms
23,832 KB
testcase_39 AC 202 ms
23,628 KB
testcase_40 AC 205 ms
24,000 KB
testcase_41 AC 201 ms
23,640 KB
testcase_42 AC 201 ms
24,312 KB
testcase_43 AC 194 ms
24,336 KB
testcase_44 AC 200 ms
23,628 KB
testcase_45 AC 229 ms
23,412 KB
testcase_46 AC 202 ms
23,388 KB
testcase_47 AC 201 ms
23,364 KB
testcase_48 AC 199 ms
23,640 KB
testcase_49 AC 205 ms
23,400 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <atcoder/all>
#include <bits/stdc++.h>
using namespace std;
using namespace atcoder;
using namespace chrono;

typedef long long ll;
typedef pair<ll, ll> P;
typedef vector<int> vi;
typedef vector<ll> vll;
typedef vector<P> vP;
typedef vector<string> vs;
typedef vector<vi> vvi;
#define rep(i, l, n) for (ll i = (ll)(l); i < (ll)(n); i++)
#define repd(i, n, l) for (ll i = (ll)(n); i > (ll)(l); i--)
#define Copy(from, to) copy(from.begin(), from.end(), to.begin())
#define Sort(a) sort(a.begin(), a.end())
#define gSort(a) sort(a.begin(), a.end(), greater())
#define Unique(a) sort(a.begin(), a.end())
template <class T, class S> inline bool chmax(T &a, const S &b) {
  return (a < b ? a = b, 1 : 0);
}
template <class T, class S> inline bool chmin(T &a, const S &b) {
  return (a > b ? a = b, 1 : 0);
}
#define dPQ priority_queue<ll, vll, greater<ll>>
#define PQ priority_queue<ll, vll>
#define INF INT_MAX
#define INFF (9223372036854775800)
#define TIME_LIMIT (1.5)
#define def (201010)
// #define MOD (1000000007)
#define MOD (998244353)
#define PI (3.14159265359)

ll N, T;
vll A, B, C, D;

// ll calc_gain(map<P, int> &highway) {
//   ll ret = 0;
//   rep(i, 0, N) {
//     vvi dp(14, vi(14, 0));
//     ll from = B[i] <= D[i] ? A[i] * 14 + B[i] : C[i] * 14 + D[i];
//     ll to = B[i] > D[i] ? A[i] * 14 + B[i] : C[i] * 14 + D[i];
//     // 左上→右下
//     if (from / 14 < to / 14) {
//       rep(h, from / 14, to / 14 + 1) {
//         rep(w, from % 14, to % 14 + 1) {
//           if (h == from / 14 && w == from % 14)
//             continue;
//           ll mi = min(h * 14 + w - 1, h * 14 + w);
//           ll ma = max(h * 14 + w - 1, h * 14 + w);
//           if (w != 0)
//             chmax(dp[h][w], dp[h][w - 1] + highway[{mi, ma}]);
//           mi = min((h - 1) * 14 + w, h * 14 + w);
//           ma = max((h - 1) * 14 + w, h * 14 + w);
//           if (h != 0)
//             chmax(dp[h][w], dp[h - 1][w] + highway[{mi, ma}]);
//         }
//       }
//     }
//     // 左下→右上
//     else {
//       repd(h, from / 14, to / 14 - 1) {
//         rep(w, from % 14, to % 14 + 1) {
//           if (h == from / 14 && w == from % 14)
//             continue;
//           ll mi = min(h * 14 + w - 1, h * 14 + w);
//           ll ma = max(h * 14 + w - 1, h * 14 + w);
//           if (w != 0)
//             chmax(dp[h][w], dp[h][w - 1] + highway[{mi, ma}]);
//           mi = min((h + 1) * 14 + w, h * 14 + w);
//           ma = max((h + 1) * 14 + w, h * 14 + w);
//           if (h != 13)
//             chmax(dp[h][w], dp[h + 1][w] + highway[{mi, ma}]);
//         }
//       }
//     }

//     ret += 60 * dp[to / 14][to % 14];
//   }
//   // cout << ret / 60 << endl;
//   return ret;
// }

ll calc_gain(map<P, int> &highway) {
  ll ret = 0;
  rep(i, 0, N) {
    auto ite = highway.begin();
    while (ite != highway.end()) {
      if (ite->second == 0) {
        highway.erase(ite++);
        continue;
      }

      ll mih = min(ite->first.first / 14, ite->first.second / 14);
      ll mah = max(ite->first.first / 14, ite->first.second / 14);
      ll miw = min(ite->first.first % 14, ite->first.second % 14);
      ll maw = max(ite->first.first % 14, ite->first.second % 14);
      if (min(A[i], C[i]) <= mih && mah <= max(A[i], C[i]) &&
          min(B[i], D[i]) <= miw && maw <= max(B[i], D[i]))
        ret += 60;
      ite++;
    }
  }

  return ret;
}

double ela_times(system_clock::time_point &clock) {
  return duration_cast<microseconds>(system_clock::now() - clock).count() *
         1e-6;
}

int main() {
  auto startClock = system_clock::now();
  cin >> N >> T;
  rep(i, 0, N) A.resize(N), B.resize(N), C.resize(N), D.resize(N);
  rep(i, 0, N) cin >> A[i] >> B[i] >> C[i] >> D[i];
  rep(i, 0, N) A[i]--, B[i]--, C[i]--, D[i]--;

  map<P, int> highway;
  int flag = 3;
  // ll u = 1000000, v = 1;
  rep(i, 0, T) {
    ll u, v;
    cin >> u >> v;
    if (u == -1 && v == -1)
      return 0;

    // 初めは協力者
    if (v <= 24) {
      cout << 2 << endl;
      v++;
      continue;
    }

    // 足りない場合は資金集め
    if (u < (ll)(1e7 / (long double)sqrt(v))) {
      cout << 3 << endl;
      u += 50000;
      continue;
    }

    if (flag && ela_times(startClock) < TIME_LIMIT) {
      P best_way = {-1, -1};
      ll best_score = (ll)(1e7 / (long double)sqrt(v));
      ll unit_gain = calc_gain(highway);
      rep(from, 0, 14 * 14 - 1) {
        rep(dir, 0, 2) {
          ll to = from;
          if (dir == 0) {
            if (to % 14 != 13)
              to++;
            else
              continue;
          }
          if (dir == 1) {
            if (to / 14 != 13)
              to += 14;
            else
              continue;
          }

          if (highway[{from, to}] == 1)
            continue;
          // cout << "a" << from / 14 << " " << from % 14 << " -> " << to / 14
          // << " "
          //      << to % 14 << " ";
          highway[{from, to}] = 1;
          ll predict_unit_gain = calc_gain(highway);
          // cout << predict_unit_gain << endl;
          if (best_score < (predict_unit_gain - unit_gain) * (T - i)) {
            best_score = (predict_unit_gain - unit_gain) * (T - i);
            best_way = {from, to};
          }
          highway.erase({from, to});
        }
      }

      if (best_way.first != -1) {
        highway[best_way] = 1;
        cout << 1 << " " << best_way.first / 14 + 1 << " "
             << best_way.first % 14 + 1 << " " << best_way.second / 14 + 1
             << " " << best_way.second % 14 + 1 << endl;
        flag--;
      } else {
        cout << 3 << endl;
        u += 50000;
        flag = 0;
      }
    } else {
      cout << 3 << endl;
      u += 50000;
      continue;
    }
  }
}
0