标签:
/* 线段树可以做 但是代码太长了 set就可以完成这件事 将2*n个点进行排序 记录好是左端点还是右端点 关键是维护当前的高度是多少 set支持插入 删除 还有查询最大值 非常好 然后依次扫描 如果是左端点 就插入高度 反之删除高度 */ #include<iostream> #include<cstdio> #include<cstring> #include<vector> #include<set> #include<algorithm> #define ll long long #define pa pair<int,int> using namespace std; int n; ll ans; vector<pair<pa,bool> >p; multiset<int> h; int main() { h.insert(0); p.push_back(make_pair(make_pair(0,0),0)); scanf("%d",&n);int a,b,c; for(int i=1;i<=n;i++) { scanf("%d%d%d",&a,&b,&c); p.push_back(make_pair(make_pair(a,c),1)); p.push_back(make_pair(make_pair(b,c),0)); } sort(p.begin(),p.end()); for(int i=1;i<=n*2;i++) { ans+=(ll)(p[i].first.first-p[i-1].first.first)*(*h.rbegin()); if(p[i].second)h.insert(p[i].first.second); else h.erase(h.find(p[i].first.second)); } cout<<ans<<endl; return 0; }
标签:
原文地址:http://www.cnblogs.com/yanlifneg/p/5674571.html