QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#820486#4488. Buy FigurinesSGColinAC ✓483ms153300kbC++201.9kb2024-12-18 21:35:522024-12-18 21:35:52

Judging History

This is the latest submission verdict.

  • [2024-12-18 21:35:52]
  • Judged
  • Verdict: AC
  • Time: 483ms
  • Memory: 153300kb
  • [2024-12-18 21:35:52]
  • Submitted

answer

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

#define fr first
#define sc second
#define mp make_pair
#define pb push_back
#define pii pair<ll, ll>

inline ll rd() {
    ll x = 0;
    bool f = 0;
    char c = getchar();
    for (; !isdigit(c); c = getchar()) f |= (c == '-');
    for (; isdigit(c); c = getchar()) x = x * 10 + (c ^ 48);
    return f ? -x : x;
}

#define N 200007

vector<pii> a;

queue<int> q[N];

set<pii> s, d;

inline bool nextp(int id) {
    s.erase(mp(q[id].size(), id)); q[id].pop();
    s.insert(mp(q[id].size(), id));
    return !q[id].empty();
}

inline void add(int id, int p) {
    //printf("%d %d\n", id, p);
    s.erase(mp(q[id].size(), id)); q[id].push(p);
    s.insert(mp(q[id].size(), id)); 
    if (q[id].size() == 1) d.insert(mp(a[p].fr + a[p].sc, id));
}

inline void work() {
    int n = rd(), m = rd(); a.clear();
    for (int i = 1; i <= n; ++i) {
        int ar = rd(), st = rd();
        a.push_back(mp(ar, st));
    }
    sort(a.begin(), a.end()); 
    s.clear();
    for (int i = 1; i <= m; ++i) s.insert(mp(0, i));
    for (int i = 0; i < n; ++i) {
        int nw = a[i].fr;
        while (!d.empty() && d.begin() -> fr <= nw) {
            ll tm = d.begin() -> fr;
            int id = d.begin() -> sc; 
            d.erase(d.begin());
            if (nextp(id)) d.insert(mp(tm + a[q[id].front()].sc, id));
        }
        auto id = s.begin() -> sc;
        add(id, i);
    }
    ll ans = 0;
    while (!d.empty()) {
        int id = d.begin() -> sc;
        ll tm = d.begin() -> fr;
        d.erase(d.begin());
        q[id].pop();
        while (!q[id].empty()) {
            tm += a[q[id].front()].sc; q[id].pop();
        }
        ans = max(ans, tm);
    }
    printf("%lld\n", ans);
} 

int main() {
    for (int t = rd(); t; --t) work();
    return 0;
}

详细

Test #1:

score: 100
Accepted
time: 483ms
memory: 153300kb

input:

8
5 3
2 4
1 3
5 1
3 4
4 2
200000 200000
26113860 1563
45251761 2156
63941612 4551
16962783 4576
18965664 5853
4091010 2401
10238760 7732
19457520 7279
7641592 4270
24241152 7862
51178555 8548
31253040 7967
2966632 5745
59550817 1824
4312590 7419
81579464 2401
20977992 8997
28997820 6485
3132935 9527...

output:

7
99184946
99609939
27024359944
26923428235
4992516018218
93791976
117811694

result:

ok 8 lines