QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#296241 | #7436. Optimal Ordered Problem Solver | zlt | 0 | 932ms | 123332kb | C++14 | 6.2kb | 2024-01-02 15:49:58 | 2024-01-02 15:49:58 |
Judging History
answer
// Problem: P9061 [Ynoi2002] Optimal Ordered Problem Solver
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P9061
// Memory Limit: 512 MB
// Time Limit: 4000 ms
//
// Powered by CP Editor (https://cpeditor.org)
#include <bits/stdc++.h>
#define pb emplace_back
#define fst first
#define scd second
#define mkp make_pair
#define mems(a, x) memset((a), (x), sizeof(a))
using namespace std;
typedef long long ll;
typedef double db;
typedef unsigned long long ull;
typedef long double ldb;
typedef pair<int, int> pii;
namespace IO {
char ibuf[1 << 20], *iS, *iT, obuf[1 << 20], *oS = obuf;
#define writesp(x) write(x), pc(' ')
#define writeln(x) write(x), pc('\n')
#define gh() (iS == iT ? iT = (iS = ibuf) + fread(ibuf, 1, 1 << 20, stdin), (iS == iT ? EOF : *iS++) : *iS++)
template<typename T = int>
inline T read() {
char ch = gh();
T x = 0;
bool t = 0;
while (ch < '0' || ch > '9') t |= ch == '-', ch = gh();
while (ch >= '0' && ch <= '9') x = (x << 1) + (x << 3) + (ch ^ 48), ch = gh();
return t ? ~(x - 1) : x;
}
inline void flush () {
fwrite(obuf, 1, oS - obuf, stdout), oS = obuf;
}
inline void pc (char ch) {
if (oS == obuf + (1 << 20)) flush();
*oS++ = ch;
}
template<typename _Tp>
inline void write (_Tp x) {
static char stk[64], *tp = stk;
if (x < 0) x = ~(x - 1), pc('-');
do *tp++ = x % 10, x /= 10;
while (x);
while (tp != stk) pc((*--tp) | 48);
}
}
using IO::read;
using IO::write;
using IO::pc;
using IO::flush;
const int maxn = 1000100;
int n, m, ans[maxn];
pii a[maxn];
vector<int> vc[maxn];
mt19937 rnd(chrono::steady_clock::now().time_since_epoch().count());
struct node {
int o, x, y, qx, qy, id;
} qq[maxn];
struct {
int c[maxn];
inline void init() {
mems(c, 0);
}
inline void update(int x, int d) {
for (int i = x; i <= n; i += (i & (-i))) {
c[i] += d;
}
}
inline int query(int x) {
int res = 0;
for (int i = x; i; i -= (i & (-i))) {
res += c[i];
}
return res;
}
inline int query(int l, int r) {
return query(r) - query(l - 1);
}
} t1, t2;
struct {
int c[maxn];
inline void init() {
mems(c, 0x3f);
}
inline void update(int x, int d) {
for (int i = x; i; i -= (i & (-i))) {
c[i] = min(c[i], d);
}
}
inline int query(int x) {
int res = 2e9;
for (int i = x; i <= n; i += (i & (-i))) {
res = min(res, c[i]);
}
return res;
}
} t3;
struct {
int c[maxn];
inline void init() {
mems(c, -0x3f);
}
inline void update(int x, int d) {
for (int i = x; i; i -= (i & (-i))) {
c[i] = max(c[i], d);
}
}
inline int query(int x) {
int res = -2e9;
for (int i = x; i <= n; i += (i & (-i))) {
res = max(res, c[i]);
}
return res;
}
} t4;
int p[maxn], ls[maxn], rs[maxn], ax[maxn], ay[maxn], sz[maxn], tagx[maxn], tagy[maxn], rt, nt;
inline void pushup(int x) {
sz[x] = sz[ls[x]] + sz[rs[x]] + 1;
}
inline void pushdown(int x) {
if (tagx[x] != -1) {
if (ls[x]) {
ax[ls[x]] = tagx[ls[x]] = tagx[x];
}
if (rs[x]) {
ax[rs[x]] = tagx[rs[x]] = tagx[x];
}
tagx[x] = -1;
}
if (tagy[x] != -1) {
if (ls[x]) {
ay[ls[x]] = tagy[ls[x]] = tagy[x];
}
if (rs[x]) {
ay[rs[x]] = tagy[rs[x]] = tagy[x];
}
tagy[x] = -1;
}
}
// x <= k, x > k
void splitx(int u, int k, int &x, int &y) {
if (!u) {
x = y = 0;
return;
}
pushdown(u);
if (ax[u] <= k) {
x = u;
splitx(rs[u], k, rs[u], y);
} else {
y = u;
splitx(ls[u], k, x, ls[u]);
}
pushup(u);
}
// y > k, y <= k
void splity(int u, int k, int &x, int &y) {
if (!u) {
x = y = 0;
return;
}
pushdown(u);
if (ay[u] > k) {
x = u;
splity(rs[u], k, rs[u], y);
} else {
y = u;
splity(ls[u], k, x, ls[u]);
}
pushup(u);
}
int merge(int x, int y) {
if (!x || !y) {
return x | y;
}
pushdown(x);
pushdown(y);
if (p[x] < p[y]) {
rs[x] = merge(rs[x], y);
pushup(x);
return x;
} else {
ls[y] = merge(x, ls[y]);
pushup(y);
return y;
}
}
inline int newnode(int x, int y) {
int u = ++nt;
ax[u] = x;
ay[u] = y;
sz[u] = 1;
p[u] = rnd();
return u;
}
void solve() {
n = read();
m = read();
for (int i = 1; i <= n; ++i) {
a[i].fst = read();
a[i].scd = read();
}
sort(a + 1, a + n + 1);
for (int i = 1; i <= m; ++i) {
qq[i].o = read();
qq[i].x = read();
qq[i].y = read();
qq[i].qx = read();
qq[i].qy = read();
qq[i].id = i;
}
t3.init();
t4.init();
sort(qq + 1, qq + m + 1, [&](const node &a, const node &b) {
return a.qx > b.qx;
});
for (int i = 1, j = n; i <= m; ++i) {
while (j && a[j].fst > qq[i].qx) {
t1.update(a[j].scd, 1);
--j;
}
ans[qq[i].id] = t1.query(qq[i].qy + 1, n);
}
sort(qq + 1, qq + m + 1, [&](const node &a, const node &b) {
return a.x > b.x;
});
t1.init();
for (int i = n, j = 1; i; --i) {
t1.update(a[i].fst, 1);
t2.update(a[i].scd, 1);
while (j <= m && qq[j].x >= a[i].fst) {
t3.update(qq[j].y, qq[j].id);
++j;
}
int t = t3.query(a[i].scd);
if (t <= m) {
vc[t].pb(i);
}
}
sort(qq + 1, qq + m + 1, [&](const node &a, const node &b) {
return a.id < b.id;
});
mems(tagx, -1);
mems(tagy, -1);
for (int i = 1, x, y, z; i <= m; ++i) {
t4.update(qq[i].x, qq[i].y);
splitx(rt, qq[i].x, x, z);
splity(x, qq[i].y, x, y);
if (y) {
if (qq[i].o == 1) {
ay[y] = tagy[y] = qq[i].y;
} else {
ax[y] = tagx[y] = qq[i].x;
}
}
rt = merge(merge(x, y), z);
for (int j : vc[i]) {
int xx = a[j].fst, yy = a[j].scd;
t1.update(xx, -1);
t2.update(yy, -1);
if (qq[i].o == 1) {
yy = qq[i].y;
} else {
xx = qq[i].x;
}
splitx(rt, qq[i].x, x, z);
splity(x, qq[i].y, x, y);
rt = merge(merge(x, newnode(xx, yy)), merge(y, z));
}
if (t4.query(qq[i].qx + 1) > qq[i].qy) {
ans[i] = 0;
} else {
ans[i] += t1.query(qq[i].qx) + t2.query(qq[i].qy) + sz[rt];
splitx(rt, qq[i].qx, x, z);
splity(x, qq[i].qy, x, y);
ans[i] += sz[y] - n;
}
writeln(ans[i]);
}
}
int main() {
int T = 1;
// scanf("%d", &T);
while (T--) {
solve();
}
flush();
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Subtask #1:
score: 0
Wrong Answer
Test #1:
score: 0
Wrong Answer
time: 3ms
memory: 61772kb
input:
995 996 950 481 376 18 141 776 711 966 130 727 468 529 47 39 857 563 832 821 776 472 154 914 825 279 332 415 470 361 968 440 45 560 299 755 703 785 744 387 547 382 3 549 344 573 778 424 784 765 280 115 251 434 695 98 463 506 379 38 610 486 305 623 703 244 856 365 117 360 772 847 331 723 663 991 900 ...
output:
423 473 758 313 694 232 333 784 821 154 247 244 504 54 200 370 872 782 734 174 660 467 76 754 77 3 140 970 522 411 435 690 503 573 254 116 239 1 0 315 309 494 214 824 429 619 977 696 116 51 66 495 371 279 383 124 313 135 216 406 18 543 1 381 426 164 27 0 158 605 657 541 468 652 557 44 124 517 215 33...
result:
wrong answer 27th numbers differ - expected: '144', found: '140'
Subtask #2:
score: 0
Wrong Answer
Test #9:
score: 0
Wrong Answer
time: 932ms
memory: 115480kb
input:
999996 999996 921339 140126 955508 363759 958698 342406 280137 955674 907511 75721 189876 946586 152058 168837 541857 557702 84498 865987 185574 809224 704828 701026 815379 548000 989515 518951 335439 336866 745570 790616 766723 212893 926629 859003 51261 40866 592510 556235 324926 700261 320946 798...
output:
0 0 953730 0 0 587546 0 0 0 0 -330458 0 0 0 0 -418270 0 0 0 0 0 0 -226369 0 0 0 0 0 0 0 0 0 0 0 -697615 0 0 -701549 0 0 0 0 -686645 0 0 0 -701138 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -695553 -701362 0 0 0 0 0 0 -713416 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -710881 0 0 0 0 0 0 0 ...
result:
wrong answer 6th numbers differ - expected: '512663', found: '587546'
Subtask #3:
score: 0
Wrong Answer
Test #17:
score: 0
Wrong Answer
time: 895ms
memory: 123332kb
input:
999995 999997 261379 334440 985281 986034 549380 718157 670003 253925 533027 437989 326806 983213 965935 756259 229069 686789 331338 684961 957559 390618 937820 959719 338153 779814 582581 965418 634156 421264 308778 938878 913059 390904 481477 431492 739774 793015 901442 934600 256704 991485 366691...
output:
160635 633543 123517 313575 450013 383634 574180 2370 203695 326069 117988 567269 652812 199767 380301 380361 105864 373840 788324 703158 609783 648143 367045 497960 57966 478827 745034 75921 543044 251821 769802 436471 480950 235819 509607 757166 763468 396826 262664 2227 267148 165759 558927 16521...
result:
wrong answer 3rd numbers differ - expected: '123519', found: '123517'
Subtask #4:
score: 0
Skipped
Dependency #1:
0%
Subtask #5:
score: 0
Skipped
Dependency #1:
0%