HDU 1264 Counting Squares (线段树-扫描线-矩形面积并)
版权声明:欢迎关注我的博客。本文为博主【炒饭君】原创文章,未经博主同意不得转载 https://blog.csdn.net/a1061747415/article/details/25471349
Problem A : Counting Squares
pid=1264" rel="nofollow">From:HDU, 1264
5 8 7 10
specifies the rectangle who's corners are(5,8),(7,8),(7,10),(5,10).
If drawn on graph paper, that rectangle would cover four squares. Your job is to count the number of unit(i.e.,1*1) squares that are covered by any one of the rectangles given as input. Any square covered by more than one rectangle should only be counted once.
a rectangle.
6 9 7 8
6 8 8 11
-1 -1 -1 -1
0 0 100 100
50 75 12 90
39 42 57 73
-2 -2 -2 -2
10000
题目大意:
给定你一些矩形左下右上角坐标点。或者左上右下坐标点。求这些矩形的面积并。
解题思路:
利用线段树扫描线的知识。此题不须要离散化。
#include <iostream>
#include <cmath>
#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
struct node{
int x,y1,y2,c;
node(int x0=0,int y10=0,int y20=0,int c0=0){
x=x0;y1=y10;y2=y20;c=c0;
}
friend bool operator < (node a,node b){
if(a.x!=b.x) return a.x<b.x;
else if(a.y1!=b.y1) return a.y1<b.y1;
else if(a.y2!=b.y2) return a.y2<b.y2;
else return a.c>b.c;
}
};
const int maxh=110;
struct tree{
int l,r,c,lz;
}a[maxh*4];
vector <node> v;
bool input(){
int a,b,c,d;
v.clear();
while(scanf("%d%d%d%d",&a,&b,&c,&d)!=EOF){
if(a==-1 && b==-1 && c==-1 && d==-1) return true;
if(a==-2 && b==-2 && c==-2 && d==-2) return false;
v.push_back(node( min(a,c), min(b,d) , max(b,d) ,1));
v.push_back(node( max(a,c), min(b,d) , max(b,d) ,-1));
}
}
void build(int l,int r,int k){
a[k].l=l;
a[k].r=r;
a[k].c=0;
a[k].lz=0;
if(l+1<r){
int mid=(l+r)/2;
build(l,mid,2*k);
build(mid,r,2*k+1);
}
}
void pushdown(int k){
if(a[k].lz!=0 && a[k].l+1<a[k].r ){
a[2*k].lz+=a[k].lz;
a[2*k+1].lz+=a[k].lz;
a[2*k].c+=a[k].lz;
a[2*k+1].c+=a[k].lz;
a[k].lz=0;
}
}
void insert(int l,int r,int k,int c){
if(l<=a[k].l && a[k].r<=r){
a[k].lz+=c;
a[k].c+=c;
}else{
pushdown(k);
int mid=(a[k].l+a[k].r)/2;
if(r<=mid) insert(l,r,2*k,c);
else if(l>=mid) insert(l,r,2*k+1,c);
else{
insert(l,mid,2*k,c);
insert(mid,r,2*k+1,c);
}
}
}
int query(int l,int r,int k){
pushdown(k);
if(l<=a[k].l && a[k].r<=r){
if(a[k].c>0) return r-l;
else{
if(a[k].l+1==a[k].r) return 0;
else {
int mid=(a[k].l+a[k].r)/2;
return query(l,mid,2*k) + query(mid,r,2*k+1) ;
}
}
}else{
int mid=(a[k].l+a[k].r)/2;
if(r<=mid) return query(l,r,2*k);
else if(l>=mid) return query(l,r,2*k+1);
else{
return query(l,mid,2*k) + query(mid,r,2*k+1) ;
}
}
}
void solve(){
build(0,maxh,1);
sort(v.begin(),v.end());
insert(v[0].y1,v[0].y2,1,v[0].c);
int ans=0;
for(int i=1;i<v.size();i++){
//cout<<v[i].x-v[i-1].x<<" "<<query(0,maxh,1)<<endl;
ans+=(v[i].x-v[i-1].x)*query(0,maxh,1);
insert(v[i].y1,v[i].y2,1,v[i].c);
}
cout<<ans<<endl;
}
int main(){
while(input()){
solve();
}
solve();
return 0;
}
HDU 1264 Counting Squares (线段树-扫描线-矩形面积并)的更多相关文章
- hdu 1828 Picture(线段树扫描线矩形周长并)
线段树扫描线矩形周长并 #include <iostream> #include <cstdio> #include <algorithm> #include &l ...
- poj 3277 City Horizon (线段树 扫描线 矩形面积并)
题目链接 题意: 给一些矩形,给出长和高,其中长是用区间的形式给出的,有些区间有重叠,最后求所有矩形的面积. 分析: 给的区间的范围很大,所以需要离散化,还需要把y坐标去重,不过我试了一下不去重 也不 ...
- HDU - 1255 覆盖的面积(线段树求矩形面积交 扫描线+离散化)
链接:线段树求矩形面积并 扫描线+离散化 1.给定平面上若干矩形,求出被这些矩形覆盖过至少两次的区域的面积. 2.看完线段树求矩形面积并 的方法后,再看这题,求的是矩形面积交,类同. 求面积时,用被覆 ...
- HDU 1828“Picture”(线段树+扫描线求矩形周长并)
传送门 •参考资料 [1]:算法总结:[线段树+扫描线]&矩形覆盖求面积/周长问题(HDU 1542/HDU 1828) •题意 给你 n 个矩形,求矩形并的周长: •题解1(两次扫描线) 周 ...
- hdu1828 Picture(线段树+扫描线+矩形周长)
看这篇博客前可以看一下扫描线求面积:线段树扫描线(一.Atlantis HDU - 1542(覆盖面积) 二.覆盖的面积 HDU - 1255(重叠两次的面积)) 解法一·:两次扫描线 如图我们可以 ...
- HDU 6096 String 排序 + 线段树 + 扫描线
String Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Others) Problem De ...
- hdu1542 Atlantis 线段树--扫描线求面积并
There are several ancient Greek texts that contain descriptions of the fabled island Atlantis. Some ...
- 【hdu1542】线段树求矩形面积并
分割线内容转载自http://hzwer.com/879.html ------------------------------------------------------------------ ...
- POJ 1151 Atlantis 线段树求矩形面积并 方法详解
第一次做线段树扫描法的题,网搜各种讲解,发现大多数都讲得太过简洁,不是太容易理解.所以自己打算写一个详细的.看完必会o(∩_∩)o 顾名思义,扫描法就是用一根想象中的线扫过所有矩形,在写代码的过程中, ...
随机推荐
- vue iview组件表格 render函数的使用
如果要在标签中加入属性,例如img 中src属性 a标签中href属性 此时需要用到 attrs 来加入而不是props { title: '操作', key: 'action', align: 'c ...
- nyi63——树
#include<bits/stdc++.h> using namespace std; int cnt; struct node { int data; int flag; node * ...
- SPOJ KPSUM ★(数位DP)
题意 将1~N(1<=N<=10^15)写在纸上,然后在相邻的数字间交替插入+和-,求最后的结果.例如当N为12时,答案为:+1-2+3-4+5-6+7-8+9-1+0-1+1-1+2=5 ...
- IOS-UIButton的文本与图片的布局
UIButton内部文本和图片的布局是我们日常代码中,不可缺少的部分,按钮默认左边图片右边文本,那要实现左边文本,右边图片,我们该怎么解决呢,上面图片,下面文本又该怎么办呢 其实很简单,今天总结下,目 ...
- ping函数
#!/bin/bash #note:ping monitor set -u #set -x ping_fun() { d_network= echo -n "input the networ ...
- jquery中prop和attr的区别
jquery中prop和attr的区别 prop: prop(name|properties|key,value|fn) **概述** 获取在匹配的元素集中的第一个元素的属性值. 随着一些内置属性的D ...
- python文件名不要跟模块名相同,报错AttributeError: 'module' object has no attribute 'Differ'
python中的文件都会生成pyc文件,包括模块也是这样,所以调用模块的时候,实际上会调用模块.pyc文件:在这个前提下,如果将文件名命名成跟模块名一样,在同一目录下就会生成一个跟模块名一样的pyc文 ...
- 深入理解java泛型
一. 什么是泛型? 泛 型(Generic type 或者 generics)是对 简单的理解,就是对类型的参数化,比如我们定义一个类属性或者实例属性时,往往要指定具体的类型,如Integer.Per ...
- java中的一些执行顺序,代码块,静态,构造,成员。。。。(转的)
Java初始化顺序(转来的) 1在new B一个实例时首先要进行类的装载.(类只有在使用New调用创建的时候才会被java类装载器装入) 2,在装载类时,先装载父类A,再装载子类B3,装载父类A后,完 ...
- New Concept English there (25)
38w/m 65 One of the most famous sailing ships of the nineteenth century, the Cutty Sark, can still b ...