10.22T5 单调性
#2718 矩形覆盖
描述
在直角坐标系中,给出N个矩形,他们的中心点是坐标系中的原点,它们的边与坐标轴平行。每个矩形都用其宽度(沿x轴)和高度(沿y轴)表示。下图是样例1的图示。
L已经为每个矩形上色了一个颜色,现在他想知道有颜色的区域数量。换句话说,他想知道属于至少一个矩形的单位正方形的数量。
输入
第一行是一个正整数N
接下来N行,每行是2个偶数x,y。表示每个矩形的宽和高
输出
1个整数
提示
【说明】
40%数据所有数字小于3333
50%数据中没有一个矩形被另外一个矩形包含
100%数据:1<=n<=1000 000,2<=x,y<=10 000 000
标签
维护一个x单增,y递减的序列就可以了,sort一下然后线性递推就可以了
code:
1 #include<iostream> 2 #include<algorithm> 3 #include<cstdio> 4 #define N 1000005 5 using namespace std; 6 struct node{ 7 long long x,y; 8 node(){ 9 x=0,y=0; 10 } 11 }e[N]; 12 long long read(){ 13 long long x=0,f=1; 14 char c=getchar(); 15 while(!isdigit(c)){ 16 if(c=='-')f=-1; 17 c=getchar(); 18 } 19 while(isdigit(c)){ 20 x=(x<<3)+(x<<1)+c-'0'; 21 c=getchar(); 22 } 23 return x*f; 24 } 25 bool cmp(const node&a,const node &b){ 26 if(a.x==b.x)return a.y>b.y; 27 return a.x<b.x; 28 } 29 int q[N]; 30 int main(){ 31 long long n; 32 n=read(); 33 for(int i=1;i<=n;i++){ 34 int a,b; 35 e[i].x=read(),e[i].y=read(); 36 } 37 sort(e+1,e+n+1,cmp); 38 int head=1; 39 for(int i=1;i<=n;i++){ 40 while(head&&e[q[head]].x<=e[i].x&&e[q[head]].y<=e[i].y)head--; 41 q[++head]=i; 42 } 43 long long ans=0; 44 for(int i=1;i<=head;i++){ 45 ans+=(e[q[i]].x-e[q[i-1]].x)*e[q[i]].y; 46 } 47 cout<<ans; 48 return 0; 49 }
over