线段树+扫描线【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坐标建立线段树 对全部的点和询 ...
随机推荐
- 洛谷 P1502 窗口的星星 解题报告
P1502 窗口的星星 题目背景 小卡买到了一套新房子,他十分的高兴,在房间里转来转去. 题目描述 晚上,小卡从阳台望出去,"哇~~~~好多星星啊",但他还没给其他房间设一个窗户, ...
- Linux内存 性能调优
内存是影响Linux性能的主要因素之一,内存资源的充足与否直接影响应用系统的使用性能. free命令:监控Linux内存使用状况. 由上图可知,空闲内存是free+buffers+cached=155 ...
- ansible 批量修改root密码
[root@sz_fy_virt_encrypt_33_239 fetch]# cat /opt/passwd.yml - hosts: web vars: path: /home/opsadmin ...
- WebForm 在 Global.asax 中捕获全局异常
/// <summary> /// 捕获全局异常 /// </summary> /// <param name="sender">sender& ...
- Install the Active Directory Administration Tools on Windows Server
安装 Active Directory 管理工具 To manage your directory from an EC2 Windows instance, you need to install ...
- sperman系数
https://baike.baidu.com/item/spearman%E7%9B%B8%E5%85%B3%E7%B3%BB%E6%95%B0/7977847?fr=aladdin https:/ ...
- Redis(1) 初识Redis
redis介绍: Redis是一个开源(BSD许可)的内存数据结构存储,用作数据库,缓存和消息代理.它支持数据结构,如字符串(String),哈希(Hash),列表(List),集合(Set),具有范 ...
- KVO-基本使用方法-底层原理探究-自定义KVO-对容器类的监听
书读百变,其义自见! 将KVO形式以代码实现呈现,通俗易懂,更容易掌握 :GitHub -链接如果失效请自动搜索:https://github.com/henusjj/KVO_base 代码中有详 ...
- React.js基础知识
一. react.js的基本使用方法 (1)快速使用,hello world <div id="app"></div> <script src=&qu ...
- float/文档流
float : left | right | none | inherit; 文档流是文档中可显示对象在排列时所占用的位置. 浮动的定义: 使元素脱离文档流,按照指定方向发生移动,遇到父级边界或者相邻 ...