QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#116731#4193. Joined SessionswsyearWA 3ms15844kbC++173.4kb2023-06-29 23:42:542023-06-29 23:42:56

Judging History

你现在查看的是最新测评结果

  • [2023-08-10 23:21:45]
  • System Update: QOJ starts to keep a history of the judgings of all the submissions.
  • [2023-06-29 23:42:56]
  • 评测
  • 测评结果:WA
  • 用时:3ms
  • 内存:15844kb
  • [2023-06-29 23:42:54]
  • 提交

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'