QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#826488 | #9786. Magical Bags | Javier_Rivera | WA | 1ms | 3824kb | C++23 | 2.4kb | 2024-12-22 12:14:46 | 2024-12-22 12:14:46 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using vi = vector<int>;
#define SZ(x) ((int)x.size())
#define FOR(i,a,b) for(int i = (int)a; i < (int)b; i++)
struct FT {
vector<int> s;
FT(int n) : s(n + 1) {}
void update(int pos, int dif) {
for (; pos < SZ(s); pos |= pos + 1) s[pos] += dif;
}
int query(int pos) {
int res = 0;
for (; pos > 0; pos &= pos - 1) res += s[pos - 1];
return res;
}
};
signed main() {
cin.tie(0)->sync_with_stdio(0);
int n;
cin >> n;
vector<vi> bags(n);
vi mn(n), mx(n);
map<int, int> idxs;
vi values;
int elements = 0;
for (int i = 0; i < n; i++) {
int k;
cin >> k;
int mini = 1e9 + 5, maxi = -1;
while (k--) {
int x;
cin >> x;
bags[i].push_back(x);
mini = min(mini, x);
maxi = max(maxi, x);
values.push_back(x);
}
mn[i] = mini, mx[i] = maxi;
if (SZ(bags[i]) > 2) {
elements += 2;
}
else {
elements += SZ(bags[i]);
}
}
sort(values.begin(), values.end());
for (int i = 0; i < SZ(values); i++) {
idxs[values[i]] = i;
}
FT bmn(SZ(values) + 1), bmx(SZ(values) + 1);
for (int i = 0; i < n; i++) {
bmn.update(idxs[mn[i]], 1);
bmx.update(idxs[mx[i]], 1);
}
auto check = [&](int i) -> bool {
bmn.update(idxs[mn[i]], -1);
bmx.update(idxs[mx[i]], -1);
bool ok = false;
for (int j = 0; j < SZ(bags[i]); j++) {
int l = bmn.query(idxs[bags[i][j]] + 1);
int r = bmx.query(SZ(values) + 1) - bmx.query(idxs[bags[i][j]]);
if (l == n - 1 && r == n - 1) {
ok = true;
break;
}
}
bmn.update(idxs[mn[i]], 1);
bmx.update(idxs[mx[i]], 1);
return ok;
};
vi promising;
for (int i = 0; i < n; i++) {
if (check(i)) {
promising.push_back(i);
}
}
vector<pair<int, int>> segments;
for (auto x : promising) {
segments.push_back({mn[x], mx[x]});
}
sort(segments.begin(), segments.end(), [&](pair<int, int> i, pair<int, int> j) -> bool {
if (i.second == j.second) {
return i.first < j.first;
}
return i.second < j.second;
});
int pick_cnt = 0;
int last_r = -1;
for (int i = 0; i < SZ(segments); i++) {
if (last_r < segments[i].first) {
pick_cnt++;
last_r = segments[i].second;
}
}
cout << elements - pick_cnt << '\n';
return 0;
}
详细
Test #1:
score: 100
Accepted
time: 1ms
memory: 3788kb
input:
4 3 4 7 10 2 1 9 4 11 2 8 14 3 6 12 13
output:
7
result:
ok 1 number(s): "7"
Test #2:
score: 0
Accepted
time: 1ms
memory: 3616kb
input:
4 1 1 1 2 1 3 1 4
output:
4
result:
ok 1 number(s): "4"
Test #3:
score: 0
Accepted
time: 1ms
memory: 3824kb
input:
4 3 4 7 10 2 1 9 4 11 2 8 14 3 6 12 13
output:
7
result:
ok 1 number(s): "7"
Test #4:
score: 0
Accepted
time: 1ms
memory: 3552kb
input:
4 1 1 1 2 1 3 1 4
output:
4
result:
ok 1 number(s): "4"
Test #5:
score: -100
Wrong Answer
time: 1ms
memory: 3656kb
input:
100 4 372861091 407948190 424244630 359746969 6 568180757 527358812 494745349 665803213 674832670 586694351 4 696340797 775899164 919971335 716827187 4 123145962 344250363 122030550 251739234 4 342654413 368648894 150539766 255189030 1 194505887 3 755984448 736803561 745474041 4 709314938 498953418 ...
output:
187
result:
wrong answer 1st numbers differ - expected: '177', found: '187'