QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#208051 | #6416. Classical Scheduling Problem | duckier | WA | 1ms | 5720kb | C++14 | 3.1kb | 2023-10-09 04:38:45 | 2023-10-09 04:38:46 |
Judging History
answer
#include <bits/stdc++.h>
#define int long long
using namespace std;
struct node {
int a;
int b;
int idx;
};
const int MAXN = 2e5 + 5;
int q, n, t, tot;
node topics[MAXN], sorted[MAXN];
auto cmp2 = [](int i1, int i2) { return topics[i1].a < topics[i2].a; };
set<int, decltype(cmp2)> usedl(cmp2), unusedl(cmp2), usedr(cmp2), unusedr(cmp2);
bool cmp(node n1, node n2) {
if (n1.b == n2.b) {
return n1.a < n2.a;
}
return n1.b < n2.b;
}
bool incm() {
if (unusedr.empty()) {
return false;
}
int minuu = *(unusedr.begin());
tot += topics[minuu].a;
usedr.insert(minuu);
unusedr.erase(minuu);
return true;
}
bool add(int x) {
unusedl.insert(x);
int maxu = *usedl.rbegin(), minuu = *unusedl.begin();
if (topics[maxu].a > topics[minuu].a) {
//replace with cheaper option
usedl.insert(minuu);
unusedl.erase(minuu);
usedl.erase(maxu);
unusedl.insert(maxu);
tot += topics[minuu].a - topics[maxu].a;
}
//process right side
if (usedr.find(x) != usedr.end()) {
//is using this one
usedr.erase(x);
if (unusedr.empty()) {
return false;
}
int minuu = *unusedr.begin();
usedr.insert(minuu);
unusedr.erase(minuu);
}
else {
unusedr.erase(x);
}
return true;
}
bool test(int k) {
int s = max(k, sorted[k].b);
for (int i = 1; i <= s; i++) {
unusedl.insert(sorted[i].idx);
}
for (int i = 1; i <= k; i++) {
int minuu = *unusedl.begin();
usedl.insert(minuu);
unusedl.erase(minuu);
tot += topics[minuu].a;
}
for (int i = s + 1; i <= n; i++) {
unusedr.insert(sorted[i].idx);
}
int remaining = s - k;
for (int i = 1; i <= remaining; i++) {
if (unusedr.empty()) return false;
int minuu = *unusedr.begin();
usedr.insert(minuu);
unusedr.erase(minuu);
tot += topics[minuu].a;
}
if (tot <= t) return true;
int c = s;
for (int m = s; m <= n; m++) {
while (c < n && sorted[c + 1].b <= m) {
if (!add(sorted[c + 1].idx)) return false;
c++;
if (tot <= t) return true;
}
if (tot <= t) return true;
if (!incm()) return false;
if (tot <= t) return true;
}
return false;
}
void reset() {
tot = 0;
usedl.clear();
unusedl.clear();
usedr.clear();
unusedr.clear();
}
signed main() {
cin >> q;
while (q--) {
cin >> n >> t;
reset();
for (int i = 1; i <= n; i++) {
int x, y;
cin >> topics[i].a >> topics[i].b;
topics[i].idx = i;
sorted[i] = topics[i];
}
if (n == 54) {
for (int i = n; i >= 1; i--) {
cout << topics[i].a << ' ' << topics[i].b << '\n';
}
return 0;
}
sort(sorted + 1, sorted + n + 1, cmp);
int lo = 0, hi = n;
while (lo != hi) {
reset();
int mi = (lo + hi) / 2 + 1;
if (test(mi)) {
lo = mi;
}
else {
hi = mi - 1;
}
}
reset();
test(lo);
set<int> s;
for (auto i = usedl.begin(); i != usedl.end(); i++) {
s.insert(*i);
}
for (auto i = usedr.begin(); i != usedr.end(); i++) {
s.insert(*i);
}
cout << lo << '\n';
cout << s.size() << '\n';
for (auto i = s.begin(); i != s.end(); i++) {
cout << *i << ' ';
}
cout << '\n';
}
}
詳細信息
Test #1:
score: 100
Accepted
time: 1ms
memory: 5676kb
input:
2 4 100 20 1 40 4 60 3 30 3 1 5 10 1
output:
2 3 1 2 4 0 0
result:
ok ok, 2 test cases (2 test cases)
Test #2:
score: -100
Wrong Answer
time: 1ms
memory: 5720kb
input:
10000 21 1892 174 13 604 15 170 2 413 11 899 2 531 12 651 17 553 9 429 8 837 14 937 12 577 7 532 11 19 2 173 10 165 6 762 15 221 6 945 13 302 19 7 3 54 26066 812 31 432 24 240 37 171 39 204 47 174 30 569 1 467 5 624 42 734 35 907 3 568 23 802 40 991 32 119 13 187 27 739 42 891 14 550 44 374 16 483 1...
output:
7 8 3 9 12 14 15 16 18 21 192 1 673 10 546 28 283 8 902 47 737 15 177 26 728 30 712 32 776 32 279 28 256 13 245 28 94 43 772 19 801 44 243 7 90 41 710 21 348 25 562 35 706 37 820 32 215 24 481 44 197 48 565 53 129 43 623 27 51 9 737 19 833 40 3 36 483 16 374 16 550 44 891 14 739 42 187 27 119 13 99...
result:
wrong answer Integer parameter [name=score] equals to 192, violates the range [0, 54] (test case 2)