​题目传送门​

//解题思路参考了[点这里]
//通过这道题,我学到了很多的东西,线将我的体会总结如下.
//题意:有n(1e5)个灯塔,每个灯塔有属性(坐标a[i].first,向左的照射范围a[i].second),所有灯塔坐标两两不同。
我们从右往左,对于每个灯塔,其所照射到的所有灯塔都被认定为被破坏。
我们现在可以在所有灯塔的右边,布置一个新的灯塔,位置和范围任意定。
问你,是否有一种布置灯塔的方案,可以使得被破坏的灯塔数尽可能少,并输出最少破坏的灯塔数。
//解题思路:尝试暴力!
我们发现,我们新灯塔的功能,其实是使得最右面的若干个灯塔失效。
意思就是,使得第1,2,3,4,5,……,n个灯塔,作为没被破坏的最后一个灯塔。

我们能否算出第i个灯塔,作为没被破坏的最后一个灯塔条件下的答案呢?
这个显然是很容易做到的。我们可以按照灯塔坐标对这n个灯塔做升序排序。

然后,对于第i个灯塔,它可以破坏掉的区间范围是a[i].first-a[i].second
设最后一个破坏掉的位置为pos,那么我们在a中做二分, 查找第一个位置比pos小的。之前的便全部保留了。

基于这个方式,我们就可以在O(nlogn)的条件下,枚举最后一个没被破坏的灯塔,暴力过掉这道题了。
//AC代码如下:
//Created Author: just_sort
//Created Time : 2016/1/20 15:43
//File Name : Chain Reaction
#include <cstdio>
#include <cstring>
#include <cctype>
#include <limits.h>
#include <iostream>
#include <algorithm>
using namespace std;
#define Read(x) scanf("%d",&x)
const int maxn = 100010;
pair <int,int> a[maxn];
int n;
int ans[maxn];
int main()
{
Read(n);
for(int i=1;i<=n;i++)
{
Read(a[i].first);
Read(a[i].second);
}
int answer=INT_MAX;
sort(a+1,a+n+1);
a[n+1].first=-1;
ans[0]=0;
for(int i=1;i<=n;i++)
{
int pos=lower_bound(a+1,a+i,make_pair(a[i].first-a[i].second,-1))-a-1;
ans[i]=ans[pos]+1;
answer=min(answer,n-ans[i]);
}
printf("%d\n",answer);
return 0;
}