QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#116731 | #4193. Joined Sessions | wsyear | WA | 3ms | 15844kb | C++17 | 3.4kb | 2023-06-29 23:42:54 | 2023-06-29 23:42:56 |
Judging History
answer
/*
* Author: Enucai
* Date: 2022-12-13 09:51:34
* LastEditTime: 2023-06-29 20:21:13
*/
#include <bits/stdc++.h>
#ifdef dbg
#define D(...) fprintf(stderr, __VA_ARGS__)
#define DD(...) D(#__VA_ARGS__ " = "), debug_helper::debug(__VA_ARGS__), D("\n")
#include "C:\Users\wsyear\Desktop\OI\templates\debug.hpp"
#else
#define D(...) ((void)0)
#define DD(...) ((void)0)
#endif
#define rep(i, j, k) for (int i = (j); i <= (k); ++i)
#define per(i, j, k) for (int i = (j); i >= (k); --i)
#define SZ(v) int((v).size())
#define ALL(v) (v).begin(),(v).end()
#define fi first
#define se second
#define gc getchar
#define pc putchar
using ll = long long;
using pii = std::pair<int, int>;
using pll = std::pair<ll, ll>;
using namespace std;
template <class T = int> T read() {
T x = 0; bool f = 0; char ch = gc();
while (!isdigit(ch)) f = ch == '-', ch = gc();
while (isdigit(ch)) x = (x << 3) + (x << 1) + (ch ^ 48), ch = gc();
return f ? -x: x;
}
template <class T> void write(T x) {
if (x >= 0) { if (x > 9) write(x / 10); pc(x % 10 + 48); }
else { pc('-'); if (x < -9) write(-x / 10); pc(48 - x % 10); }
}
const int N = 1000010;
const int M = 2000010;
struct SegMent {
int l, r;
} a[N];
int n, tot, c[M], f[N][4][2], g[4], lst[N], con[N], t[M << 2], sm[N];
int mo(int op, int x, int y) {
if (op) return min(x, y);
else return max(x, y);
}
#define mid ((l + r) >> 1)
void upd(int c, int l, int r, int x, int v, int o) {
if (l == r) return t[c] = mo(o, t[c], v), void();
if (x <= mid) upd(c << 1, l, mid, x, v, o);
else upd(c << 1 | 1, mid + 1, r, x, v, o);
t[c] = mo(o, t[c << 1], t[c << 1 | 1]);
}
int qry(int c, int l, int r, int x, int y, int o) {
if (l == x && r == y) return t[c];
if (y <= mid) return qry(c << 1, l, mid, x, y, o);
else if (x > mid) return qry(c << 1 | 1, mid + 1, r, x, y, o);
else return mo(o, qry(c << 1, l, mid, x, mid, o), qry(c << 1 | 1, mid + 1, r, mid + 1, y, o));
}
#undef mid
int main() {
n = read();
rep (i, 1, n) a[i].l = read(), a[i].r = read();
sort(a + 1, a + n + 1, [&](SegMent x, SegMent y) {
return x.r == y.r ? x.l < y.l : x.r < y.r;
});
bool flag = 0;
rep (i, 1, n - 1) if (a[i].r >= a[i + 1].l) flag = 1;
if (!flag) return puts("impossible"), 0;
rep (i, 1, n) c[2 * i - 1] = a[i].l, c[2 * i] = a[i].r;
sort(c + 1, c + 2 * n + 1);
tot = unique(c + 1, c + 2 * n + 1) - c - 1;
rep (i, 1, n) {
a[i].l = lower_bound(c + 1, c + tot + 1, a[i].l) - c;
a[i].r = lower_bound(c + 1, c + tot + 1, a[i].r) - c;
}
rep (i, 1, tot << 2) t[i] = 0;
rep (i, 1, n) {
if (a[i].l != 1) lst[i] = qry(1, 1, tot, 1, a[i].l - 1, 0);
upd(1, 1, tot, a[i].r, i, 0);
}
rep (i, 1, tot << 2) t[i] = n + 1;
rep (i, 1, n) {
con[i] = qry(1, 1, tot, a[i].l, a[i].r, 1);
upd(1, 1, tot, a[i].r, i, 1);
}
rep (i, 0, n + 1) rep (j, 0, 3) f[i][j][0] = f[i][j][1] = 1E9;
f[0][0][0] = 0;
rep (i, 1, n) rep (j, 0, 3) {
f[i][j][1] = min(f[lst[i]][j][1], f[lst[i]][j][0]) + 1;
f[i][j][0] = f[con[i]][j][1];
int pos = i;
rep (k, 1, j) {
pos = con[pos] != n + 1 ? con[pos] : pos;
f[i][j][0] = min(f[i][j][0], f[pos][j - k][0]);
f[i][j][1] = min(f[i][j][1], f[pos][j - k][1]);
}
}
int res = min(f[n][0][0], f[n][0][1]);
rep (i, 1, 3) if (min(f[n][i][0], f[n][i][1]) < res) return write(i), 0;
puts("impossible");
}
詳細信息
Test #1:
score: 100
Accepted
time: 1ms
memory: 15680kb
input:
4 1 3 2 5 4 7 6 9
output:
1
result:
ok single line: '1'
Test #2:
score: 0
Accepted
time: 1ms
memory: 15692kb
input:
5 1 3 4 7 8 10 2 5 6 9
output:
2
result:
ok single line: '2'
Test #3:
score: 0
Accepted
time: 1ms
memory: 15684kb
input:
3 1 2 2 3 3 4
output:
impossible
result:
ok single line: 'impossible'
Test #4:
score: 0
Accepted
time: 3ms
memory: 15696kb
input:
6 1 3 2 5 4 7 6 9 8 11 10 12
output:
3
result:
ok single line: '3'
Test #5:
score: 0
Accepted
time: 3ms
memory: 15676kb
input:
8 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9
output:
2
result:
ok single line: '2'
Test #6:
score: 0
Accepted
time: 3ms
memory: 15680kb
input:
5 1 2 2 3 3 4 5 6 6 7
output:
impossible
result:
ok single line: 'impossible'
Test #7:
score: 0
Accepted
time: 0ms
memory: 5312kb
input:
2 1 2 5 6
output:
impossible
result:
ok single line: 'impossible'
Test #8:
score: 0
Accepted
time: 3ms
memory: 15672kb
input:
2 1 3 2 4
output:
impossible
result:
ok single line: 'impossible'
Test #9:
score: 0
Accepted
time: 1ms
memory: 15700kb
input:
5 3 5 2 7 1 10 6 8 9 11
output:
impossible
result:
ok single line: 'impossible'
Test #10:
score: 0
Accepted
time: 2ms
memory: 15664kb
input:
10 229 315 444 459 459 828 232 324 350 371 208 235 371 430 430 456 324 350 172 208
output:
3
result:
ok single line: '3'
Test #11:
score: 0
Accepted
time: 3ms
memory: 15844kb
input:
15 227 313 471 486 487 522 230 322 377 398 206 233 398 457 457 483 322 348 102 138 138 206 348 377 476 506 522 885 67 102
output:
1
result:
ok single line: '1'
Test #12:
score: -100
Wrong Answer
time: 3ms
memory: 15664kb
input:
20 261 347 505 520 521 556 264 356 411 432 240 267 432 491 491 517 356 382 136 172 172 240 382 411 510 540 556 579 67 102 579 931 22 80 69 136 271 327 11 53
output:
1
result:
wrong answer 1st lines differ - expected: '2', found: '1'