#include #include #define MAXN 1000000 #define MAXLOG 20 static int n, m; static struct zamestnanec { int a, b; } zamestnanci[MAXN]; static struct { int zamestnanec, doba; } nasledujici[MAXLOG][MAXN]; static int cas_mezi(int f, int t) { return (t - f + m) % m; } static int pracovni_doba(const struct zamestnanec *z) { return cas_mezi(z->a, z->b); } static int dle_konce(const void *z1, const void *z2) { const struct zamestnanec *zz1 = z1; const struct zamestnanec *zz2 = z2; if (zz1->b == zz2->b) return pracovni_doba(zz1) - pracovni_doba(zz2); return zz1->b - zz2->b; } static int v_intervalu(struct zamestnanec *interval, int cas) { if (interval->a <= interval->b) return interval->a <= cas && cas <= interval->b; return cas >= interval->a || cas <= interval->b; } int main (void) { int i, t, e, doba; scanf("%d%d", &n, &m); for (i = 0; i < n; i++) scanf("%d%d", &zamestnanci[i].a, &zamestnanci[i].b); qsort(zamestnanci, n, sizeof(struct zamestnanec), dle_konce); // Pro zjednodušení: končí-li více zaměstnanců ve stejnou dobu, stačí // uvažovat toho z nich s nejkratší pracovní dobou. e = 1; for (i = 1; i < n; i++) if (zamestnanci[i].b != zamestnanci[i - 1].b) zamestnanci[e++] = zamestnanci[i]; n = e; e = 0; doba = 0; for (t = 0; t < n; t++) { while (v_intervalu(zamestnanci + e, zamestnanci[t].b)) { int ne = (e + 1) % n; doba += cas_mezi(zamestnanci[e].b, zamestnanci[ne].b); e = ne; if (doba >= m) { /* Speciální případ: všichni pracují ve stejný čas (konec pracovní doby zaměstnance t). */ printf("1\n"); return 0; } } nasledujici[0][t].zamestnanec = e; nasledujici[0][t].doba = doba; doba -= cas_mezi(zamestnanci[t].b, zamestnanci[(t + 1) % n].b); } int log = 0; while ((1 << log) <= n) log++; for (i = 1; i < log; i++) for (t = 0; t < n; t++) { int m = nasledujici[i - 1][t].zamestnanec; nasledujici[i][t].zamestnanec = nasledujici[i - 1][m].zamestnanec; nasledujici[i][t].doba = nasledujici[i - 1][t].doba + nasledujici[i - 1][m].doba; } int min_potreba = n; for (t = 0; t < n; t++) { int potreba = 1; doba = 0; e = t; for (i = log - 1; i >= 0; i--) if (doba + nasledujici[i][e].doba < m) { doba += nasledujici[i][e].doba; potreba += (1 << i); e = nasledujici[i][e].zamestnanec; } if (potreba < min_potreba) min_potreba = potreba; } printf("%d\n", min_potreba); return 0; }