結果
| 問題 |
No.5018 Let's Make a Best-seller Book
|
| コンテスト | |
| ユーザー |
nikaj
|
| 提出日時 | 2023-10-01 13:47:53 |
| 言語 | C++17(gcc12) (gcc 12.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 51 ms / 400 ms |
| コード長 | 6,319 bytes |
| コンパイル時間 | 2,006 ms |
| コンパイル使用メモリ | 203,948 KB |
| 実行使用メモリ | 24,384 KB |
| スコア | 4,377 |
| 平均クエリ数 | 52.00 |
| 最終ジャッジ日時 | 2023-10-01 13:48:04 |
| 合計ジャッジ時間 | 9,966 ms |
|
ジャッジサーバーID (参考情報) |
judge12 / judge13 |
| 純コード判定しない問題か言語 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 100 |
ソースコード
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)
const int N = 16;
int n, T, x, query_type, turn, sold;
ll money;
int L[N], S[N], P[N], R[N];
double D[N], Mult[64][N];
string ans;
const int DX[]={-1,0,1,0};
const int DY[]={0,1,0,-1};
const string CS="nesw";
const string HS="URDL";
void Prepare() {
}
void Query() {
if (STANDARD) {
cout << query_type;
if (query_type == 1) {
F0(i, n) cout << " " << L[i];
} else {
cout << " " << x;
}
cout << endl;
ll pmoney = money;
cin >> money;
F0(i, n) cin >> S[i];
F0(i, n) {
if (query_type == 1) R[i] += L[i];
int ep = P[i];
if (query_type == 2) ep += x;
if (S[i] * 10 >= 3 * R[i]) ep = min(ep + 1, 60);
if (S[i] * 10 < R[i]) ep = max(ep - 1, -60);
cin >> P[i];
//cerr << endl << i << " " << P[i] << " " << ep << " " << R[i] << " " << S[i] << endl;
assert(P[i] == ep);
}
F0(i, n) {
int er = R[i];
er -= S[i];
cin >> R[i];
assert(R[i] == er);
}
} else {
if (query_type == 1) {
F0(i, n) { money -= L[i] * 500; R[i] += L[i]; }
assert(money >= 0);
} else {
assert(1 <= x && x <= 5);
money -= 500000 << (x - 1);
assert(money >= 0);
F0(i, n) { P[i] += x; P[i] = min(P[i], 60); P[i] = max(P[i], -60); }
}
F0(i, n) {
S[i] = min(R[i], int(pow(R[i], 0.5) * D[i] * Mult[turn][i]));
if (S[i] * 10 >= 3 * R[i]) P[i] = min(P[i] + 1, 60);
if (S[i] * 10 < 1 * R[i]) P[i] = max(P[i] - 1, -60);
sold += S[i];
money += S[i] * 1000;
R[i] -= S[i];
}
}
}
void Solve() {
for (turn = 0; turn < T; turn++) {
query_type = 1;
F0(i, n) L[i] = money / (500 * n);
//if (turn == 1) { query_type = 2; x = 2; }
Query();
}
}
void ReadInput() {
cin >> T >> n >> money;
}
void ReadStuff() {
cin >> T >> n;
money = 2000000;
F0(i, n) cin >> D[i];
F0(turn, T) F0(i, n) cin >> Mult[turn][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) {
ReadInput();
Solve();
return 0;
}
for (int seed=seed1; seed<=seed2; seed++) {
if(seed>=1 && seed<=100) {
char inp[128];
sprintf(inp, "in/%04d.txt", seed);
char outp[128];
sprintf(outp, "out/%04d.txt", seed);
ignore = freopen(inp, "r", stdin);
ReadStuff();
//cerr << "Seed #" << seed << " ";
Solve();
cout << "Score = " << sold << endl;
} else {
// Generate
throw;
}
}
return 0;
}
nikaj