题目链接: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; } }