QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#534989 | #9228. ICPC Inference | ucup-team052# | TL | 2526ms | 462012kb | C++23 | 4.3kb | 2024-08-27 18:17:26 | 2024-08-27 18:17:27 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
typedef pair <int, int> pii;
typedef long long ll;
const int N = 2e5 + 105;
struct atom {
int n, t;
atom (int a = 0, int b = 0) : n(a), t(b) {}
bool operator < (const atom &A) const {
if (n != A.n) return n < A.n;
return t > A.t;
}
};
multiset < pair <atom, int> > all;
vector <int> a[N];
vector <atom> b[N];
vector <int> vec[N];
atom mx[N], mn[N];
int id[N], seq[N], now[N], len;
int n, d, l; ll ans, sum;
bool cmp(int i, int j) {
return mx[i] < mx[j];
}
int calc(atom x) {
if (x.n >= 2) return len - 1;
int pos = lower_bound(seq + 1, seq + len + 1, x.t) - seq;
return len - pos;
}
const int B = 450;
int s1[N], s2[N];
void add(int x, int y) {
s1[x] += y;
s2[x / B] += y;
}
int query(int x) {
int ans = 0;
x = min(x, l);
for (int i = 0; i <= x / B - 1; i++) ans += s2[i];
for (int i = x / B * B; i <= x; i++) ans += s1[i];
return ans;
}
int main() {
#ifdef xay5421
freopen("a.in","r",stdin);
#endif
scanf("%d%d%d", &n, &d, &l); l += 20;
for (int i = 1; i <= n; i++) {
int id, t;
scanf("%d%d", &id, &t);
a[id].push_back(t);
}
for (int i = 1; i <= d; i++) {
if (a[i].size()) {
vector <pii> seg[20];
seq[++len] = a[i].back() + (a[i].size() - 1) * 20; id[len] = i; mx[i] = atom(0, 0); mn[i] = atom(1, seq[len]);
if ((int)a[i].size() >= 2) b[i].push_back(atom(2, a[i][(int)a[i].size() - 2] + a[i].back() + (a[i].size() - 2) * 20));
int cnt = 0;
for (auto j : a[i]) {
// b[i].push_back(atom(1, j + cnt * 20)); ++cnt;
seg[j % 20].emplace_back(j, j + cnt * 20); ++cnt;
if (mx[i].n <= 5) {
++mx[i].n;
mx[i].t += j;
}
}
for (int j = 0; j < 20; j++) {
int now = 0, x = j;
while (now < (int)seg[j].size() && x <= l) {
if (seg[j][now].second < x) ++now;
else {
x = max(x, seg[j][now].first);
if (x > l) break;
b[i].push_back(atom(1, x));
x += 20;
}
}
}
sort(b[i].begin(), b[i].end());
reverse(b[i].begin(), b[i].end());
all.insert(make_pair(b[i][0], i));
if (b[i][0].n == 1) add(b[i][0].t, 1);
}
}
sort(id + 1, id + len + 1, cmp);
sort(seq + 1, seq + len + 1);
for (int i = 1; i <= d; i++) {
if (b[i].size()) sum += calc(b[i][0]);
}
// fprintf(stderr, "sum = %lld, len = %d\n", sum, len);
int flag = 0, ff = 0, SZ = 0;
for (int _ = len; _ >= 1; _--) {
int i = id[_];
// fprintf(stderr, "i = %d\n", i);
if (!flag) {
while (all.size()) {
auto it = --all.end();
if (mx[i] < it -> first) {
// fprintf(stderr, "it -> second = %d\n", it -> second);
++now[it -> second];
sum -= calc(it -> first);
// fprintf(stderr, "calc({%d, %d}} = %d\n", (it -> first).n, (it -> first).t, calc(it -> first));
if ((it -> first).n == 1) add((it -> first).t, -1);
if (now[it -> second] < (int)b[it -> second].size()) {
all.insert(make_pair(b[it -> second][now[it -> second]], it -> second));
sum += calc(b[it -> second][now[it -> second]]);
// fprintf(stderr, "calc({%d, %d}) = %d\n", b[it -> second][now[it -> second]].n, b[it -> second][now[it -> second]].t, calc(b[it -> second][now[it -> second]]));
if (b[it -> second][now[it -> second]].n == 1) add(b[it -> second][now[it -> second]].t, 1);
}
all.erase(it);
} else break;
}
} else {
while (ff < mx[i].t) {
for (auto j : vec[ff]) {
sum -= calc(b[j][now[j]]);
// assert(b[j][now[j]].n == 1);
if (b[j][now[j]].n == 1) add(b[j][now[j]].t, -1);
++now[j];
if (now[j] < (int)b[j].size()) {
vec[b[j][now[j]].t].push_back(j);
// fprintf(stderr, "ff = %d, b[j][now[j]].t = %d\n", ff, b[j][now[j]].t);
assert(b[j][now[j]].t > ff);
sum += calc(b[j][now[j]]);
add(b[j][now[j]].t, 1);
} else --SZ;
}
++ff;
}
}
if (mx[i].n == 1 && !flag) {
flag = 1; SZ = all.size();
for (auto j : all) {
int id = j.second;
// assert(j.first.n == 1);
// assert(b[id][now[id]].n == 1);
vec[b[id][now[id]].t].push_back(id);
}
}
// fprintf(stderr, "sum = %d\n", sum);
ans += sum - calc(b[i][now[i]]);
ans -= ((!flag ? all.size() : SZ) - 1 - query(l) + query(mn[i].t));
// fprintf(stderr, "ans = %lld\n", ans);
}
printf("%lld\n", ans);
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 2ms
memory: 9900kb
input:
4 3 300 1 10 2 25 2 30 3 50
output:
3
result:
ok 1 number(s): "3"
Test #2:
score: 0
Accepted
time: 2ms
memory: 9976kb
input:
4 6 200000 6 1 6 1 1 2 2 2
output:
4
result:
ok 1 number(s): "4"
Test #3:
score: 0
Accepted
time: 121ms
memory: 25172kb
input:
191580 64997 56 24878 1 35060 1 24245 1 64330 1 9650 1 15423 1 34953 1 21456 1 36718 1 21395 1 17613 1 16995 1 45257 1 31277 1 20026 1 1870 1 25581 1 9997 1 54701 1 30752 1 32269 1 705 1 64186 1 58881 1 24614 1 55311 1 18259 1 58886 1 23296 1 17628 1 3411 1 37469 1 47951 1 12188 1 60720 1 54168 1 45...
output:
274533940012863
result:
ok 1 number(s): "274533940012863"
Test #4:
score: 0
Accepted
time: 209ms
memory: 31740kb
input:
192309 96431 357 56446 1 42487 1 47313 1 71736 1 74439 1 19895 1 52024 1 66203 1 992 1 78744 1 9911 1 85130 1 73814 1 64499 1 92961 1 66255 1 88807 1 82217 1 36788 1 66999 1 35107 1 47933 1 34196 1 50534 1 83014 1 75035 1 30407 1 36014 1 7248 1 69915 1 57348 1 5356 1 37088 1 36455 1 29365 1 71376 1 ...
output:
868523468626161
result:
ok 1 number(s): "868523468626161"
Test #5:
score: 0
Accepted
time: 2526ms
memory: 462012kb
input:
200000 200000 200000 151464 4 1477 6 95966 8 121582 8 19239 11 668 13 109329 15 173254 15 153807 16 75865 16 123829 17 101156 17 8881 18 116717 18 124985 18 125918 18 132143 19 35899 20 90547 20 106065 22 176481 23 11727 23 527 24 77206 25 85757 25 169873 26 139187 26 5970 28 37134 29 199855 30 9598...
output:
149096043
result:
ok 1 number(s): "149096043"
Test #6:
score: 0
Accepted
time: 21ms
memory: 14268kb
input:
200000 200000 200000 200000 200000 200000 200000 200000 200000 200000 200000 200000 200000 200000 200000 200000 200000 200000 200000 200000 200000 200000 200000 200000 200000 200000 200000 200000 200000 200000 200000 200000 200000 200000 200000 200000 200000 200000 200000 200000 200000 200000 200000...
output:
0
result:
ok 1 number(s): "0"
Test #7:
score: 0
Accepted
time: 336ms
memory: 44284kb
input:
200000 200000 200000 80855 2 16643 3 158423 4 160007 6 83405 9 148393 10 94889 10 146919 11 56648 12 60318 12 182241 13 144187 14 96195 16 72396 16 10048 17 32575 19 75743 21 49152 21 21380 22 64386 28 11608 29 49440 30 125557 35 170781 36 5487 37 104466 37 136650 37 84688 38 38173 40 122020 40 9383...
output:
689247584152428
result:
ok 1 number(s): "689247584152428"
Test #8:
score: 0
Accepted
time: 1405ms
memory: 235244kb
input:
200000 28000 200000 5152 1 5152 1 26010 1 12173 1 12173 1 12166 1 26010 1 24704 1 12173 1 24704 1 26010 1 12071 1 12173 1 12173 1 12166 1 26010 1 24704 1 12166 1 6044 1 24704 1 6044 1 12173 1 24704 1 6733 1 12173 1 12166 1 12173 1 12166 1 24704 1 12166 1 24704 1 12166 1 5152 1 12166 1 12166 1 26010 ...
output:
13273777158527
result:
ok 1 number(s): "13273777158527"
Test #9:
score: 0
Accepted
time: 2ms
memory: 12092kb
input:
4 6 200000 6 1 6 1 1 2 2 2
output:
4
result:
ok 1 number(s): "4"
Test #10:
score: 0
Accepted
time: 230ms
memory: 41132kb
input:
199999 200000 199995 22477 1 124061 1 102846 2 124061 2 124061 3 124061 3 124061 4 124061 5 59212 5 169893 5 124061 6 80004 6 112429 7 31273 11 124061 12 67631 12 124061 14 10017 15 124061 16 70773 16 124061 17 168853 18 88973 19 124061 19 61672 19 196994 20 48373 21 113531 22 92390 23 152850 25 998...
output:
150416508568041
result:
ok 1 number(s): "150416508568041"
Test #11:
score: 0
Accepted
time: 3ms
memory: 12028kb
input:
3 199993 199995 165540 12988 2883 39410 66825 115392
output:
1
result:
ok 1 number(s): "1"
Test #12:
score: 0
Accepted
time: 126ms
memory: 25476kb
input:
193973 65702 62 51610 1 53512 1 12563 1 56075 1 29395 1 42082 1 60371 1 17038 1 29443 1 33664 1 12471 1 34225 1 49958 1 54960 1 59860 1 33819 1 7499 1 34862 1 6704 1 52200 1 22803 1 7726 1 61422 1 51120 1 17203 1 11462 1 13292 1 20641 1 21050 1 28979 1 35347 1 55821 1 52326 1 50557 1 8296 1 53862 1 ...
output:
283586156841885
result:
ok 1 number(s): "283586156841885"
Test #13:
score: 0
Accepted
time: 345ms
memory: 49916kb
input:
199975 199975 100000 27676 1 116023 2 40052 2 154967 2 82099 3 2503 4 159303 5 136744 5 89330 6 117095 6 182013 6 131786 7 180992 7 73734 7 122549 8 16427 8 104713 8 46057 9 63743 9 160535 10 109106 11 135371 12 65002 13 194754 14 15088 15 144270 15 106306 15 84597 16 143308 16 67042 16 103147 17 15...
output:
1332840068163275
result:
ok 1 number(s): "1332840068163275"
Test #14:
score: -100
Time Limit Exceeded
input:
200000 312 200000 155 1 241 1 93 1 157 1 308 1 7 1 148 1 240 1 172 1 77 1 151 1 141 1 150 1 190 1 226 1 265 1 247 1 171 1 251 1 115 1 164 1 185 1 234 1 176 1 63 1 21 1 107 1 132 1 224 1 293 1 80 1 162 1 113 1 243 1 287 1 104 1 298 1 197 1 270 1 6 1 252 1 289 1 2 1 160 1 229 1 116 1 165 1 216 1 159 1...