From f1eb76cd9e966bdbc73b50917be76fb39829f707 Mon Sep 17 00:00:00 2001 From: hanyixuanten <105723997+hanyixuanten@users.noreply.github.com> Date: Fri, 10 Jul 2026 19:49:31 +0800 Subject: [PATCH] new file: P1668.cpp --- P1668.cpp | 79 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 P1668.cpp diff --git a/P1668.cpp b/P1668.cpp new file mode 100644 index 0000000..bd17681 --- /dev/null +++ b/P1668.cpp @@ -0,0 +1,79 @@ +#include +using namespace std; +struct no +{ + int l, r, s; + inline const bool operator<(const no b) const + { + return r < b.r; + } +} cow[(int)2.5e4 + 1], seg[(int)4e6 + 5]; +void init(int now, int l, int r) +{ + seg[now].l = l; + seg[now].r = r; + seg[now].s = 0x7f7f7f7f; + if (l != r) + { + init(now * 2, l, (l + r) / 2); + init(now * 2 + 1, (l + r) / 2 + 1, r); + } + return; +} +int query(int now, int l, int r) +{ + if (seg[now].l > r || seg[now].r < l) + return 0x7f7f7f7f; + if (seg[now].l >= l && seg[now].r <= r) + return seg[now].s; + int mid = (seg[now].l + seg[now].r) / 2; + if (r <= mid) + return query(2 * now, l, r); + else if (l >= mid + 1) + return query(2 * now + 1, l, r); + else + return min(query(2 * now, l, r), query(2 * now + 1, l, r)); +} +void edit(int now, int num, int location) +{ + if (seg[now].l == seg[now].r) + { + seg[now].s = num; + return; + } + seg[now].s = min(num, seg[now].s); + int mid = (seg[now].l + seg[now].r) / 2; + if (location <= mid) + edit(2 * now, num, location); + else + edit(2 * now + 1, num, location); + return; +} +// int f[(int)2.5e4 + 1]; // 到i最小代价 +int n, t; +int main() +{ + // freopen("cleaning.in", "r", stdin); + // freopen("cleaning.out", "w", stdout); + scanf("%d %d", &n, &t); + for (int i = 1; i <= n; ++i) + { + scanf("%d %d", &cow[i].l, &cow[i].r); + } + sort(cow + 1, cow + n + 1); + init(1, 0, t); + edit(1, 0, 0); + // query(1, 1, 1); + for (int i = 1; i <= n; ++i) + { + // printf("%d\n", i); + int q = query(1, cow[i].l - 1, cow[i].r - 1); + if (q + 1 < query(1, cow[i].r, cow[i].r)) + edit(1, q + 1, cow[i].r); + } + // for (int i = 0; i <= t; ++i) + // printf("%d ", f[i]); + int ans = query(1, t, t); + printf("%d\n", (ans > n) ? -1 : ans); + return 0; +} \ No newline at end of file