Submission #1140113

#TimeUsernameProblemLanguageResultExecution timeMemory
1140113AbdullahIshfaqFire (BOI24_fire)C++20
31 / 100
1 ms584 KiB
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define MOD 998244353
const int N = 5005;
const int lg = 13;
ll n, m, s[N], e[N];
int bst[N];
int sp[N][lg];
void solve(){
	cin >> n >> m;
	for (int i = 0; i < n; i++){
		cin >> s[i] >> e[i];
	}
	for (int i = 0; i < n; i++) {
		if (s[i] > e[i]){
			e[i] += m;
		}
	}
	for (int i = 0; i < n; i++) {
		s[i+n] = s[i] + m;
		e[i+n] = e[i] + m;
	}
	n *= 2;
	int cnt = 0;
	vector<pair<ll, ll>> ranges;
	for (int i = 0; i < n; i++) 
		ranges.push_back({s[i], -e[i]});
	sort(ranges.begin(), ranges.end());
	ll last = -1;
	for (auto j : ranges) {
		ll start = j.first;
		ll end = -j.second;
		if (end <= last) { 
			continue;
		}
		last = end;
		s[cnt] = start;
		e[cnt] = end;
		cnt++;
	}
	n = cnt;
	ranges.clear();
	for (int i = 0; i < n; i++) 
		ranges.push_back({s[i], i});
	sort(ranges.begin(), ranges.end());
	int i = 0;
	for (auto j : ranges) {
		while (i < n) {
			if (s[ranges[i].second] > e[j.second]){
				break;
			}
			i++;
		}
		bst[j.second] = ranges[i - 1].second;
	}
	for (int i = 0; i < n; i++){
		sp[i][0] = bst[i];
	}
	for (int k = 1; k < lg; k++) 
		for (int i = 0; i < n; i++)
			sp[i][k] = sp[sp[i][k-1]][k-1];
	int ans = -1;
	for (int i = 0; i < n; i++) {
		ll st = s[i];
		int mn = 0;
		int rt = i;
		for (int i = lg-1; i >= 0; i--) {
			if (e[sp[rt][i]] < (st + m)) { 
				mn += (1<<i);
				rt = sp[rt][i];
			}
		}
		mn++;
		rt = sp[rt][0];

		if (e[rt] < (st + m)) {
			continue;
		}
		if (ans == -1 or mn + 1 < ans) ans = mn + 1;
	}
	cout << ans << endl;
}
int main() {
	ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	int tests = 1;
	// cin >> tests;
	for(int i = 1; i <= tests; i++){
		solve();
	}
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...