线段树+扫描线【p1884】[Usaco12FEB]过度种植(银)Overplanting …
Description
在一个笛卡尔平面坐标系里(则X轴向右是正方向,Y轴向上是正方向),有\(N(1<=N<=1000)\)个矩形,第i个矩形的左上角坐标是\((x1, y1)\),右下角坐标是\((x2,y2)\)。问这\(N\)个矩形所覆盖的面积是多少?注意:被重复覆盖的区域的面积只算一次。
Input
第一行,一个整数N。 \((1<=N<=1000)\)。
接下来有\(N\)行,每行描述一个矩形的信息,分别是矩形的\(x1、y1、x2、y2\)。
其中 \(−10^8<=x1,y1,x2,y2<=10^8\)。
Ouput
一个整数,被N个矩形覆盖的区域的面积。
难得遇到一个裸的扫描线的题,竟然没切掉 emmm.
看到\(x,y\)的坐标范围,离散化就好了!
没有一遍切,竟然是没开\(long \ \ long\)!!!
太难受了,关于这个的话就不多BB,网上讲解很多.
大家可以去搜一下。(貌似NOIP不会考,暂且学了)
将来有时间写讲解好了 qwq.
代码
#include<cstdio>
#include<algorithm>
#include<iostream>
#define int long long
#define R register
using namespace std;
const int gz=10086;
inline void in(int &x)
{
int f=1;x=0;char s=getchar();
while(!isdigit(s)){if(s=='-')f=-1;s=getchar();}
while(isdigit(s)){x=x*10+s-'0';s=getchar();}
x*=f;
}
struct cod
{
int l,r,h;
int f;
bool operator <(const cod&a)const
{
return h<a.h;
}
}edge[gz];
struct tre
{
int l,r,s;
int len;
}tr[gz];
#define ls o<<1
#define rs o<<1|1
int x[gz],n,tot;
void build(R int o,R int l,R int r)
{
tr[o].l=l;tr[o].r=r;
if(l==r)return;
R int mid=(l+r)>>1;
build(ls,l,mid);
build(rs,mid+1,r);
}
inline void up(R int o)
{
if(tr[o].s)
tr[o].len=x[tr[o].r+1]-x[tr[o].l];
else if(tr[o].l==tr[o].r)
tr[o].len=0;
else tr[o].len=tr[ls].len+tr[rs].len;
}
void change(R int o,R int l,R int r,R int del)
{
if(tr[o].l==l and tr[o].r==r)
{
tr[o].s+=del;
up(o);
return;
}
R int mid=(tr[o].l+tr[o].r)>>1;
if(r<=mid) change(ls,l,r,del);
else if(l>mid) change(rs,l,r,del);
else change(ls,l,mid,del),change(rs,mid+1,r,del);
up(o);
}
signed main()
{
in(n);
for(R int i=1;i<=n;i++)
{
R int x1,x2,y1,y2;
in(x1),in(y1),in(x2),in(y2);
edge[++tot].l=x1;edge[tot].r=x2;edge[tot].f=-1;
edge[tot].h=y1;x[tot]=x1;
edge[++tot].l=x1;edge[tot].r=x2;edge[tot].f=1;
edge[tot].h=y2;x[tot]=x2;
}
sort(edge+1,edge+tot+1);
sort(x+1,x+tot+1);
int new_n=1;
for(R int i=2;i<=tot;i++)
if(x[new_n]!=x[i])x[++new_n]=x[i];
build(1,1,new_n);
int ans=0;
for(R int i=1;i<=tot;i++)
{
R int l=lower_bound(x+1,x+new_n+1,edge[i].l)-x;
R int r=lower_bound(x+1,x+new_n+1,edge[i].r)-x-1;
change(1,l,r,edge[i].f);
ans+=(edge[i+1].h-edge[i].h)*tr[1].len;
}
printf("%lld",ans);
}
线段树+扫描线【p1884】[Usaco12FEB]过度种植(银)Overplanting …的更多相关文章
- 【Codeforces720D】Slalom 线段树 + 扫描线 (优化DP)
D. Slalom time limit per test:2 seconds memory limit per test:256 megabytes input:standard input out ...
- Codeforces VK CUP 2015 D. Closest Equals(线段树+扫描线)
题目链接:http://codeforces.com/contest/522/problem/D 题目大意: 给你一个长度为n的序列,然后有m次查询,每次查询输入一个区间[li,lj],对于每一个查 ...
- 【POJ-2482】Stars in your window 线段树 + 扫描线
Stars in Your Window Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 11706 Accepted: ...
- HDU 4419 Colourful Rectangle --离散化+线段树扫描线
题意: 有三种颜色的矩形n个,不同颜色的矩形重叠会生成不同的颜色,总共有R,G,B,RG,RB,GB,RGB 7种颜色,问7种颜色每种颜色的面积. 解法: 很容易想到线段树扫描线求矩形面积并,但是如何 ...
- BZOJ-3228 棋盘控制 线段树+扫描线+鬼畜毒瘤
3228: [Sdoi2008]棋盘控制 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 23 Solved: 9 [Submit][Status][D ...
- BZOJ-3225 立方体覆盖 线段树+扫描线+乱搞
看数据范围像是个暴力,而且理论复杂度似乎可行,然后被卡了两个点...然后来了个乱搞的线段树+扫描线.. 3225: [Sdoi2008]立方体覆盖 Time Limit: 2 Sec Memory L ...
- hdu 5091(线段树+扫描线)
上海邀请赛的一道题目,看比赛时很多队伍水过去了,当时还想了好久却没有发现这题有什么水题的性质,原来是道成题. 最近学习了下线段树扫描线才发现确实是挺水的一道题. hdu5091 #include &l ...
- POJ1151+线段树+扫描线
/* 线段树+扫描线+离散化 求多个矩形的面积 */ #include<stdio.h> #include<string.h> #include<stdlib.h> ...
- POJ-1151-Atlantis(线段树+扫描线+离散化)[矩形面积并]
题意:求矩形面积并 分析:使用线段树+扫描线...因为坐标是浮点数的,因此还需要离散化! 把矩形分成两条边,上边和下边,对横轴建树,然后从下到上扫描上去,用col表示该区间有多少个下边,sum代表该区 ...
- HDU 5107 线段树扫描线
给出N个点(x,y).每一个点有一个高度h 给出M次询问.问在(x,y)范围内第k小的高度是多少,没有输出-1 (k<=10) 线段树扫描线 首先离散化Y坐标,以Y坐标建立线段树 对全部的点和询 ...
随机推荐
- [洛谷P4291][HAOI2008]排名系统
题目大意:三种操作: $+Name\;Socore:$上传最新得分记录,把以前的记录删除. $?Name:$ 查询玩家排名.如果两个玩家的得分相同,则先得到该得分的玩家排在前面. $?Index:$ ...
- dnsmasq-2.48没有ipset特性,安装dnsmasq-2.71来支持ipset
iptables只能根据ip地址进行转发,不能识别域名,而dnsmasq-full不仅可以实现域名-IP的映射,还可以把这个映射关系存储在ipset中,所以使用dnsmasq+ipset就可以实现ip ...
- [Leetcode] Path Sum路径和
Given a binary tree and a sum, determine if the tree has a root-to-leaf path such that adding up all ...
- BEGIN TRAN;
USE master Create Database TestDb on Primary ( name='TestDb_data', filename='G:\TempData\Db\TestDb_d ...
- Java的Properties使用及格式定义
java.util.Properties extends Hashtable<Object,Object> 方便读取 键值对 格式的文本资源工具 常用方法一览 初始化对象 new Prop ...
- 洛谷P1346 电车
P1346 电车 236通过 757提交 题目提供者yeszy 标签图论福建省历届夏令营 难度普及/提高- 提交该题 讨论 题解 记录 最新讨论 解不好啊,快疯了!!哪位大… 求解:为何除了-1的点之 ...
- n元线性方程非负整数解的个数问题
设方程x1+x2+x3+...+xn = m(m是常数) 这个方程的非负整数解的个数有(m+n-1)!/((n-1)!m!),也就是C(n+m-1,m). 具体解释就是m个1和n-1个0做重集的全排列 ...
- Educational Codeforces Round 58 (Rated for Div. 2) 题解
Educational Codeforces Round 58 (Rated for Div. 2) 题目总链接:https://codeforces.com/contest/1101 A. Min ...
- rman备份与异机恢复
一.rman备份脚本并为定时任务 #!/bin/bashsource ~/.bash_profileexport LANG=en_USBACKUP_DATE=`date +%d`#RMAN_LOG_F ...
- iconfont字体图标
1.1.进入阿里图标网站 http://www.iconfont.cn/ 1.2.在购物车里添加自己需要的字体图标 1.3.下载代码 1.4.解压过后,找到iconfont.css,放在你的项目里,需 ...