[USACO12FEB]Overplanting S
洛咕
题意:在一个笛卡尔平面坐标系里(X轴向右是正方向,Y轴向上是正方向),有\(N(1<=N<=1000)\)个矩形,第\(i\)个矩形的左上角坐标是\((x1, y1)\),右下角坐标是\((x2,y2)\)。问这\(N\)个矩形所覆盖的面积是多少?注意:被重复覆盖的区域的面积只算一次。
分析:比较经典的扫描线模板题。对于每个给出的矩形,左边线视为\(+1\),右边线视为\(-1\),从左到右扫描,要求每两根相邻的矩形边线贡献的面积,宽度就是两线横坐标之差,长度要用线段树来维护区间加减。本题由于横纵坐标取值范围达到\(10^8\)量级,所以先要离散化处理一下。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
inline int read(){
char ch=getchar();int x=0,f=1;
while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}
while('0'<=ch&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
const int mod=10007;
const int N=10005;
int n,tot,a[N];
ll raw[N],sum[N<<2],cnt[N<<2];
struct node{int x,y1,y2,z;}e[N];
inline bool cmp(node x,node y){return x.x==y.x?x.y1<y.y1:x.x<y.x;}
inline void change(int p,int l,int r,int ql,int qr,int val){
if(ql<=l&&qr>=r){
cnt[p]+=val;
if(cnt[p]>0)sum[p]=raw[r+1]-raw[l];
else sum[p]=sum[p<<1]+sum[p<<1|1];
return;
}
int mid=(l+r)>>1;
if(ql<=mid)change(p<<1,l,mid,ql,qr,val);
if(qr>mid)change(p<<1|1,mid+1,r,ql,qr,val);
if(cnt[p]>0)sum[p]=raw[r+1]-raw[l];
else sum[p]=sum[p<<1]+sum[p<<1|1];
}
int main(){
n=read();
for(int i=1;i<=n;++i){
int x1=read(),y2=read(),x2=read(),y1=read(),k1=(i<<1)-1,k2=i<<1;
e[k1].x=x1;e[k1].y1=y1;e[k1].y2=y2;e[k1].z=1;
e[k2].x=x2;e[k2].y1=y1;e[k2].y2=y2;e[k2].z=-1;
a[++tot]=y1;a[++tot]=y2;
}
sort(a+1,a+tot+1);int len=unique(a+1,a+tot+1)-a-1;n<<=1;
for(int i=1;i<=n;i+=2){
int pos1=lower_bound(a+1,a+len+1,e[i].y1)-a;
int pos2=lower_bound(a+1,a+len+1,e[i].y2)-a;
raw[pos1]=e[i].y1;raw[pos2]=e[i].y2;
e[i].y1=e[i+1].y1=pos1;e[i].y2=e[i+1].y2=pos2;
}
sort(e+1,e+n+1,cmp);ll ans=0;
for(int i=1;i<=n;++i){
change(1,1,n,e[i].y1,e[i].y2-1,e[i].z);
ans+=1ll*(e[i+1].x-e[i].x)*sum[1];
}
printf("%lld\n",ans);
return 0;
}
[USACO12FEB]Overplanting S的更多相关文章
- 洛谷P1884 [USACO12FEB]Overplanting S (矩形切割)
一种矩形切割的做法: 1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long LL; 4 const in ...
- 线段树+扫描线【p1884】[Usaco12FEB]过度种植(银)Overplanting …
Description 在一个笛卡尔平面坐标系里(则X轴向右是正方向,Y轴向上是正方向),有\(N(1<=N<=1000)\)个矩形,第i个矩形的左上角坐标是\((x1, y1)\),右下 ...
- 题解 P1884 【[USACO12FEB]过度种植(银)Overplanting 】
什么,扫描线需要线段树? 那我第一个不干啊(其实是不会写) 这里介绍一种裸的扫描线: 我们根据x排序,对于相等的 \(x\) ,将 \(y\) 进入和退出分类讨论,然后全部放进set里面.每次 \(x ...
- 洛谷P3048 [USACO12FEB]牛的IDCow IDs
P3048 [USACO12FEB]牛的IDCow IDs 12通过 67提交 题目提供者lin_toto 标签USACO2012 难度普及/提高- 时空限制1s / 128MB 提交 讨论 题解 ...
- 树形DP【洛谷P3047】 [USACO12FEB]附近的牛Nearby Cows
P3047 [USACO12FEB]附近的牛Nearby Cows 农民约翰已经注意到他的奶牛经常在附近的田野之间移动.考虑到这一点,他想在每一块土地上种上足够的草,不仅是为了最初在这片土地上的奶牛, ...
- 洛谷P3045 [USACO12FEB]牛券Cow Coupons
P3045 [USACO12FEB]牛券Cow Coupons 71通过 248提交 题目提供者洛谷OnlineJudge 标签USACO2012云端 难度提高+/省选- 时空限制1s / 128MB ...
- 洛谷P3047 [USACO12FEB]Nearby Cows(树形dp)
P3047 [USACO12FEB]附近的牛Nearby Cows 题目描述 Farmer John has noticed that his cows often move between near ...
- 洛谷 P3047 [USACO12FEB]附近的牛Nearby Cows
P3047 [USACO12FEB]附近的牛Nearby Cows 题目描述 Farmer John has noticed that his cows often move between near ...
- [USACO12FEB]牛券Cow Coupons(堆,贪心)
[USACO12FEB]牛券Cow Coupons(堆,贪心) 题目描述 Farmer John needs new cows! There are N cows for sale (1 <= ...
- P3045 [USACO12FEB]牛券Cow Coupons
P3045 [USACO12FEB]牛券Cow Coupons 贪心题.先选中 \(c_i\) 最小的 \(k\) 头牛,如果这样就超过 \(m\) ,直接退出,输出答案.否则考虑把后面的牛依次加入, ...
随机推荐
- 智能指针 shared_ptr weak_ptr shared_from_this 笔记
shared_ptr 当指向对象的std::shared_ptr一创建,被管理对象的控制块SharedPtrControlBlock(参考下面的图)就建立了. 被管理的对象的控制块中有引用计数(ref ...
- 微信小程序(开发某些方式)
1.开发工具:微信小程序开发工具(需要appid登录)2.调试:可使用微信开发者工具预览(用真机测试)3.真机调试:微信开发者工具真机调试(可打印以及查看网络等)4.扫一扫功能: 1.小程序里面可 ...
- Mysql数据库基础第四章DDL(数据定义语言):库表的管理、数据类型与约束条件
Mysql数据库基础系列 软件下载地址 提取码:7v7u 数据下载地址 提取码:e6p9 mysql数据库基础第一章:(一)数据库基本概念 mysql数据库基础第一章:(二)mysql环境搭建 mys ...
- css3的的新特性
1.transform 2.calc 3.transition
- 基于AD9361的双收双发射频FMC子卡
FMC177-基于AD9361的双收双发射频FMC子卡 一.板卡介绍 FMC177射频模块分别包含两个接收通道与发射通道,其频率可覆盖达到70MHz~6GHz,AD9361芯片提供具有成本效益的实验平 ...
- CodeGym自学笔记12——类名
类的全名 类的全名由所有包的名称(由句点分隔)和类名组成. "要在代码中使用类,你需要指出类的全名.你也可以使用类的短名称,即只使用类名,但你需要'导入类'.这意味着在声明类之前,你要指出单 ...
- 关于我在安装2.6.9版本bochs虚拟机时遇到的问题以及解决过程
更新于:2019.7.2 在阅读<一个64位操作系统的设计与实现>过程中,搭建实验环境遇到的诸多困难. 本人的实验环境:vmware15.0 下安装有kali-liunx虚拟机里进行的安装 ...
- Springcloud gateway整合(集成)swagger2+finfe4j踩坑
项目使用gateway代替之前的zuul网关,需要整合swagger,踩了许多坑之后终于解决问题,话不多说直接上代码 因为使用的是阿里的东西所以注册中心选择了nacos,它的配置这里就不贴了 spri ...
- java 复习篇1-----人机交互
CMD命令 盘符名称+冒号 说明:盘符切换 举例:e:回车,表示切换到e盘 dir: 说明:查看当前路径下的内容 cd目录: 说明:进入单级目录 举例:cd itheima cd. . 说明:回退到上 ...
- 关于oracle中scott用户恢复到初始状态的步骤,和一些问题解决方法。
一般恢复步骤: sqlplus 连接到sys用户sqlplus / as sysdba运行脚本进行初始恢复start ?/rdbms/admin/utlsampl.sql;恢复后,用户为锁定状态,需要 ...