bzoj4099【Usaco2015 Open】Trapped in the Haybales

4099: [Usaco2015 Open]Trapped in the Haybales

Time Limit: 10 Sec   Memory Limit: 128 MB
Submit: 20   Solved: 14
[ Submit][ Status][ Discuss]

Description

Farmer John has received a shipment of N large hay bales (1≤N≤100,000), and placed them at various locations along the road leading to his barn. Unfortunately, he completely forgets that Bessie the cow is out grazing along the road, and she may now be trapped within the bales!
Each bale j has a size Sj and a position Pj giving its location along the one-dimensional road. Bessie the cow can move around freely along the road, even up to the position at which a bale is located, but she cannot cross through this position. As an exception, if she runs in the same direction for D units of distance, she builds up enough speed to break through and permanently eliminate any hay bale of size strictly less than D. Of course, after doing this, she might open up more space to allow her to make a run at other hay bales, eliminating them as well.
Bessie can escape to freedom if she can eventually break through either the leftmost or rightmost hay bale. Please compute the total area of the road consisting of real-valued starting positions from which Bessie cannot escape.

Input

The first line of input contains N. Each of the next N lines describes a bale, and contains two integers giving its size and position, each in the range 1…10^9. All positions are distinct.

Output

Print a single integer, giving the area of the road from which Bessie cannot escape.

Sample Input

5
8 1
1 4
8 8
7 15
4 20

Sample Output

14

HINT

Source

Gold





考虑两个干草包i和j,如果贝西可以突破i+1到j-1之间的所有干草包,但是不能突破i和j,那么i和j之前的干草包的大小一定小于这两个干草包。所以我们就可以按照干草包的大小从大到小排序,按这个顺序依次将每一个干草包放置到相应的位置上,并且寻找当前情况下它左边和右边的干草包,分别看两边是否可以突破,如果可以则标记相对应的一段区间。在寻找左边和右边的干草包时可以用set维护。因为干草包距离可能很大,所以要用离散化




#include
#include
#include
#include
#include
#include
#include
#define F(i,j,n) for(int i=j;i<=n;i++)
#define D(i,j,n) for(int i=j;i>=n;i--)
#define MAXN 100005
using namespace std;
struct haybale
{
	int s,p;
}a[MAXN];
int f[MAXN],sz[MAXN],ans=0,n;
bool cov[MAXN];
mapmp,mp_2;
setst;
set::iterator si,sj;
bool cmp_1(haybale x,haybale y)
{
	return x.s>y.s;
}
bool cmp_2(int x,int y)
{
	return x=f[r]-f[l]&&!cov[l]) F(i,l,r-1) cov[i]=true;
		}
		si=st.end();
		si--;
		if (*si>a[i].p)
		{
			sj=st.lower_bound(a[i].p);
			int l=mp[a[i].p],r=mp[*sj];
			if (a[i].s>=f[r]-f[l]&&!cov[l]) F(i,l,r-1) cov[i]=true;
		}
		st.insert(a[i].p);
	}
	F(i,1,n-1) if (cov[i]) ans+=f[i+1]-f[i];
	printf("%d\n",ans);
}


你可能感兴趣的:(好题,离散化,OIer的狂欢)