#include <bits/stdc++.h>
#define ll long long
#define task "FIRE"
using namespace std;
const int N = 1e6 + 16;
const ll INF = 1e18;
int n, m;
ll s[N], e[N];
namespace sub6 {
ll cnt, result = INF;
pair <ll, ll> a[N];
vector < pair <ll, ll> > checkLines;
bool cmp(pair <ll, ll> a, pair <ll, ll> b) {
if (a.first == b.first) {
return a.second > b.second;
}
return a.first < b.first;
}
ll prefix[N];
int up[N][26];
int findPos(ll k) {
int l = 1, r = n, mid, pos = 0;
while (l <= r) {
mid = l + r >> 1;
if (a[mid].first <= k) {
pos = mid;
l = mid + 1;
}
else {
r = mid - 1;
}
}
return pos;
}
void build() {
for (int i = 1; i <= n; i++) {
prefix[i] = max(prefix[i - 1], a[i].second);
}
for (int i = 1; i <= n; i++) {
up[i][0] = findPos(prefix[i] + 1);
}
for (int j = 1; j <= 20; j++) {
for (int i = 1; i <= n; i++) {
up[i][j] = up[up[i][j - 1]][j - 1];
}
}
}
ll query(pair <ll, ll> target) {
int u = target.first, v = target.second, ans = 0;
int cur = findPos(u);
if (cur == 0) {
return -1;
}
if (prefix[cur] < u) {
return -1;
}
if (prefix[cur] >= v) {
return 1;
}
for (int k = 20; k >= 0; k--) {
if (up[cur][k] != 0 && prefix[up[cur][k]] < v) {
cur = up[cur][k];
ans += (1 << k);
}
}
cur = up[cur][0];
if (cur == 0) {
return -1;
}
ans += 2;
return ans;
}
void solve() {
checkLines.push_back({0, m - 1});
for (int i = 1; i <= n; i++) {
if (s[i] > e[i]) {
checkLines.push_back({e[i], e[i] + m});
e[i] += m;
}
a[i] = {s[i], e[i]};
}
sort(a + 1, a + 1 + n, cmp);
build();
for (auto x : checkLines) {
ll ans = query(x);
if (ans == -1) {
continue;
}
result = min(result, ans);
}
if (result == INF) {
result = -1;
}
cout << result;
}
}
int main() {
ios_base :: sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
if (fopen(task".inp", "r")) {
freopen(task".inp", "r", stdin);
freopen(task".out", "w", stdout);
}
cin >> n >> m;
for (int i = 1; i <= n; i++) {
cin >> s[i] >> e[i];
}
sub6 :: solve();
return 0;
}
컴파일 시 표준 에러 (stderr) 메시지
Main.cpp: In function 'int main()':
Main.cpp:114:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
114 | freopen(task".inp", "r", stdin);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
Main.cpp:115:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
115 | freopen(task".out", "w", stdout);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |