好好读题,好好看数据范围!因为没有记住 不同时成立,想了分27种情况讨论。。。都已经想到要倒着看了
ε=ε=ε=(#>д<)ノ 补题的时候顺带又复习了set s.lower_bound(x)
#include<iostream>
#include<set>
#include<algorithm>
//由于满足不完全覆盖,因此一个值x大,y就会小。数据说明里也提到了,没看到真的窒息
using namespace std;
typedef long long LL;
const int N=50000+10;
int x[N];
int y[N];
LL ans=0;
void solve(int a[],int n)
{
set<int> s;
set<int>::iterator it;
ans+=a[n];
s.insert(a[n]);
for(int i=n-1;i>=1;--i)
{
it=s.lower_bound(a[i]);
if(it==s.begin()) //如果第一个大于它的值是begin,说明它是最小的值,它一定是最高的,没有wave能遮住他
ans+=a[i];
else
{
--it;
ans+=a[i]-*it; //找到的是和它最近的最小的,*it是它被遮住的部分,答案加上那个未被遮住的
}
s.insert(a[i]);
}
}
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;++i)
{
cin>>x[i]>>y[i];
}
//cout<<"?"<<endl;
solve(x,n);
solve(y,n);
cout<<ans<<endl;
}