結果
| 問題 |
No.5004 Room Assignment
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2021-12-07 02:21:12 |
| 言語 | C++17(gcc12) (gcc 12.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 143 ms / 5,000 ms |
| コード長 | 7,737 bytes |
| コンパイル時間 | 2,916 ms |
| 実行使用メモリ | 22,380 KB |
| スコア | 138,058,589 |
| 平均クエリ数 | 7642.12 |
| 最終ジャッジ日時 | 2021-12-07 02:21:34 |
| 合計ジャッジ時間 | 21,973 ms |
|
ジャッジサーバーID (参考情報) |
judge13 / judge15 |
| 純コード判定しない問題か言語 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 100 |
ソースコード
#pragma GCC optimize ("O3")
#include <bits/stdc++.h>
using namespace std;
using ll = long long int;
#define all(v) (v).begin(),(v).end()
#define repeat(cnt,l) for(typename remove_const<typename remove_reference<decltype(l)>::type>::type cnt={};(cnt)<(l);++(cnt))
#define rrepeat(cnt,l) for(auto cnt=(l)-1;0<=(cnt);--(cnt))
#define iterate(cnt,b,e) for(auto cnt=(b);(cnt)!=(e);++(cnt))
#define diterate(cnt,b,e) for(auto cnt=(b);(cnt)!=(e);--(cnt))
const long long MD = 1000000007ll; const long double PI = 3.1415926535897932384626433832795L;
template<typename T1, typename T2> inline ostream& operator <<(ostream &o, const pair<T1, T2> p) { o << '(' << p.first << ':' << p.second << ')'; return o; }
template<typename T> inline T& chmax(T& to, const T& val) { return to = max(to, val); }
template<typename T> inline T& chmin(T& to, const T& val) { return to = min(to, val); }
void bye(string s, int code = 0) { cout << s << endl; exit(code); }
mt19937_64 randdev(8901016);
template<typename T, typename Random = decltype(randdev), typename enable_if<is_integral<T>::value>::type* = nullptr>
inline T rand(T l, T h, Random& rand = randdev) { return uniform_int_distribution<T>(l, h)(rand); }
template<typename T, typename Random = decltype(randdev), typename enable_if<is_floating_point<T>::value>::type* = nullptr>
inline T rand(T l, T h, Random& rand = randdev) { return uniform_real_distribution<T>(l, h)(rand); }template<typename T>
static ostream& operator<<(ostream& o, const std::vector<T>& v) {
o << "[ "; for(const auto& e : v) o<<e<<' ';
return o << ']';
}
template <typename I>
struct MyRangeFormat{ I b,e; MyRangeFormat(I _b, I _e):b(_b),e(_e){} };
template<typename I>
static ostream& operator<<(ostream& o, const MyRangeFormat<I>& f) {
o << "[ "; iterate(i,f.b,f.e) o<<*i<<' ';
return o << ']';
}
template <typename I>
struct MyMatrixFormat{
const I& p; long long n, m;
MyMatrixFormat(const I& _p, long long _n, long long _m):p(_p),n(_n),m(_m){}
};
template<typename I>
static ostream& operator<<(ostream& o, const MyMatrixFormat<I>& f) {
o<<'\n';
repeat(i,(f.n)) {
repeat(j,f.m) o<<f.p[i][j]<<' ';
o<<'\n';
}
return o;
}
struct LOG_t { ~LOG_t() { cout << endl; } };
#define LOG (LOG_t(),cout<<'L'<<__LINE__<<": ")
#define FMTA(m,w) (MyRangeFormat<decltype(m+0)>(m,m+w))
#define FMTR(b,e) (MyRangeFormat<decltype(e)>(b,e))
#define FMTV(v) FMTR(v.begin(),v.end())
#define FMTM(m,h,w) (MyMatrixFormat<decltype(m+0)>(m,h,w))
#if defined(_WIN32) || defined(_WIN64)
#define getc_x _getc_nolock
#define putc_x _putc_nolock
#elif defined(__GNUC__)
#define getc_x getc_unlocked
#define putc_x putc_unlocked
#else
#define getc_x getc
#define putc_x putc
#endif
class MaiScanner {
FILE* fp_;
constexpr bool isvisiblechar(char c) noexcept { return (0x21<=(c)&&(c)<=0x7E); }
public:
inline MaiScanner(FILE* fp):fp_(fp){}
template<typename T> void input_integer(T& var) noexcept {
var = 0; T sign = 1;
int cc = getc_x(fp_);
for (; cc < '0' || '9' < cc; cc = getc_x(fp_))
if (cc == '-') sign = -1;
for (; '0' <= cc && cc <= '9'; cc = getc_x(fp_))
var = (var << 3) + (var << 1) + cc - '0';
var = var * sign;
}
inline int c() noexcept { return getc_x(fp_); }
template<typename T, typename enable_if<is_integral<T>::value, nullptr_t>::type = nullptr>
inline MaiScanner& operator>>(T& var) noexcept { input_integer<T>(var); return *this; }
inline MaiScanner& operator>>(string& var) {
int cc = getc_x(fp_);
for (; !isvisiblechar(cc); cc = getc_x(fp_));
for (; isvisiblechar(cc); cc = getc_x(fp_))
var.push_back(cc);
return *this;
}
template<typename IT> inline void in(IT begin, IT end) { for (auto it = begin; it != end; ++it) *this >> *it; }
};
class MaiPrinter {
FILE* fp_;
public:
inline MaiPrinter(FILE* fp):fp_(fp){}
template<typename T>
void output_integer(T var) noexcept {
if (var == 0) { putc_x('0', fp_); return; }
if (var < 0)
putc_x('-', fp_),
var = -var;
char stack[32]; int stack_p = 0;
while (var)
stack[stack_p++] = '0' + (var % 10),
var /= 10;
while (stack_p)
putc_x(stack[--stack_p], fp_);
}
inline MaiPrinter& operator<<(char c) noexcept { putc_x(c, fp_); return *this; }
template<typename T, typename enable_if<is_integral<T>::value, nullptr_t>::type = nullptr>
inline MaiPrinter& operator<<(T var) noexcept { output_integer<T>(var); return *this; }
inline MaiPrinter& operator<<(char* str_p) noexcept { while (*str_p) putc_x(*(str_p++), fp_); return *this; }
inline MaiPrinter& operator<<(const string& str) {
const char* p = str.c_str();
const char* l = p + str.size();
while (p < l) putc_x(*p++, fp_);
return *this;
}
template<typename IT> void join(IT begin, IT end, char sep = ' ') { for (bool b = 0; begin != end; ++begin, b = 1) b ? *this << sep << *begin : *this << *begin; }
};
MaiScanner scanner(stdin);
MaiPrinter printer(stdout);
//
constexpr int T = 3600;
constexpr int R = 4;
//
struct Player {
int level;
int id;
inline bool operator<(const Player &p) const { return level < p.level; }
};
class Game {
int tick_;
int player_id_;
public:
inline int tick() const { return tick_; }
void initialize() {
int t, r;
scanner >> t >> r;
assert(T == t);
assert(R == r);
tick_ = 0;
}
vector<Player> proceedTick() {
assert(++tick_ <= T);
int n;
scanner >> n;
vector<Player> v(n);
repeat(i, n) {
int l;
scanner >> l;
v[i].level = l;
v[i].id = ++player_id_;
}
return v;
}
bool uniteTeam(const vector<pair<int, int>> &uni) {
printer << int(uni.size()) << '\n';
for (auto &p : uni) {
printer << p.first << ' ' << p.second << '\n';
}
cout.flush();
return tick_ < T;
}
};
//
class Solver : Game {
vector<Player> stock_;
vector<vector<Player>> room_;
vector<pair<int, int>> gameloop() {
constexpr int kThreshold = 3;
vector<pair<int, int>> unions;
auto newcomer = proceedTick();
stock_.insert(stock_.end(), all(newcomer));
bool pair_mode = false;
repeat(_, 99) {
if (room_.empty() || pair_mode) {
int ok = -1;
sort(all(stock_));
repeat(i, int(stock_.size() - 1)) {
if (stock_[i + 1].level - stock_[i].level <= kThreshold) {
ok = i;
break;
}
}
if (ok == -1)
break;
room_.push_back({stock_[ok], stock_[ok + 1]});
unions.push_back({stock_[ok].id, stock_[ok + 1].id});
stock_.erase(stock_.begin() + ok, stock_.begin() + ok + 2);
pair_mode = false;
continue;
} else {
bool ok = false;
repeat(i, int(stock_.size())) {
repeat(j, int(room_.size())) {
auto mima = minmax_element(all(room_[j]));
int s = stock_[i].level;
int mi = min(mima.first->level, s);
int ma = max(mima.second->level, s);
if (ma - mi <= kThreshold) {
ok = true;
unions.push_back({stock_[i].id, room_[j][0].id});
if (room_[j].size() < 3) {
room_[j].push_back(stock_[i]);
} else {
room_.erase(room_.begin() + j);
}
stock_.erase(stock_.begin() + i);
break;
}
}
if (ok)
break;
}
pair_mode = !ok;
}
}
return unions;
}
public:
void solve() {
Game::initialize();
while (true) {
auto uu = gameloop();
if (!uniteTeam(uu))
break;
}
cerr << 0 << endl; // TODO: print score
}
};
//
int main() {
Solver().solve();
return 0;
}