Segment Tree 扫描线 分类: ACM TYPE 2014-08-29 13:08 89人阅读 评论(0) 收藏
#include<iostream>
#include<cstdio>
#include<algorithm>
#define Max 1005
using namespace std;
struct line{
double x, y1, y2;
int flag;
}x_line[Max]; struct node{
int l, r, flag;
double x, f;
}tree[Max]; double point[Max];
int n, m, xm; int cmp(double a,double b)
{
return a<b;
} bool comp(line a,line b)
{
return a.x<b.x;
} void Build(int l,int r,int k)
{
int m;
tree[k].l = l;
tree[k].r = r;
tree[k].flag = 0;
tree[k].x = 0.0;
tree[k].f = 0.0;
if(l+1 == r) return;
m = (l+r)>>1;
Build(l,m,k+k);
Build(m,r,k+k+1);
} void Myscanf()
{
m = 1;
double x1,x2,y1,y2;
scanf("%d",&n);
for(int i=0; i<n; i++)
{
scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
point[m] = y1;
x_line[m].x = x1;
x_line[m].y1 = y1;
x_line[m].flag = 1;
x_line[m++].y2 = y2;
point[m] = y2;
x_line[m].x = x2;
x_line[m].y1 = y1;
x_line[m].flag = -1;
x_line[m++].y2 = y2;
}
} void Point_Do()
{
int mi = 0;
sort(point+1,point+m,cmp);
sort(x_line+1,x_line+m,comp);
xm = m;
for(int i=1; i<m; i++)
{
if(point[i]!=point[mi]) point[++mi] = point[i]; //去重
}
m = mi;
} int Bin(int xi)
{
int l = 1, r = m;
int mi;
while(l<=r)
{
mi = (l+r)>>1;
if(xi = point[mi]) return mi;
if(xi > point[mi]) l = mi+1;
else r = mi-1;
}
return -1;
} void update(int l, int r, int k, line cur)
{
if(l==r-1)
{
if(tree[k].flag+cur.flag == 2) tree[k].f = cur.x;
else if(tree[k].flag+cur.flag<2 && cur.flag==-1){
tree[k].x += cur.x - tree[k].f;
tree[k].f = 0.0;
}
return;
}
int mi = (tree[k].l+tree[k].r)>>1;
if(l>mi) update(l,r,k+k+1,cur);
else if(r<=mi) update(l,r,k+k,cur);
else{
update(l,mi,k+k,cur);
update(mi+1,r,k+k+1,cur);
}
return;
} double query(int k)
{
if(tree[k].l+1==tree[k].r) return (point[tree[k].l]-point[tree[k].r])*tree[k].x;
return query(k+k)+query(k+k+1);
} int Ans()
{
for(int i=1;i<=xm;i++)
{
int x = Bin(x_line[i].y1);
int y = Bin(x_line[i].y2);
update(x,y,1,x_line[i]);
}
} int main()
{
Myscanf();
Point_Do();
Build(1,n,1);
Ans();
printf("%lf\n",query);
return 0;
}
Code From Hdu 1542
版权声明:本文为博主原创文章,未经博主允许不得转载。
Segment Tree 扫描线 分类: ACM TYPE 2014-08-29 13:08 89人阅读 评论(0) 收藏的更多相关文章
- 菜鸟学习-C语言函数参数传递详解-结构体与数组 分类: C/C++ Nginx 2015-07-14 10:24 89人阅读 评论(0) 收藏
C语言中结构体作为函数参数,有两种方式:传值和传址. 1.传值时结构体参数会被拷贝一份,在函数体内修改结构体参数成员的值实际上是修改调用参数的一个临时拷贝的成员的值,这不会影响到调用参数.在这种情况下 ...
- 给EditText的drawableRight属性的图片设置点击事件 分类: 学习笔记 android 2015-07-06 13:20 134人阅读 评论(0) 收藏
这个方法是通用的,不仅仅适用于EditText,也适用于TextView.AutoCompleteTextView等控件. Google官方API并没有给出一个直接的方法用来设置右边图片的点击事件,所 ...
- android开发之AlertDialog点击按钮之后不消失 分类: android 学习笔记 2015-07-15 18:07 89人阅读 评论(0) 收藏
最近有这样一个需求,我需要用户在一个弹出框里输入密码来验证,验证成功当然好说,但是如果验证失败则需要把alertdialog的标题改为"密码错误,请重新输入",并且这个alertd ...
- Segment Tree 分类: ACM TYPE 2014-08-29 13:04 97人阅读 评论(0) 收藏
#include<iostream> #include<cstdio> using namespace std; struct node { int l, r, m; int ...
- 山东理工大学第七届ACM校赛-学区房问题 分类: 比赛 2015-06-26 10:23 89人阅读 评论(0) 收藏
Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^ 题目描述 铁牌狗在学区B有一套面积为S1平方米的房子,现在他为了让后代进化成金牌狗,决定在学区A购 ...
- OC基础知识总结 分类: ios学习 OC 2015-06-26 17:58 58人阅读 评论(0) 收藏
//OC: Objective-C, 面向对象的C语言 //OC与C的区别 //1.OC是C的超集, C语言的所有语法都可以在OC中使用 //2.OC是面向对象 //3.OC是一门运行时语言 //4. ...
- Eclipse 快捷键大全 分类: C_OHTERS 2014-06-01 13:05 332人阅读 评论(0) 收藏
精选常用: 1. ctrl+shift+r:打开资源 这可能是所有快捷键组合中最省时间的了.这组快捷键可以让你打开你的工作区中任何一个文件,而你只需要按下文件名或mask名中的前几个字母,比如a ...
- *** glibc detected *** malloc(): memory corruption 分类: C/C++ Linux 2015-05-14 09:22 37人阅读 评论(0) 收藏
*** glibc detected *** malloc(): memory corruption: 0x09eab988 *** 发现是由于memset越界写引起的. 在Linux Server上 ...
- A Plug for UNIX 分类: POJ 图论 函数 2015-08-10 14:18 2人阅读 评论(0) 收藏
A Plug for UNIX Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 14786 Accepted: 4994 Desc ...
随机推荐
- web.xml中的url-pattern映射规则
Servlet和filter是J2EE开发中常用的技术,使用方便,配置简单.servlet和filter中的url-pattern有一些文章在里面的,总结了一些东西,以免遇到问题又要浪费时间. 一,s ...
- php怎么解析utf-8带BOM编码的json数据,php解析json数据返回NULL
今天遇到一个问题,json_decode解析json数据返回null,试了各种方法都不行,最后发现,原来是json文件编码的问题. 当json_decode解析utf-8带BOM格式的json数据时, ...
- 这次一定理清晰ThinkPHP之中的模型、数据库之间命名规范
ServiceSiteModel.class.php 这个模型操控的数据库是service_site表: <?php namespace Admin\Model; use Think\Model ...
- js 触发select onchange事件
select 或text的onchange事件需要手动(通过键盘输入)改变select或text的值才能触发,本文为大家介绍下使用js触发select onchange事件select 或text的o ...
- ERROR 1045 (28000): Access denied for user root@localhost (using password:
错误描述: Mysql中添加用户之后可能出现登录时提示ERROR 1045 (28000): Access denied for user的错误.删除user.user中值为NULL的,或更新NULL ...
- Keil(MDK-ARM)使用教程(三)_在线调试
Ⅰ.概述 该文章总结Keil(MDK-ARM)在线调试相关的内容,详情请往下看. 该文章是基于新建好软件工程来讲述,关于Keil的下载.安装和新建工程我已将在前面做了详细的总结,不懂的可以参看我博客里 ...
- python实现 _ 图书馆书籍到期之前_自动邮件提醒
一共两个脚本: 第一个是[借书完毕以及借书信息有变更(续借等)]的时候需要执行的脚本:实现模拟登陆,同时最新的借书信息的下载到本地文本:之所以没有这样做,是因为如果每次爬取一遍的话,需要每次输入一遍验 ...
- Ztack学习笔记(6)-广播组播点播
Zigbee网络中进行数据通信主要有三种类型:单播.组播.广播.那这三种方式如何设置呢,在哪里设置呢, 一. 广播 当应用程序需要将数据包发送给网络的每一个设备时,使用这种模式.广播的短地址有三种 0 ...
- button与submit
原文来自: http://blog.sina.com.cn/s/blog_693d183d0100uolj.html submit是button的一个特例,也是button的一种,它把提交这个动作自动 ...
- SQLite判断某表是否存在
SQLite判断表是否存在:其实很简单,只要查看sqlite_master表中是否存在这条数据就可以知道了.SELECT count(*) FROM sqlite_master WHERE type= ...