結果
| 問題 |
No.1361 [Zelkova 4th Tune *] QUADRUPLE-SEQUENCEの詩
|
| コンテスト | |
| ユーザー |
fastmath
|
| 提出日時 | 2021-01-22 23:20:38 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 518 ms / 2,000 ms |
| コード長 | 5,018 bytes |
| コンパイル時間 | 2,492 ms |
| コンパイル使用メモリ | 214,104 KB |
| 最終ジャッジ日時 | 2025-01-18 06:01:57 |
|
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 74 |
ソースコード
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define ii pair <int, int>
#define app push_back
#define all(a) a.begin(), a.end()
#define bp __builtin_popcountll
#define ll long long
#define mp make_pair
#define x first
#define y second
#define Time (double)clock()/CLOCKS_PER_SEC
#define debug(x) std::cout << #x << ": " << x << '\n';
#define FOR(i, n) for (int i = 0; i < n; ++i)
#define pb push_back
#define trav(a, x) for (auto& a : x)
using vi = vector<int>;
template <typename T>
std::ostream& operator <<(std::ostream& output, const pair <T, T> & data)
{
output << "(" << data.x << "," << data.y << ")";
return output;
}
template <typename T>
std::ostream& operator <<(std::ostream& output, const std::vector<T>& data)
{
for (const T& x : data)
output << x << " ";
return output;
}
ll div_up(ll a, ll b) { return a/b+((a^b)>0&&a%b); } // divide a by b rounded up
ll div_down(ll a, ll b) { return a/b-((a^b)<0&&a%b); } // divide a by b rounded down
#define tcT template<class T
#define tcTU tcT, class U
tcT> using V = vector<T>;
tcT> void re(V<T>& x) {
trav(a, x)
cin >> a;
}
tcT> bool ckmin(T& a, const T& b) {
return b < a ? a = b, 1 : 0;
} // set a = min(a,b)
tcT> bool ckmax(T& a, const T& b) {
return a < b ? a = b, 1 : 0;
}
signed main() {
#ifdef HOME
freopen("input.txt", "r", stdin);
#else
#define endl '\n'
ios_base::sync_with_stdio(0); cin.tie(0);
#endif
vi sz(4);
FOR (i, 4)
cin >> sz[i];
int k;
cin >> k;
V <vi> a(4);
FOR (i, 4) {
a[i].resize(sz[i]);
FOR (j, sz[i])
cin >> a[i][j];
}
V <vi> l, r;
vi lv, rv;
trav (i, a[0])
trav (j, a[1]) {
l.app({i * j, i, j});
lv.app(i * j);
}
sort(all(l));
sort(all(lv));
vi lv_rev = lv;
reverse(all(lv_rev));
trav (i, a[2])
trav (j, a[3]) {
r.app({i * j, i, j});
rv.app(i * j);
}
sort(all(r));
sort(all(rv));
const int INF = 2e18;
auto cnt = [&] (int x) {
//prod <= x
int ans = 0;
trav (a, lv) {
if (a == 0 && x >= 0) {
ans += rv.size();
}
}
if (x >= 0) {
int ptr = 0;
trav (a, lv_rev) {
if (a < 0) {
while (ptr < rv.size() && a * rv[ptr] > x) {
ptr++;
}
ans += (int)rv.size() - ptr;
}
}
}
else {
int ptr = 0;
trav (a, lv) {
if (a < 0) {
while (ptr < rv.size() && a * rv[ptr] > x) {
ptr++;
}
ans += (int)rv.size() - ptr;
}
}
}
if (x >= 0) {
int ptr = 0;
trav (a, lv_rev) {
if (a > 0) {
while (ptr < rv.size() && a * rv[ptr] <= x) {
ptr++;
}
ans += ptr;
}
}
}
else {
int ptr = 0;
trav (a, lv) {
if (a > 0) {
while (ptr < rv.size() && a * rv[ptr] <= x) {
ptr++;
}
ans += ptr;
}
}
}
/*
int ans1 = 0;
trav (v, l) {
int a = v[0];
if (a == 0) {
if (0 <= x)
ans1 += r.size();
}
else if (a < 0) {
//a * b <= x
//b >= x/a
ans1 += get_right(r, div_up(x, a));
}
else {
//b <= x/a
ans1 += get_left(r, div_down(x, a));
}
}
assert(ans == ans1);
*/
return ans;
};
int ans;
{
assert(cnt(INF) == sz[0] * sz[1] * sz[2] * sz[3]);
assert(cnt(-INF) == 0);
int l = -INF, r = INF; // l < ans
while (l < r - 1) {
int m = (l + r) / 2;
if (cnt(m) < k)
l = m;
else
r = m;
}
assert(l != -INF);
assert(r != INF);
ans = r;
cout << r << endl;
}
#ifdef HOME
debug(Time);
#endif
trav (v, l) {
int a = v[0];
if (a == 0) {
if (ans == 0) {
auto vv = r[0];
cout << v[1] << ' ' << v[2] << ' ' << vv[1] << ' ' << vv[2] << endl;
exit(0);
}
}
else if (ans % a == 0) {
int b = ans/a;
vi key = {b, -INF, -INF};
auto t = lower_bound(all(r), key);
if (t != r.end() && (*t)[0] == b) {
auto vv = *t;
cout << v[1] << ' ' << v[2] << ' ' << vv[1] << ' ' << vv[2] << endl;
exit(0);
}
}
}
cout << "LMAO" << endl;
}
fastmath