Official

A - Intersection Editorial by mechanicalpenciI


これは区間 \([L_1,R_1]\)\([L_2,R_2]\) の共通区間の長さを求めよという問題です。

結論から言えば、答えは \(\max(0,\min(r1,r2)-\max(l1,l2))\) で求める事ができ、これを知っていれば早いと思います。

これを知らない時にどうするかについて書いていきます。

この問題の大変な点は、大小関係の多様さにあります。具体的には、

  • \(L_1\leq R_1\leq L_2\leq R_2\)
  • \(L_1\leq L_2\leq R_1\leq R_2\)
  • \(L_1\leq L_2\leq R_2\leq R_1\)
  • \(L_2\leq L_1\leq R_1\leq R_2\)
  • \(L_2\leq L_1\leq R_2\leq R_1\)
  • \(L_2\leq R_2\leq L_1\leq R_1\)

\(6\) 通りが考えられます。なお、複数に属するものはそれらのうちどれに分類しても問題ないです。 まず、\(L_1>L_2\) なら \((L_1,R_1)\)\((L_2,R_2)\) を交換することによって、大小関係を \(3\) 通りに減らすことができ、それぞれの時の答えは次のようになります。

  • \(L_1\leq R_1\leq L_2\leq R_2\) \(\to\) \(0\)
  • \(L_1\leq L_2\leq R_1\leq R_2\) \(\to\) \(R_1-L_2\)
  • \(L_1\leq L_2\leq R_2\leq R_1\) \(\to\) \(R_2-L_2\)

これを if 文を用いて実装すればよいです。

よって、この問題を解くことができました。

C++による実装例 :

#include <bits/stdc++.h>
using namespace std;

int main() {
	int l1, r1, l2, r2;
	cin >> l1 >> r1 >> l2 >> r2;
	if (l1 > l2) {
		swap(l1, l2);
		swap(r1, r2);
	}
	if (r1 <= l2)cout << 0 << endl;
	else if (r1 <= r2)cout << r1 - l2 << endl;
	else cout << r2 - l2 << endl;
        // cout << max(0, min(r1, r2) - max(l1, l2)) << endl; (実はこれでok)
	return 0;
}
// 

pythonによる実装例 :

l1,r1,l2,r2 = map(int, input().split())
if(l1>l2):
    l1,r1,l2,r2=l2,r2,l1,r1
if(r1<=l2):
    print(0)
elif(r1<=r2):
    print(r1-l2)
else:
    print(r2-l2)

posted:
last update: