Problem:
I: 破壊 (Ravage)

サンタクロースは、街のイルミネーションに引っかかり、壊した。

イルミネーションにはN個の電球があり、$i$ 番目の電球は電圧が $A_i$ 以上 $B_i$ 以下のときにしか付かなくなってしまった。

電圧はイルミネーションのどこでも同じにする必要がある。

電圧を調節することで、最大いくつの電球を同時に光らせることができるか求めよ。

入力

1 行目には整数 $N$ が与えられる。

続く $N$ 行のうち $i$ 行目には $A_i, B_i$ が空白区切りで与えられる。

出力

同時に光らせることができる電球の個数の最大値を出力せよ。

制約

$N$ は $1$ 以上 $100 \ 000$ 以下の整数

$A_1, A_2, A_3, \dots, A_N$ は $1$ 以上 $1 \ 000 \ 000 \ 000$ 以下の整数

$B_1, B_2, B_3, \dots, B_N$ は $1$ 以上 $1 \ 000 \ 000 \ 000$ 以下の整数

すべての電球 $i$ について、$A_i \leq B_i$ を満たす

入力例1

4
1 4
3 6
2 7
5 8

出力例1

3

電圧が $5$ や $3.14$ のときに $3$ つの電球がつきます。

入力例2

2
1 2
2 3

出力例2

2

Solution in C (judge verdict: Accepted)

#include <stdio.h>
#include <stdlib.h>

int cmp(const void* x, const void* y) {
	int a = *(const int*)x, b = *(const int*)y;
	return a < b ? -1 : a > b;
}

int N;
int A[114514];
int B[114514];

int asumisu;
int mizuhasu[271828];

int sintasu(int dachaann) {
	int l = 0, r = asumisu - 1;
	while (l <= r) {
		int m = l + (r - l) / 2;
		if (mizuhasu[m] == dachaann) return m;
		else if (mizuhasu[m] < dachaann) l = m + 1;
		else r = m - 1;
	}
	exit(2);
	return 0;
}

int hanazawakana[271828];

int main(void) {
	int i;
	int hayamisaori;
	if (scanf("%d", &N) != 1) return 1;
	for (i = 0; i < N; i++) {
		if (scanf("%d%d", &A[i], &B[i]) != 2) return 1;
		mizuhasu[i * 2] = A[i];
		mizuhasu[i * 2 + 1] = B[i] + 1;
	}
	qsort(mizuhasu, N * 2, sizeof(*mizuhasu), cmp);
	asumisu = 1;
	for (i = 1; i < N * 2; i++) {
		if (mizuhasu[asumisu - 1] != mizuhasu[i]) {
			mizuhasu[asumisu++] = mizuhasu[i];
		}
	}
	for (i = 0; i < N; i++) {
		hanazawakana[sintasu(A[i])]++;
		hanazawakana[sintasu(B[i] + 1)]--;
	}
	for (i = 1; i < asumisu; i++) {
		hanazawakana[i] += hanazawakana[i - 1];
	}
	hayamisaori = 0;
	for (i = 0; i < asumisu; i++) {
		if (hanazawakana[i] > hayamisaori) hayamisaori = hanazawakana[i];
	}
	printf("%d\n", hayamisaori);
	return 0;
}