洛咕

题意:在一个笛卡尔平面坐标系里(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的更多相关文章

  1. 洛谷P1884 [USACO12FEB]Overplanting S (矩形切割)

    一种矩形切割的做法: 1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long LL; 4 const in ...

  2. 线段树+扫描线【p1884】[Usaco12FEB]过度种植(银)Overplanting …

    Description 在一个笛卡尔平面坐标系里(则X轴向右是正方向,Y轴向上是正方向),有\(N(1<=N<=1000)\)个矩形,第i个矩形的左上角坐标是\((x1, y1)\),右下 ...

  3. 题解 P1884 【[USACO12FEB]过度种植(银)Overplanting 】

    什么,扫描线需要线段树? 那我第一个不干啊(其实是不会写) 这里介绍一种裸的扫描线: 我们根据x排序,对于相等的 \(x\) ,将 \(y\) 进入和退出分类讨论,然后全部放进set里面.每次 \(x ...

  4. 洛谷P3048 [USACO12FEB]牛的IDCow IDs

    P3048 [USACO12FEB]牛的IDCow IDs 12通过 67提交 题目提供者lin_toto 标签USACO2012 难度普及/提高- 时空限制1s / 128MB 提交  讨论  题解 ...

  5. 树形DP【洛谷P3047】 [USACO12FEB]附近的牛Nearby Cows

    P3047 [USACO12FEB]附近的牛Nearby Cows 农民约翰已经注意到他的奶牛经常在附近的田野之间移动.考虑到这一点,他想在每一块土地上种上足够的草,不仅是为了最初在这片土地上的奶牛, ...

  6. 洛谷P3045 [USACO12FEB]牛券Cow Coupons

    P3045 [USACO12FEB]牛券Cow Coupons 71通过 248提交 题目提供者洛谷OnlineJudge 标签USACO2012云端 难度提高+/省选- 时空限制1s / 128MB ...

  7. 洛谷P3047 [USACO12FEB]Nearby Cows(树形dp)

    P3047 [USACO12FEB]附近的牛Nearby Cows 题目描述 Farmer John has noticed that his cows often move between near ...

  8. 洛谷 P3047 [USACO12FEB]附近的牛Nearby Cows

    P3047 [USACO12FEB]附近的牛Nearby Cows 题目描述 Farmer John has noticed that his cows often move between near ...

  9. [USACO12FEB]牛券Cow Coupons(堆,贪心)

    [USACO12FEB]牛券Cow Coupons(堆,贪心) 题目描述 Farmer John needs new cows! There are N cows for sale (1 <= ...

  10. P3045 [USACO12FEB]牛券Cow Coupons

    P3045 [USACO12FEB]牛券Cow Coupons 贪心题.先选中 \(c_i\) 最小的 \(k\) 头牛,如果这样就超过 \(m\) ,直接退出,输出答案.否则考虑把后面的牛依次加入, ...

随机推荐

  1. think php3 中接入protobuf(一)

    protobuf,网上一大堆解释,说白了,就是跟json,xml一样的通讯协议,相比json,xml具有体积小,解析速度快的优点,我实在本地的电脑上实现的,后续会有相应的项目使用到,所以先在本地实现, ...

  2. SAP FBL1N屏幕增强,增加自定义的列

    需求 因财务想要在查看未清和已清凭证的时候,看到是该凭证是否哪一个采购人员创建,因此新增一列创建人,关联关系是 EKKO-EBELN=BSEG-ZUONR,这里关联分配号是因为之前开发自动清账的时候做 ...

  3. VUE学习-mixin混入

    mixin混入 混入 (mixin) 提供了一种非常灵活的方式,来分发 Vue 组件中的可复用功能. 组件式混入 // 定义一个混入对象 var myMixin = { created: functi ...

  4. Asp.NET core/net 5接口返回实体含有long/int64的属性序列后最后几位变为0的解决

    Asp.NET core /net 5接口返回实体含有long/int64的属性时,序列后最后几位变为0的. 不得不吐槽一下MS,这种事还有问题,NND. 解决方案在startup.cs中添加:opt ...

  5. 数据库基础day1

    数据库基础 MySQL概述 SQL 函数 概念 函数 是指一段可以直接被另一段程序调用的程序或代码. 3.1字符串函数 函数 功能 CONCAT(S1,S2,...Sn) 字符串拼接,将S1,S2,. ...

  6. Traefik官方文档以及翻译文档

    https://www.qikqiak.com/traefik-book/ https://doc.traefik.io/traefik/

  7. web-bootstrap-button

    20:51:55 页面上两个button 并列,且空出间隔.

  8. Ubuntu18.04LTS虚拟机优化

    1.没网 刚安装好没网,可以设置NAT连接,也可以直接设置为桥接模式联网.这里直接桥接. 网络中心使用的是以太网,所以就在菜单的"编辑"里的"虚拟网络编辑器"里 ...

  9. 关于 MySQL 的 General Log 功能

    检查 General Log 输出目标 SHOW GLOBAL VARIABLES LIKE 'log_output'; # Type: Set # Default Value: FILE # Val ...

  10. Mysql之迂回连接术

    转载请注明来源:https://www.cnblogs.com/Sherlock-L/p/14932870.html 关键词:OmniDB.Mysql Router 背景:项目的测试数据库放在了生产机 ...