There‘s a beach in the first quadrant. And from time to time, there are sea waves. A wave ( xx , yy) means the wave is a rectangle whose vertexes are ( 00 , 00 ), ( xx , 00 ), ( 00 , yy ), ( xx , yy ). Every time the wave will wash out the trace of former wave in its range and remain its own trace of ( xx , 00 ) -> ( xx , yy ) and ( 00 , yy ) -> ( xx , yy ). Now the toad on the coast wants to know the total length of trace on the coast after n waves. It‘s guaranteed that a wave will not cover the other completely.
Input
The first line is the number of waves n(n \le 50000)n(n≤50000).
The next nn lines,each contains two numbers xxyy ,( 0 < x0<x , y \le 10000000y≤10000000 ),the ii-th line means the ii-th second there comes a wave of ( xx , yy ), it‘s guaranteed that when 1 \le i1≤i , j \le nj≤n,x_i \le x_jxi?≤xj? and y_i \le y_jyi?≤yj? don‘t set up at the same time.
Output
An Integer stands for the answer.
Hint:
As for the sample input, the answer is 3+3+1+1+1+1=103+3+1+1+1+1=10
样例输入复制
3 1 4 4 1 3 3
样例输出复制
10
题目来源
#include<bits/stdc++.h>
using namespace std;
int n;
long long dfs(vector<long long>w) {
long long sum=0;
set<int>s;
set<int>::iterator it;
for(int i=n-1;i>=0;i--) {
it=s.lower_bound(w[i]);//找到在它之前大于等于的,即在这之前是被覆盖的
if(it==s.begin()){//没有比它小的则不被覆盖直接加
sum += w[i];
}
else{
it--;
sum+=w[i]-*it;
}
s.insert(w[i]);
}
return sum;
}
int main() {
long long x,y;
vector<long long> we,ww;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%ld %ld",&x,&y);
we.push_back(x);//横坐标
ww.push_back(y);//纵坐标
}
printf("%lld\n",dfs(we)+dfs(ww));
return 0;
}