QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#732596 | #9599. Dragon Bloodline | kazimiyuuka | WA | 0ms | 3776kb | C++20 | 2.7kb | 2024-11-10 15:16:45 | 2024-11-10 15:16:45 |
Judging History
answer
#include <iostream>
#include <string>
#include <string.h>
#include <vector>
#include <algorithm>
#include <cmath>
#include <set>
#include <random>
#include <cstdlib>
#include <numeric>
#include <functional>
#include <queue>
#include <stdlib.h>
#include <map>
using namespace std;
using ll = long long;
ll mod = 1e9 + 7;
void slove() {
ll n, k;
cin >> n >> k;
vector<ll> ned(n + 1);
vector<ll> pri(k + 1);
vector<ll> bac(k + 1);
for (int i = 1; i <= n; i++) cin >> ned[i];
for (int i = 0; i < k; i++) cin >> pri[i];
bac = pri;
vector<ll> tmp(k + 1);
function<void()> rev = [&]() {
for (int i = 0; i <= k; i++) {
pri[i] += tmp[i];
tmp[i] = 0;
}
};
//int h = k;
//function<void()> nUp = [&]() {
// while (h >= 0 && !pri[h]) h--;
//};
//function<bool(ll)> cal = [&](ll val) {
// nUp();
// for (int i = h; i >= 0; i--) {
//
// if (val <= (1LL << i)) break;
//
// if (val > (1LL << i) * pri[i]) {
// val -= (1LL << i) * pri[i];
// pri[i] = 0;
// }
// else {
// pri[i] -= (val) / (1LL << i);
// val %= (1LL << i);
// break;
// }
// }
//};
function<bool(ll)> judge = [&](ll tar) {
pri = bac;
priority_queue<ll ,vector<ll> , less<ll>> q;
for (int i = 1; i <= n; i++) {
q.emplace(ned[i] * tar);
}
for (int i = k; i >= 0; i--) {
ll val = 1LL << i;
while (pri[i] && !q.empty()) {
auto ptr = q.top();
q.pop();
if (ptr < val) pri[i]--;
else {
ll cnt = min(ptr / val, pri[i]);
ptr -= cnt * val;
pri[i] -= cnt;
if (ptr) q.emplace(ptr);
}
}
}
if (q.empty()) {
return true;
}
return false;
//for (int i = 1; i <= n; i++) {
// ll t = ned[i] * tar;
// if (!cal(t))
// return false;
//}
//return true;
};
ll l = 0, r = 1e9;
while (l < r) {
ll mid = (l + r) / 2 + 1;
if (judge(mid)) l = mid;
else r = mid - 1;
}
cout << l << "\n";
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
//freopen("in.txt", "r", stdin);
//freopen("out.txt", "w", stdout);
int cnt = 1;
cin >> cnt;
while (cnt--) {
slove();
}
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 0ms
memory: 3748kb
input:
6 4 3 1 2 3 4 4 4 4 3 2 1 1 1 1 7 3 4 6 6 2 1 1 5 5 3 5 3 1 1 1 1 1 1 1 4 5 1 9 9 8 2 2 2 3 1 5 4 1 3 1 7 1 4 1 5 2
output:
2 4 4 5 2 3
result:
ok 6 lines
Test #2:
score: -100
Wrong Answer
time: 0ms
memory: 3776kb
input:
1 1 20 1 1000000000 1000000000 1000000000 1000000000 1000000000 1000000000 1000000000 1000000000 1000000000 1000000000 1000000000 1000000000 1000000000 1000000000 1000000000 1000000000 1000000000 1000000000 1000000000 1000000000
output:
1000000000
result:
wrong answer 1st lines differ - expected: '1048575000000000', found: '1000000000'