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: