基础练习 矩形面积交

基础练习 矩形面积交  
时间限制:1.0s   内存限制:512.0MB
问题描述
  平面上有两个矩形,它们的边平行于直角坐标系的X轴或Y轴。对于每个矩形,我们给出它的一对相对顶点的坐标,请你编程算出两个矩形的交的面积。
输入格式
  输入仅包含两行,每行描述一个矩形。
  在每行中,给出矩形的一对相对顶点的坐标,每个点的坐标都用两个绝对值不超过10^7的实数表示。
输出格式
  输出仅包含一个实数,为交的面积,保留到小数后两位。
样例输入
1 1 3 3
2 2 4 4
样例输出
1.00

hint:给你两个矩形的两个对角坐标,让你求面积并,这个题目的话---因为只有两个矩形,所以问题好像简单了很多呢。先判断两个矩形是否相交,不相交的话直接是0;相交的话:如果两个矩形相交,那么它们的相交面积就是所有横坐标中的中间两个横坐标之差与中间两个纵坐标之差的乘积!
从这个问题发现了自己好像线段树扫描线求矩形面积并还不会啊!!! 学习学习!!1
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cmath>
 5 using namespace std;
 6 #define lsn l, mid, rt << 1
 7 #define rsn mid + 1, r, rt << 1 | 1
 8 
 9 //因为只有两个矩形,所以可以不一定要用扫描线线段树的方法
10 //这个简单的方法到时候可以再实现
11 /*
12 typedef double db;
13 struct Scan{
14     double l, r, h; int d;
15     Scan(){}
16     Scan(double l, double r, double h, int d) : l(l), r(r), h(h), d(d){}
17     bool operator < (const Scan & a){
18         return this->h < a.h;  //updata
19     }
20 }scan[100];           //updata
21 double sum[100];
22 double dot[100];
23 int cnt[100];
24 
25 void push_up(int l, int r, int rt){
26     if(cnt[rt]) sum[rt] = dot[r + 1] - dot[l];      //updata
27     else if(l == r) sum[rt] = 0;
28     else sum[rt] = sum[rt << 1] + sum[rt << 1 | 1];
29 }
30 void update(int L, int R, int v, int l, int r, int rt){
31     if(L <= l && R >= r){
32         cnt[rt] += v;
33         push_up(l, r, rt); //updata
34         return;
35     }
36     int mid = (l + r) >> 1;
37     if(L <= mid) update(L, R, v, lsn);
38     if(R > mid) update(L, R, v, rsn);
39     push_up(l, r, rt);
40 }
41 
42 int main(){
43     int cnt1=0, cnt2 = 0;
44      double ans = 0;
45      for(int i = 1; i < 3; i++){
46         double x1, y1, x2, y2;
47         cin >> x1 >> y1 >> x2 >> y2;
48         ans += (x2 - x1) * (y2 - y1);
49         scan[++cnt1] = Scan(x1, x2, y1, 1);
50         scan[++cnt1] = Scan(x1, x2, y2, -1);
51         dot[++cnt2] = x1; dot[++cnt2] = x2;
52      }
53      sort(scan + 1, scan + 1 + cnt1);
54      sort(dot + 1, dot + 1 + cnt2);
55      int m = 1;
56      for(int i = 2; i <= cnt2; i++){
57         if(dot[i] != dot[i - 1]) dot[++m] = dot[i];
58      }
59      double Ans = 0;
60      //for(int i=1; i<=cnt1; i++) cout << scan[i].h << " ";
61      //cout <<endl;
62      for(int i = 1; i < cnt1; i++){
63         int l = lower_bound(dot + 1, dot + 1 + m, scan[i].l) - dot;
64         int r = lower_bound(dot + 1, dot + 1 + m, scan[i].r) - dot;
65         //cout << l << " " << r << endl;
66         if(l < r) update(l, r - 1, scan[i].d, 1, m, 1);
67         //updata
68         Ans += sum[1] * (scan[i + 1].h - scan[i].h);
69         //cout << Ans << " " << sum[1] << " " << i <<  " " << scan[i+1].h << " " << scan[i].h << " " << scan[i + 1].h - scan[i].h << endl;
70      }
71     //cout << ans << " " << Ans << endl;
72     printf("%.2f\n", ans - Ans);
73     return 0;
74 }
75 */
76 //这里有个坑。。。输入并不一定是先输入矩形的左下角再输入矩形的右下角,所以在判断是否有交之前我们要先sort一下,将左下角的坐标放在前面的位置
77 //不得不服别人的智商。。。很巧妙啊
78 double x[4], y[4];
79 int main(){
80     for(int  i = 0; i < 4; i += 2){
81         cin >> x[i] >> y[i] >> x[i+1] >> y[i+ 1];
82     }
83     sort(x, x+2);
84     sort(x+2, x+4);
85     sort(y, y+2);
86     sort(y+2, y+4);
87     if(x[0] >= x[3] || x[1] <= x[2] || y[0] >= y[3] || y[1] <= y[2]){
88         printf("0.00\n");
89     }else{
90         sort(x, x+4);
91         sort(y, y+4);
92         printf("%.2lf\n", (x[2] - x[1]) * (y[2] - y[1]) );
93     }
94     return 0;
95 }

 

