https://www.acmicpc.net/problem/2170
도화지에 선을 그으려고 한다. 선분끼리 겹쳐서 그린 곳은 한번만 계산한다고 할 때 그려진 선들의 총 길이를 구하는 문제다.
입력
첫째 줄에 선을 그은 횟수 N(1 ≤ N ≤ 1,000,000)이 주어진다. 다음 N개의 줄에는 선을 그을 때 선택한 두 점의 위치 x, y(-1,000,000,000 ≤ x < y ≤ 1,000,000,000)가 주어진다.
선분들을 pair로 입력받고 오름차순 정렬을 했다.
선분이 겹치는 경우를 고려하면 3가지 경우의 수가 있다.
계산할 선분의 시작을 s 끝을 e로 둔다.

if(v[i].second >= v[i+1].first && v[i].second <= v[i+1].second)
{
s = v[i].first;
e = v[i+1].second;
}

v[i].second > v[i+1].second
{
s = v[i].first;
e = v[i].second;
}

v[i].second < v[i+1].first
{
res += e - s;
s = v[i+1].first;
e = v[i+1].second;
}
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int n, s, e, res;
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> n;
vector<pair<int, int>> v(n);
for (int i = 0; i < n; i++)
cin >> v[i].first >> v[i].second;
sort(v.begin(), v.end());
s = v[0].first, e = v[0].second;
for (int i = 1; i < n; i++)
{
if (e < v[i].first)
{
res += (e - s);
s = v[i].first, e = v[i].second;
}
else if (e >= v[i].first && e <= v[i].second)
e = v[i].second;
}
res += (e - s);
cout << res << "\n";
}