結果
問題 | No.5017 Tool-assisted Shooting |
ユーザー | nikaj |
提出日時 | 2023-07-16 18:59:29 |
言語 | C++11 (gcc 11.4.0) |
結果 |
TLE
|
実行時間 | - |
コード長 | 12,249 bytes |
コンパイル時間 | 1,885 ms |
コンパイル使用メモリ | 172,608 KB |
実行使用メモリ | 41,636 KB |
スコア | 4,076,949 |
平均クエリ数 | 100.00 |
最終ジャッジ日時 | 2023-07-16 19:05:40 |
合計ジャッジ時間 | 24,850 ms |
ジャッジサーバーID (参考情報) |
judge14 / judge13 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 1,684 ms
25,148 KB |
testcase_01 | AC | 1,797 ms
25,772 KB |
testcase_02 | AC | 1,529 ms
24,344 KB |
testcase_03 | AC | 1,716 ms
25,212 KB |
testcase_04 | AC | 1,597 ms
24,024 KB |
testcase_05 | AC | 1,707 ms
25,252 KB |
testcase_06 | AC | 1,712 ms
24,800 KB |
testcase_07 | AC | 1,725 ms
25,328 KB |
testcase_08 | AC | 1,644 ms
24,532 KB |
testcase_09 | AC | 1,665 ms
25,212 KB |
testcase_10 | AC | 1,756 ms
24,968 KB |
testcase_11 | AC | 1,688 ms
24,188 KB |
testcase_12 | AC | 1,787 ms
24,956 KB |
testcase_13 | AC | 1,713 ms
25,224 KB |
testcase_14 | AC | 1,879 ms
25,232 KB |
testcase_15 | AC | 1,911 ms
26,600 KB |
testcase_16 | AC | 1,654 ms
24,964 KB |
testcase_17 | AC | 1,746 ms
25,960 KB |
testcase_18 | AC | 1,771 ms
24,676 KB |
testcase_19 | AC | 1,790 ms
24,840 KB |
testcase_20 | AC | 1,778 ms
26,116 KB |
testcase_21 | AC | 1,830 ms
25,100 KB |
testcase_22 | AC | 1,555 ms
24,928 KB |
testcase_23 | AC | 1,783 ms
25,000 KB |
testcase_24 | AC | 1,811 ms
26,148 KB |
testcase_25 | AC | 1,809 ms
25,972 KB |
testcase_26 | AC | 1,658 ms
25,284 KB |
testcase_27 | AC | 1,729 ms
25,204 KB |
testcase_28 | AC | 1,890 ms
26,004 KB |
testcase_29 | AC | 1,633 ms
24,724 KB |
testcase_30 | AC | 1,608 ms
24,816 KB |
testcase_31 | AC | 1,686 ms
26,376 KB |
testcase_32 | AC | 1,848 ms
26,532 KB |
testcase_33 | AC | 1,928 ms
26,080 KB |
testcase_34 | AC | 1,714 ms
25,212 KB |
testcase_35 | AC | 1,869 ms
25,940 KB |
testcase_36 | AC | 1,674 ms
25,108 KB |
testcase_37 | AC | 1,754 ms
25,652 KB |
testcase_38 | AC | 1,780 ms
25,988 KB |
testcase_39 | AC | 1,917 ms
24,640 KB |
testcase_40 | AC | 1,762 ms
25,496 KB |
testcase_41 | AC | 1,668 ms
25,216 KB |
testcase_42 | AC | 1,791 ms
26,240 KB |
testcase_43 | AC | 1,784 ms
25,432 KB |
testcase_44 | AC | 1,816 ms
26,312 KB |
testcase_45 | AC | 1,715 ms
24,920 KB |
testcase_46 | AC | 1,864 ms
25,332 KB |
testcase_47 | AC | 1,583 ms
24,524 KB |
testcase_48 | AC | 1,953 ms
25,836 KB |
testcase_49 | AC | 1,816 ms
25,212 KB |
testcase_50 | AC | 1,794 ms
25,296 KB |
testcase_51 | AC | 1,836 ms
25,672 KB |
testcase_52 | AC | 1,897 ms
25,864 KB |
testcase_53 | AC | 1,729 ms
25,452 KB |
testcase_54 | AC | 1,918 ms
25,800 KB |
testcase_55 | AC | 1,648 ms
25,256 KB |
testcase_56 | AC | 1,826 ms
25,784 KB |
testcase_57 | AC | 1,614 ms
25,176 KB |
testcase_58 | AC | 1,724 ms
25,412 KB |
testcase_59 | AC | 1,873 ms
25,836 KB |
testcase_60 | AC | 1,672 ms
25,360 KB |
testcase_61 | AC | 1,626 ms
25,288 KB |
testcase_62 | AC | 1,592 ms
25,068 KB |
testcase_63 | AC | 1,756 ms
24,920 KB |
testcase_64 | AC | 1,807 ms
25,484 KB |
testcase_65 | TLE | - |
testcase_66 | AC | 1,995 ms
26,344 KB |
testcase_67 | AC | 1,689 ms
24,744 KB |
testcase_68 | AC | 1,629 ms
25,644 KB |
testcase_69 | AC | 1,713 ms
25,204 KB |
testcase_70 | AC | 1,696 ms
24,856 KB |
testcase_71 | AC | 1,619 ms
26,524 KB |
testcase_72 | AC | 1,507 ms
24,728 KB |
testcase_73 | AC | 1,962 ms
25,756 KB |
testcase_74 | AC | 1,530 ms
24,684 KB |
testcase_75 | AC | 1,849 ms
26,224 KB |
testcase_76 | AC | 1,788 ms
25,000 KB |
testcase_77 | AC | 1,847 ms
26,284 KB |
testcase_78 | AC | 1,746 ms
25,908 KB |
testcase_79 | AC | 1,724 ms
25,512 KB |
testcase_80 | AC | 1,863 ms
25,788 KB |
testcase_81 | AC | 1,757 ms
24,976 KB |
testcase_82 | AC | 1,689 ms
25,484 KB |
testcase_83 | AC | 1,823 ms
24,668 KB |
testcase_84 | AC | 1,829 ms
26,048 KB |
testcase_85 | AC | 1,852 ms
26,144 KB |
testcase_86 | AC | 1,833 ms
25,540 KB |
testcase_87 | AC | 1,658 ms
25,128 KB |
testcase_88 | TLE | - |
testcase_89 | -- | - |
testcase_90 | -- | - |
testcase_91 | -- | - |
testcase_92 | -- | - |
testcase_93 | -- | - |
testcase_94 | -- | - |
testcase_95 | -- | - |
testcase_96 | -- | - |
testcase_97 | -- | - |
testcase_98 | -- | - |
testcase_99 | -- | - |
ソースコード
double TL = 0.01; int STANDARD = 1; int DBG = 0; #include <bits/stdc++.h> using namespace std; #define F0(i,n) for (int i=0; i<n; i++) #define F1(i,n) for (int i=1; i<=n; i++) #define CL(a,x) memset(x, a, sizeof(x)); #define SZ(x) ((int)x.size()) const int inf = 1000009; const double pi = acos(-1.0); typedef pair<int, int> pii; typedef long long ll; const double EPS = 1e-9; const int MOD = 998244353; #define PR(x) cerr << #x << "=" << x << endl template<class A, class B> ostream& operator<<(ostream& os, const pair<A, B>& p) { os << "(" << p.first << ", " << p.second << ")"; return os; } template<class A, class B, class C> ostream& operator<<(ostream& os, const tuple<A, B, C>& p) { os << "(" << get<0>(p) << ", " << get<1>(p) << ", " << get<2>(p) << ")"; return os; } istream& operator>>(istream& is, pii& p) { is>>p.first>>p.second; return is; } template<class T> ostream& operator<<(ostream& os, const vector<T>& v) { os << "["; F0(i,SZ(v)) { if (i>0) os << ","; os << v[i]; } os << "]"; return os; } template<class T> ostream& operator<<(ostream& os, const set<T>& v) { os << "{"; int f=1; for(auto i:v) { if(f)f=0;else os << ","; cerr << i; } os << "}" << endl; return os; } template<class T, class R> ostream& operator<<(ostream& os, const map<T,R>& v) { os << "{"; int f=1; for(auto i:v) { if(f)f=0;else os << ", "; cerr << i.first << ":" << i.second; } os << "}" << endl; return os; } //#pragma GCC optimize("O3") #ifndef __APPLE__ inline ll GetTSC() { ll lo, hi; asm volatile ("rdtsc": "=a"(lo), "=d"(hi)); return lo + (hi << 32); } inline double GetSeconds() { return GetTSC() / 3.0e9; } #else #include <sys/time.h> double GetSeconds() { timeval tv; gettimeofday(&tv, 0); return tv.tv_sec + tv.tv_usec * 1e-6; } #endif const int MAX_RAND = 1 << 30; struct Rand { ll x, y, z, w, o; Rand() {} Rand(ll seed) { reseed(seed); o = 0; } inline void reseed(ll seed) { x = 0x498b3bc5 ^ seed; y = 0; z = 0; w = 0; F0(i, 20) mix(); } inline void mix() { ll t = x ^ (x << 11); x = y; y = z; z = w; w = w ^ (w >> 19) ^ t ^ (t >> 8); } inline ll rand() { mix(); return x & (MAX_RAND - 1); } inline int nextInt(int n) { return rand() % n; } inline int nextInt(int L, int R) { return rand()%(R - L + 1) + L; } inline int nextBool() { if (o < 4) o = rand(); o >>= 2; return o & 1; } double nextDouble() { return rand() * 1.0 / MAX_RAND; } }; Rand my(2023); double saveTime; double t_o[20]; ll c_o[20]; void Init() { saveTime = GetSeconds(); F0(i, 20) t_o[i] = 0.0; F0(i, 20) c_o[i] = 0; } double Elapsed() { return GetSeconds() - saveTime; } void Report() { double tmp = Elapsed(); cerr << "-------------------------------------" << endl; cerr << "Elapsed time: " << tmp << " sec" << endl; double total = 0.0; F0(i, 20) { if (t_o[i] > 0) cerr << "t_o[" << i << "] = " << t_o[i] << endl; total += t_o[i]; } cerr << endl; //if (total > 0) cerr << "Total spent: " << total << endl; F0(i, 20) if (c_o[i] > 0) cerr << "c_o[" << i << "] = " << c_o[i] << endl; cerr << "-------------------------------------" << endl; } struct AutoTimer { int x; double t; AutoTimer(int x) : x(x) { t = Elapsed(); } ~AutoTimer() { t_o[x] += Elapsed() - t; } }; #define AT(i) AutoTimer a##i(i) //#define AT(i) int X, turn; int n, m, S, str, score, newX; string ans; const int N = 32; const int M = 64; int P[N]; const int W = 25; const int H = 60; const int DX[]={-1,0,1,0}; const int DY[]={0,1,0,-1}; const string CS="nesw"; const string HS="URDL"; int hp[M][N], pw[M][N], ihp[M][N], f[N]; double bv; int bmoves; int bdir; void Greedy() { bv = -1.0; for (int i = 1; i < H; i++) if (hp[i][X] > 0) { if ((i) * str >= hp[i][X]) { double av = 1.0 * pw[i][X] / ((hp[i][X] + str - 1) / str - 1); if (av > bv) { bv = av; newX = X; ans = "S"; } } break; } for (int dir = -1; dir <= 1; dir += 2) { int cX = X; F1(steps, 25) { if (hp[steps - 1][cX]) break; cX = (cX + dir + W) % W; if (hp[steps - 1][cX]) break; for (int i = steps; i < H; i++) if (hp[i][cX] > 0) { // TODO if ((i - steps + 1) * str >= hp[i][cX]) { double av = 1.0 * pw[i][cX] / (((hp[i][cX] + str - 1) / str) + steps - 2); if (av > bv) { bv = av; newX = (X + dir + W) % W; ans = dir == -1 ? "L" : "R"; } } break; } } } } struct State { vector<int> hits; int X; int S; int fd; ll Hash() { ll ret = S; ret = ret * 239 + X; for (int t : hits) ret = ret * 239 + t; return ret; } }; const int BB = 1 << 16; State bb[BB], ns; const int BUFF = 1 << 23; int buff[BUFF], buff_pos; int bn; typedef double EvalType; const int MAXB = 1000; set<pair<EvalType, int>> pq[MAXB+1]; unordered_map<ll, int> Hashes; int id[M][N], nx[M][N]; vector<pii> active; void Prepare() { active.clear(); F0(i, H) F0(j, W) if (hp[i][j]) { id[i][j] = SZ(active); active.push_back(pii(i, j)); } F0(i, H) F0(j, W) { int x = i + 1; while (x < H && !hp[x][j]) x++; nx[i][j] = x; } } inline int HP(int x, int y, vector<int>& hits) { return (x < H && hp[x][y]) ? hits[id[x][y]] : 0; } int Target(int x, int y, vector<int>& hits) { while (x < H && HP(x, y, hits) <= 0) x = nx[x][y]; return x < H ? id[x][y] : -1; } int BC, BW, maxT; void BeamStep() { F0(level, maxT) { F0(e, BW) { if (pq[level].empty()) break; int lindex = pq[level].begin()->second; pq[level].erase(pq[level].begin()); State s = bb[lindex]; // TODO: stay for (int dir = -1; dir <= 1; dir += 1) { int cX = s.X; int str = s.S / 100 + 1; //PR(dir); F1(steps, 13) { if (HP(level + steps - 1, cX, s.hits) > 0) break; cX = (cX + dir + W) % W; if (HP(level + steps - 1, cX, s.hits) > 0) break; int id = Target(level + steps, cX, s.hits); if (id == -1) continue; int i = active[id].first; //assert(active[id].second == cX); ll cur_hp = HP(i, cX, s.hits); //assert(cur_hp > 0); if ((i - (level + steps) + 1) * str < cur_hp) continue; int shots = (cur_hp + str - 1) / str; int moves = level + steps - 1 + shots; int newS = s.S + pw[active[id].first][active[id].second]; int fd = level == 0 ? dir : s.fd; double av = 1.0 * newS; if (av > bv) { bmoves = moves; bv = av; bdir = fd; } ll eval = -newS; if (moves < maxT && ((SZ(pq[moves]) < BC || (--pq[moves].end())->first > eval))) { ns = s; ns.X = cX; int attack_turn = level; for (int x = (s.X + dir + W) % W; x != cX; x = (x + dir + W) % W) { int nx = Target(attack_turn, x, s.hits); if (nx != -1) { ns.hits[nx] -= str; //assert(ns.hits[nx] > 0); } attack_turn++; } ns.hits[id] = 0; ns.S = newS; ns.fd = fd; ll h = ns.Hash(); if (!Hashes.count(h) || Hashes[h] <= ns.S) { Hashes[h] = ns.S; pq[moves].insert(make_pair(eval, bn)); if (SZ(pq[moves]) > BC) { pq[moves].erase(--pq[moves].end()); } bb[bn++] = ns; } } //cerr << steps << " " << cX << " " << id << " " << shots << endl; if (shots == 1 || dir == 0) break; } } } } } void BeamSearch() { Hashes.clear(); bv = -1.0; bdir = 0; maxT = 45; BC = 32; bn = 0; F0(i, maxT + 1) pq[i].clear(); Prepare(); State s0; s0.X = X; s0.hits.assign(SZ(active), 0); F0(i, SZ(active)) s0.hits[i] = hp[active[i].first][active[i].second]; s0.S = S; pq[0].insert(make_pair(0, 0)); bb[bn++] = s0; /* int BEAM_STEPS = 0; while (Elapsed() < TL) { BW = 1; BEAM_STEPS += BW; BeamStep(); } PR(BEAM_STEPS); */ BW = BC; BeamStep(); //cerr << turn << " " << bdir << " " << bv << " " << bmoves << endl; //PR(bn); //if (bn > BB / 4) throw; //PR(buff_pos); //if (buff_pos > BUFF / 4) throw; if (DBG) { F0(i, MAXB) { if (SZ(pq[i])) cerr << i << " " << SZ(pq[i]) << endl; } } } void Solve() { X = 12; str = 1; score = 0; S = 0; for (turn = 1; turn <= 1000; turn++) { cin >> n; if (n == -1) break; F0(h, H) F0(w, W) { hp[h][w] = hp[h + 1][w]; ihp[h][w] = ihp[h + 1][w]; pw[h][w] = pw[h + 1][w]; } F0(i, n) { int h, p, x; cin >> h >> p >> x; hp[H-1][x] = h; ihp[H-1][x] = h; pw[H-1][x] = p; f[x]++; } if (DBG && turn <= 187) { for (int i = 30; i >= 0; i--) { F0(j, W) if (hp[i][j]) { int d = (hp[i][j] + str - 1) / str; d = min(d, 9); cerr << d; } else cerr << "."; cerr << endl; } F0(j, W) if (j == X) cerr << "X"; else cerr << " "; cerr << endl << endl; } if (hp[0][X] > 0) { cerr << "Dead at " << turn << endl; break; } //Greedy(); BeamSearch(); if (bdir == -1) ans = "L"; else if (bdir == 0) ans = "S"; else ans = "R"; X = (X + bdir + W) % W; if (DBG) cerr << bv << " " << ans << endl; for (int i = 1; i < H; i++) if (hp[i][X] > 0) { pii t = pii(i, X); hp[t.first][t.second] -= str; if (hp[t.first][t.second] <= 0) { S += pw[t.first][t.second]; score += ihp[t.first][t.second]; str = 1 + S / 100; hp[t.first][t.second] = 0; ihp[t.first][t.second] = 0; pw[t.first][t.second] = 0; } break; } cout << ans << endl; } PR(score); if (0) F0(i, W) { cerr << P[i] << " " << f[i] << endl; } } void ReadInput() { F0(i, W) cin >> P[i]; } int main(int argc, char* argv[]) { int seed1 = 0, seed2 = 0; if(argc>1) { seed1 = seed2 = atoi(argv[1]); if (argc > 2) { DBG = atoi(argv[2]); } STANDARD=0; } if(STANDARD) { Solve(); return 0; } for (int seed=seed1; seed<=seed2; seed++) { if(seed>=0 && seed<5000) { char inp[128]; sprintf(inp, "in/%04d.txt", seed); char outp[128]; sprintf(outp, "out/%04d.txt", seed); ignore = freopen(inp, "r", stdin); ignore = freopen(outp, "w", stdout); ReadInput(); //cerr << "Seed #" << seed << " "; Solve(); //cout << "Score would be " << bscore << endl; } else { // Generate throw; } } return 0; }