hdu 1255 覆盖的面积 矩形D层以上重叠面积
来源:互联网 发布:网络摄像机的方案 编辑:程序博客网 时间:2024/05/16 23:38
矩形面积并,求D层以上重叠的面积
离散化后扫描线 4000ms低效率水过
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>using namespace std;const double EP=1e-8;const int maxn=2005;const int D=2;int n, cas=1;double hash[maxn];struct nod{ double x; int c, id;}a[maxn];struct node{ int lef, rig, mid, cover;}seg[4*maxn];struct line{ int x1, x2, flag; //flag==1 down double y;}l[maxn];void make_tree(int num, int lef, int rig){ seg[num].lef=lef; seg[num].rig=rig; seg[num].mid=(lef+rig)>>1; seg[num].cover=0; if(lef+1!=rig){ make_tree(num<<1, lef, seg[num].mid); make_tree(num*2+1, seg[num].mid, rig); }}void insert(int num, int lef, int rig, int cover){ if(seg[num].cover!=-1&&seg[num].lef==lef&&seg[num].rig==rig){ seg[num].cover+=cover; return; } if(seg[num].cover>0){ insert(num*2, seg[num*2].lef, seg[num*2].rig, seg[num].cover); insert(num*2+1, seg[num*2+1].lef, seg[num*2+1].rig, seg[num].cover); seg[num].cover=-1; } seg[num].cover=-1; if(rig<=seg[num].mid) insert(num*2, lef, rig, cover); else if(lef>=seg[num].mid) insert(num*2+1, lef, rig, cover); else { insert(num*2, lef, seg[num].mid, cover); insert(num*2+1, seg[num].mid, rig, cover); }}double cal(int num, int cover){ if(seg[num].cover>=cover) return hash[seg[num].rig]-hash[seg[num].lef]; if(seg[num].lef+1==seg[num].rig){ return 0; } return cal(num*2, cover)+cal(num*2+1, cover);}bool cmpx(nod p1, nod p2){ return p1.x<p2.x;}bool cmpid(nod p1, nod p2){ return p1.id<p2.id;}bool cmpy(line l1, line l2){ return l1.y<l2.y;}void myhash(){ int i; sort(a, a+2*n, cmpx); hash[0]=a[0].x; a[0].c=0; for(i=1; i<2*n; i++){ if(a[i].x-a[i-1].x<EP) a[i].c=a[i-1].c; else { a[i].c=a[i-1].c+1; hash[a[i].c]=a[i].x; } } sort(a, a+2*n, cmpid); for(i=0; i<n; i++){ l[i*2].x1=l[i*2+1].x1=a[i*2].c; l[i*2].x2=l[i*2+1].x2=a[i*2+1].c; }}void init(){ for(int i=0; i<n; i++){ scanf("%lf%lf%lf%lf", &a[i*2].x, &l[i*2].y, &a[i*2+1].x, &l[i*2+1].y); l[i*2].flag=1;l[i*2+1].flag=-1; a[i*2].id=i*2;a[i*2+1].id=i*2+1; }}void solve(){ make_tree(1, 0, 2*n); myhash(); sort(l, l+2*n, cmpy); double ans=0; for(int i=0; i<2*n-1; i++){ insert(1, l[i].x1, l[i].x2, l[i].flag); ans+=cal(1, D)*(l[i+1].y-l[i].y); } printf("%.2f\n", ans);}int main(){ //freopen("1.txt", "r", stdin); int T; scanf("%d", &T); while(T--){ scanf("%d", &n); init(); solve(); } return 0;}
- hdu 1255 覆盖的面积 矩形D层以上重叠面积
- hdu 1255 覆盖的面积(矩形面积并,多次覆盖)
- HDU 1255 覆盖的面积(矩形交的面积)
- Hdu 1255 覆盖的面积 线段树+矩形面积并
- hdu 1255 覆盖的面积(矩形面积二次交)
- HDU 1255 ( 覆盖的面积 ) 矩形面积并
- hdoj 1255 覆盖的面积【线段树 + 扫描线求重叠两次及以上的面积】
- HDU 2056 矩形重叠面积
- hdu 1255 覆盖的面积(求覆盖至少两次以上的面积)
- HDU-1255 覆盖的面积 (线段树 求矩形覆盖面积)
- hdu 1255 矩形面积覆盖次数
- UVA 11345 Rectangles(n个矩形重叠覆盖的面积)
- hdu 1255 覆盖的面积 线段树扫描线求重叠面积
- Hdu 1542 Atlantis + Hdu 1255 覆盖的面积 (线段树矩形面积并)
- 【uva】11983 求矩形覆盖k次以上的面积
- HDU 1255 覆盖的面积(线段树求矩形面积交)
- hdu 1255 覆盖的面积
- hdu 1255 覆盖的面积
- 百度2008年校园招聘笔试题
- RedHat Linux vsftpd root用户上传下载 配置中遇到问题及解决办法
- MySQL 锁机制
- 房贷之虑
- VMware Tools的安装
- hdu 1255 覆盖的面积 矩形D层以上重叠面积
- JTable的用法收藏版
- (6)LUA程序设计-编译执行与错误(compile 、run & error)处理
- fprintf(),sprintf ()的用法详解
- my promise【Eyelids】
- 学习日记13 饿汉式和懒汉式
- 文件输入输出的两种方法(常用第一种)
- Iphone利用程序实现关闭当前应用
- C语言的字节对齐