10.22T5 单调性

#2718 矩形覆盖

 

描述

 在直角坐标系中,给出N个矩形,他们的中心点是坐标系中的原点,它们的边与坐标轴平行。每个矩形都用其宽度(沿x轴)和高度(沿y轴)表示。下图是样例1的图示。

20171108122836_18062

L已经为每个矩形上色了一个颜色,现在他想知道有颜色的区域数量。换句话说,他想知道属于至少一个矩形的单位正方形的数量。

输入

第一行是一个正整数N

接下来N行,每行是2个偶数x,y。表示每个矩形的宽和高

输出

1个整数

样例输入[复制]
1个整数

【输入样例2】
5
2 10
4 4
2 2
8 8
6 6
样例输出[复制]
28

【输出样例2】
68
提示

【说明】

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

posted @ 2018-10-22 21:59  saionjisekai  阅读(44)  评论(0)    收藏  举报