算法复习——扫描线(hdu1542)
题目:
Problem Description
Input
The input file is terminated by a line containing a single 0. Don’t process it.
Output
Output a blank line after each test case.
Sample Input
10 10 20 20
15 15 25 25.5
0
Sample Output
题解:
扫描线的模板题目···具体见http://blog.csdn.net/lwt36/article/details/48908031,%%%%%%%
唯一需要注意的是线段树的l到r区间其实代表的是离散化后l到r+1这一段区间·····,因为最小的单位区间表示的是一条线段···而不是一个点
代码:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<ctime>
#include<cctype>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
const int N=;
struct node
{
double l,r,h;
int op;
}line[N];
int n,m,tot,cnt[N*],T;
double ans,sum[N*],b[N];
inline bool cmp(node a,node b)
{
return a.h<b.h;
}
inline void update(int k,int l,int r)
{
if(cnt[k]) sum[k]=b[r+]-b[l];
else if(l==r) sum[k]=;
else sum[k]=sum[k*]+sum[k*+];
}
inline void modify(int k,int l,int r,int x,int y,int w)
{
if(l>=x&&r<=y)
{
cnt[k]+=w;update(k,l,r);
return;
}
int mid=(l+r)/;
if(x<=mid) modify(k*,l,mid,x,y,w);
if(y>mid) modify(k*+,mid+,r,x,y,w);
update(k,l,r);
}
int main()
{
//freopen("a.in","r",stdin);
while(true)
{
scanf("%d",&n);
if(n==) break;T++;
double X1,X2,Y1,Y2;tot=;
for(int i=;i<=n;i++)
{
scanf("%lf%lf%lf%lf",&X1,&Y1,&X2,&Y2);
line[++tot].l=X1,line[tot].r=X2,line[tot].h=Y1;line[tot].op=;b[tot]=X1;
line[++tot].l=X1,line[tot].r=X2,line[tot].h=Y2;line[tot].op=-;b[tot]=X2;
}
sort(line+,line+tot+,cmp);
sort(b+,b+tot+);
m=unique(b+,b+tot+)-b-;ans=;
memset(cnt,,sizeof(cnt));
memset(sum,,sizeof(sum));
for(int i=;i<tot;i++)
{
int Le=lower_bound(b+,b+m+,line[i].l)-b;
int Ri=lower_bound(b+,b+m+,line[i].r)-b;
if(Le<Ri) modify(,,m,Le,Ri-,line[i].op);
ans+=sum[]*(line[i+].h-line[i].h);
}
printf("Test case #%d\nTotal explored area: %.2f\n\n",T,ans);
}
return ;
}
算法复习——扫描线(hdu1542)的更多相关文章
- C#冒泡算法复习
C#冒泡算法复习 冒泡算法的意思:每一趟找到一个最小或最大的数放到最后面,比较总数的n-1次(因为比较是2个双双比较的) 第一层循环表示进行比较的次数,总共要比较(数的)-1次 (因为比较是2个双双比 ...
- C语言排序算法复习
排序算法有很多种,这里在复习和分析的基础上,做一个自己的总结: 首先要知道有哪些排序算法,google一下,有云C语言7大经典排序算法(也有8大).主要包括冒泡排序,快速排序,选择排序,插入排序,希尔 ...
- KMP算法复习【+继续学习】
离NOIP还剩12天,本蒟蒻开始准备复习了. 先来个KMP[似乎我并没有写过KMP的blog] KMP KMP算法是解决字符串匹配问题的一个算法,主要是单对单的字符串匹配加速,时间复杂度O(m + n ...
- 算法复习周------“动态规划之‘最长公共子序列’”&&《计蒜课》---最长公共子串题解
问题描述: 这个问题其实很容易理解.就是给你两个序列X={x1,x2,x3......xm} Y={y1,y2,y3......ym},要求找出X和Y的一个最长的公共子序列. 例:Xi={A, B, ...
- K-Means聚类和EM算法复习总结
摘要: 1.算法概述 2.算法推导 3.算法特性及优缺点 4.注意事项 5.实现和具体例子 6.适用场合 内容: 1.算法概述 k-means算法是一种得到最广泛使用的聚类算法. 它是将各个聚类子集内 ...
- 通过“回文字算法”复习C++语言。
一.什么是回文字 给定一个字符串,从前往后读和从后往前读,字符串序列不变.例如,河北省农村信用社的客服电话是“96369”,无论从后往前读,还是从前后往后读,各个字符出现的位置不变. 二.功能实现 ( ...
- 【转】常用算法复习及实现(C++版)
一.霍夫曼树实现 给定n个权值作为n个叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman tree).哈夫曼树是带权路径长度最短的树,权值较大 ...
- OI算法复习
搜集一些算法,赛前背一背有好处的 转自各大网站 前排感谢:hzwer.风了咕凉 前辈...Orz 快速读入: int read() { ,f=;char ch=getchar(); ;ch=getch ...
- OI算法复习汇总
各大排序 图论: spfa floyd dijkstra *拉普拉斯矩阵 hash表 拓扑排序 哈夫曼算法 匈牙利算法 分块法 二分法 费马小定理: a^(p-1) ≡1(mod p) 网络流 二分图 ...
随机推荐
- CF Gym 100637G \#TheDress (水)
题解:读懂题意按照题意模拟... 熟悉了一个库函数,strstr,memcpy #include<cstdio> #include<cstring> int main() { ...
- UVA 12901 Refraction 折射 (物理)
一道物理题,解个2次方程就行了... 求h最小的情况对应如下图所示 做法不唯一,我想避免精度损失所以在化简的时候尽可能地去避免sqrt和浮点数乘除. 似乎精度要求很低,直接用角度算也可以 #inclu ...
- rcnn,sppnet,fast rcnn,ohem,faster rcnn,rfcn
https://zhuanlan.zhihu.com/p/21412911 rcnn需要固定图片的大小,fast rcnn不需要 rcnn,sppnet,fast rcnn,ohem,faster r ...
- Java中线程的通讯
线程间的相互作用:线程之间需要一些协调通信,来共同完成一件任务. Object类中相关的方法有两个notify方法和三个wait方法:因为wait和notify方法定义在Object类中,因此会被所有 ...
- Electron的介绍
1.1 Electron是什么? 引用官网的一句话: Build cross platform desktop apps with JavaScript, HTML, and CSS 1.2 诞生 技 ...
- 如何理解JavaScript中的this关键字
前言 王福朋老师的 JavaScript原型和闭包系列 文章看了不下三遍了,最为一个初学者,每次看的时候都会有一种 "大彻大悟" 的感觉,而看完之后却总是一脸懵逼.原型与闭包 可以 ...
- 03IO端口寻址和访问控制方式
1. I/O端口和寻址 CPU 为了访问 I/O 接口控制器或者控制卡上的数据和状态信息,需要首先指定他们的地址.这种地址就称为I/O端口地址或简称端口.通常一个 I/O 控制器包含访问数据的数据端口 ...
- ubuntu 设置定时任务
crontab -l #查看详情crontab -e #设置定时任务 * * * * * command 分 时 日 月 周 命令 第1列表示分钟1-59 每分钟用*或者 */1表示 第2列表示小时 ...
- 爬虫之scrapy工作流程
Scrapy是什么? scrapy 是一个为了爬取网站数据,提取结构性数据而编写的应用框架,我们只需要实现少量代码,就能够快速的抓取到数据内容.Scrapy 使用了 Twisted['twɪstɪd] ...
- Ubuntu系统里的python
Ubuntu系统里,默认安装python2.7.x版本的python,直接执行python命令,打开的将是python 2.7.x版本:python3版本的需要自行安装,安装成功后,执行python3 ...