P1496 火烧赤壁
思路
离散化+染色思想(妙)。离散化得到所有数据的映射后只要根据原来的区间将新的区间进行染色,就能够实现题意(包括重复染色的问题也能得到解决),最后计算时如果区间被染色就把区间长度加入答案中。
代码
#include<iostream>
#include<algorithm>
#define MAXN 20007
using namespace std;
int l[MAXN], r[MAXN], d[MAXN << 1], cnt, n;
bool f[MAXN << 1]; long long ans;
int main(void)
{
cin >> n;
for (int i = 1; i <= n; i++)
{
cin >> l[i] >> r[i];
d[++cnt] = l[i];
d[++cnt] = r[i];
}
sort(d + 1, d + cnt + 1);
int len = unique(d + 1, d + cnt + 1) - d - 1;
for (int i = 1; i <= n; i++)
{
int x = lower_bound(d + 1, d + len + 1, l[i]) - d;
int y = lower_bound(d + 1, d + len + 1, r[i]) - d;
for (int j = x; j < y; j++)
f[j] = true;
}
for (int i = 1; i < len; i++)
if (f[i]) ans += d[i + 1] - d[i];
cout << ans;
return 0;
}