转载于:https://www.cnblogs.com/ledoc/p/7087155.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
4S店客户管理小程序-毕业设计,基于微信小程序+SSM+MySql开发,源码+数据库+论文答辩+毕业论文+视频演示 社会的发展和科学技术的进步,互联网技术越来越受欢迎。手机也逐渐受到广大人民群众的喜爱,也逐渐进入了每个用户的使用。手机具有便利性,速度快,效率高,成本低等优点。 因此,构建符合自己要求的操作系统是非常有意义的。 本文从管理员、用户的功能要求出发,4S店客户管理系统的功能模块主要是实现管理员服务端;首页、个人心、用户管理、门店管理、车展管理、汽车品牌管理、新闻头条管理、预约试驾管理、我的收藏管理、系统管理,用户客户端:首页、车展、新闻头条、我的。门店客户端:首页、车展、新闻头条、我的经过认真细致的研究,精心准备和规划,最后测试成功,系统可以正常使用。分析功能调整与4S店客户管理系统实现的实际需求相结合,讨论了微信开发者技术与后台结合java语言和MySQL数据库开发4S店客户管理系统的使用。 关键字:4S店客户管理系统小程序 微信开发者 Java技术 MySQL数据库 软件的功能: 1、开发实现4S店客户管理系统的整个系统程序; 2、管理员服务端;首页、个人心、用户管理、门店管理、车展管理、汽车品牌管理、新闻头条管理、预约试驾管理、我的收藏管理、系统管理等。 3、用户客户端:首页、车展、新闻头条、我的 4、门店客户端:首页、车展、新闻头条、我的等相应操作; 5、基础数据管理:实现系统基本信息的添加、修改及删除等操作,并且根据需求进行流信息的查看及回复相应操作。
现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集处理数据信息的管理方式。本微信小程序医院挂号预约系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息,使用这种软件工具可以帮助管理人员提高事务处理效率,达到事半功倍的效果。此微信小程序医院挂号预约系统利用当下成熟完善的SSM框架,使用跨平台的可开发大型商业网站的Java语言,以及最受欢迎的RDBMS应用软件之一的MySQL数据库进行程序开发。微信小程序医院挂号预约系统有管理员,用户两个色。管理员功能有个人心,用户管理,医生信息管理,医院信息管理,科室信息管理,预约信息管理,预约取消管理,留言板,系统管理。微信小程序用户可以注册登录,查看医院信息,查看医生信息,查看公告资讯,在科室信息里面进行预约,也可以取消预约。微信小程序医院挂号预约系统的开发根据操作人员需要设计的界面简洁美观,在功能模块布局上跟同类型网站保持一致,程序在实现基本要求功能时,也为数据信息面临的安全问题提供了一些实用的解决方案。可以说该程序在帮助管理者高效率地处理工作事务的同时,也实现了数据信息的整体化,规范化与自动化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值