結果
問題 | No.5016 Worst Mayor |
ユーザー |
![]() |
提出日時 | 2023-04-29 16:39:13 |
言語 | C++17(gcc12) (gcc 12.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 1,645 ms / 2,000 ms |
コード長 | 5,814 bytes |
コンパイル時間 | 4,840 ms |
コンパイル使用メモリ | 270,296 KB |
実行使用メモリ | 24,348 KB |
スコア | 5,438,959,620 |
平均クエリ数 | 400.00 |
最終ジャッジ日時 | 2023-04-29 16:40:41 |
合計ジャッジ時間 | 70,629 ms |
ジャッジサーバーID (参考情報) |
judge11 / judge12 |
純コード判定しない問題か言語 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 50 |
ソースコード
#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;bool flag = 1;// ll u = 1000000, v = 1;rep(i, 0, T) {ll u, v;cin >> u >> v;if (u == -1 && v == -1)return 0;// 初めは協力者if (v <= 99) {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 = (T - i) * 50000 +(ll)(1e7 / (long double)sqrt(v)) / max((ll)1, (200 - i));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++;elsecontinue;}if (dir == 1) {if (to / 14 != 13)to += 14;elsecontinue;}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;} else {cout << 3 << endl;u += 50000;flag = 0;}} else {cout << 3 << endl;u += 50000;continue;}}}