题目链接:https://ac.nowcoder.com/acm/contest/53284/F

大意是给出n个人的左边范围,求对于任意两个人的左边,输出能够覆盖他们之间所有人的矩形最小面积

解决方法:

大小的线段树维护一下当前x所指到的最大y和最小y,这样矩阵的最小面积就等于(x1-x2)*(当前x的最大 - 当前x的最小) 

这里需要注意的是当x1>=x2的时候为0。

最后就是求大小的线段树了。还是需要学习一下。

代码省略线段树模板部分

code:

int find(int x){
	return 	lower_bound(a.begin(),a.end(),x) - a.begin()+1;
}
int main()
{
	//cin.ignore(numeric_limits<streamsize>::max(),'\n');
	ios_base::sync_with_stdio(0); cin.tie(0); //cout.tie(0);
	int n;
	cin>>n;
	int x,y;
	for(int i=1;i<=n;i++){
		cin>>x>>y;
		p[i] = {x,y};
		a.push_back(x);
	}
	sort(a.begin(),a.end());
	a.erase(unique(a.begin(),a.end()),a.end());
	for(int i=0;i<a.size();i++){
		w[i+1] = a[i];
	}
	build(1,1,a.size());
	for(int i=1;i<=n;i++){
		int x = p[i].first;
		x = find(x);
		modify(1,x,p[i].second);//线段树中存储排序后的x的y最大值和最小值。
		//这样区间最小为(x1-x2)*(当前x的y最大值- 当前x的y最小值);
	}
	int m;
	cin>>m;
	for(int i=1;i<=m;i++){
		cin>>x>>y;
		int px = find(p[x].fi),py = find(p[y].fi);
		if(px>=py) cout<<0<<endl;
		else cout<<1LL*(query2(1,px,py)-query1(1,px,py))*(p[y].fi-p[x].fi)<<endl;
	}
}