题目链接: https://nanti.jisuanke.com/t/41399
用差分做即可。最后如果直接遍历会超时,所以用map存端点(还能自动帮我们排序,真好) 。
#include <iostream>
#include <cstdio>
#include <map>
using namespace std;
int c = 1;
int main(void)
{
int t;
scanf("%d", &t);
while (t--)
{
int n, m;
scanf("%d %d", &n, &m);
map<int, int> arr;
while (m--)
{
int a, b;
scanf("%d %d", &a, &b);
++arr[a];
--arr[b + 1];
}
int sum = 0;
int ans = 0;
int pos = 0;
for (const auto& ele : arr)
{
if (sum % 2)
{
ans += ele.first - pos;
}
pos = ele.first;
sum += ele.second;
}
cout << "Case #" << c++ << ": " << ans << endl;
}
}