QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#732596#9599. Dragon BloodlinekazimiyuukaWA 0ms3776kbC++202.7kb2024-11-10 15:16:452024-11-10 15:16:45

Judging History

你现在查看的是最新测评结果

  • [2024-11-10 15:16:45]
  • 评测
  • 测评结果:WA
  • 用时:0ms
  • 内存:3776kb
  • [2024-11-10 15:16:45]
  • 提交

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'