結果
| 問題 |
No.1361 [Zelkova 4th Tune *] QUADRUPLE-SEQUENCEの詩
|
| コンテスト | |
| ユーザー |
SSRS
|
| 提出日時 | 2021-01-22 22:54:06 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 356 ms / 2,000 ms |
| コード長 | 3,914 bytes |
| コンパイル時間 | 3,152 ms |
| コンパイル使用メモリ | 177,944 KB |
| 実行使用メモリ | 18,004 KB |
| 最終ジャッジ日時 | 2024-12-28 05:11:32 |
| 合計ジャッジ時間 | 15,846 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 74 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
const long long INF = 1000000000000000000;
int main(){
int K, L, M, N;
long long S;
cin >> K >> L >> M >> N >> S;
vector<int> A(K);
for (int i = 0; i < K; i++){
cin >> A[i];
}
vector<int> B(L);
for (int i = 0; i < L; i++){
cin >> B[i];
}
vector<int> C(M);
for (int i = 0; i < M; i++){
cin >> C[i];
}
vector<int> D(N);
for (int i = 0; i < N; i++){
cin >> D[i];
}
vector<long long> X(K * L);
for (int i = 0; i < K; i++){
for (int j = 0; j < L; j++){
X[i * L + j] = A[i] * B[j];
}
}
vector<long long> Y(M * N);
for (int i = 0; i < M; i++){
for (int j = 0; j < N; j++){
Y[i * N + j] = C[i] * D[j];
}
}
vector<long long> Xp, Xn;
for (int i = 0; i < K * L; i++){
if (X[i] >= 0){
Xp.push_back(X[i]);
} else {
Xn.push_back(-X[i]);
}
}
vector<long long> Yp, Yn;
for (int i = 0; i < N * M; i++){
if (Y[i] >= 0){
Yp.push_back(Y[i]);
} else {
Yn.push_back(-Y[i]);
}
}
sort(Xp.begin(), Xp.end());
sort(Xn.begin(), Xn.end());
sort(Yp.begin(), Yp.end());
sort(Yn.begin(), Yn.end());
int Xps = Xp.size();
int Xns = Xn.size();
int Yps = Yp.size();
int Yns = Yn.size();
long long tv = -INF;
long long fv = INF;
while (fv - tv > 1){
long long mid = (tv + fv) / 2;
long long cnt = 0;
if (mid >= 0){
cnt += (long long) Xps * Yns;
cnt += (long long) Xns * Yps;
int p1 = 0;
for (int i = Xps - 1; i >= 0; i--){
while (p1 < Yps){
if (Xp[i] * Yp[p1] < mid){
p1++;
} else {
break;
}
}
cnt += p1;
}
int p2 = 0;
for (int i = Xns - 1; i >= 0; i--){
while (p2 < Yns){
if (Xn[i] * Yn[p2] < mid){
p2++;
} else {
break;
}
}
cnt += p2;
}
} else {
int p1 = 0;
for (int i = Xps - 1; i >= 0; i--){
while (p1 < Yns){
if (Xp[i] * Yn[p1] <= -mid){
p1++;
} else {
break;
}
}
cnt += Yns - p1;
}
int p2 = 0;
for (int i = Xns - 1; i >= 0; i--){
while (p2 < Yps){
if (Xn[i] * Yp[p2] <= -mid){
p2++;
} else {
break;
}
}
cnt += Yps - p2;
}
}
if (cnt < S){
tv = mid;
} else {
fv = mid;
}
}
cout << tv << endl;
sort(Y.begin(), Y.end());
for (int i = 0; i < K * L; i++){
int id = -1;
if (X[i] >= 0){
int tv2 = -1;
int fv2 = N * M;
while (fv2 - tv2 > 1){
int mid2 = (tv2 + fv2) / 2;
if (X[i] * Y[mid2] <= tv){
tv2 = mid2;
} else {
fv2 = mid2;
}
}
if (tv2 != -1){
if (X[i] * Y[tv2] == tv){
id = tv2;
}
}
} else {
int tv2 = N * M;
int fv2 = -1;
while (tv2 - fv2 > 1){
int mid2 = (tv2 + fv2) / 2;
if (X[i] * Y[mid2] <= tv){
tv2 = mid2;
} else {
fv2 = mid2;
}
}
if (tv2 != N * M){
if (X[i] * Y[tv2] == tv){
id = tv2;
}
}
}
if (id != -1){
bool ok1 = false;
for (int j = 0; j < K; j++){
for (int k = 0; k < L; k++){
if (A[j] * B[k] == X[i]){
cout << A[j] << ' ' << B[k] << ' ';
ok1 = true;
break;
}
}
if (ok1){
break;
}
}
bool ok2 = false;
for (int j = 0; j < M; j++){
for (int k = 0; k < N; k++){
if (C[j] * D[k] == Y[id]){
cout << C[j] << ' ' << D[k] << endl;
ok2 = true;
break;
}
}
if (ok2){
break;
}
}
break;
}
}
}
SSRS