Trace
问题分析
题意:
n
n
波矩形海浪,每次都会在沙滩上留下痕迹,求最后的痕迹长度。
题解:因为题里保证了不会有海浪覆盖的情况,所以波海浪都会凸出去,如果画个图看,就会发现我们只要逆序的处理每一个横坐标去找离它最近的并且比它小的横坐标累加这两个坐标的差值即可,纵坐标亦是如此。
如果当前坐标比列表已经处理的坐标小,那根据题目要求,对应的另一个坐标肯定要比他们都大,所以需要加上它的全部;如果能找到比当前坐标小的,那么我们就直接累加它俩的差值即可。
代码
#include <bits/stdc++.h>
typedef long long LL;
int n,x,y;
LL love(std::vector<int> fuck)
{
std::set<int> s;
LL ret = 0;
for(int i = n-1; i >= 0; --i) {
std::set<int>::iterator iter = s.lower_bound(fuck[i]);
if(iter == s.begin()) //比当前列表里所有的都小
ret += fuck[i];
else //反之累加离它最近的比它小的坐标差值
ret += fuck[i] - *(--iter);
s.insert(fuck[i]);
}
return ret;
}
int main(int argc, char const *argv[]) {
scanf("%d", &n);
std::vector<int> s,b;
for(int i = 0; i < n; ++i) {
scanf("%d%d",&x,&y);
s.push_back(x);
b.push_back(y);
}
printf("%lld\n", love(s)+love(b));
return 0;
}