矩形面积并(只覆盖一次的面积)的裸题。好久没写代码debug了我太久,太辛酸了。

#pragma warning(disable:4996)
#include <iostream>
#include <cstring>
#include <string>
#include <vector>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std; #define ll long long
#define maxn 200005
#define y1 y111 int lf[maxn << 2], rf[maxn << 2];
int sum[maxn << 2];
int a[maxn];
int add[maxn << 2];
int mi[maxn << 2];
int ma[maxn << 2]; int n, nSize; void pushUp(int i)
{
mi[i] = min(mi[i << 1], mi[i << 1 | 1]);
ma[i] = max(ma[i << 1], ma[i << 1 | 1]);
} void pushDown(int i)
{
if (add[i] != 0){
if (lf[i] != rf[i]){
add[i << 1] += add[i];
add[i << 1 | 1] += add[i];
mi[i << 1] += add[i];
ma[i << 1] += add[i];
mi[i << 1 | 1] += add[i];
ma[i << 1 | 1] += add[i];
add[i] = 0;
}
}
} void build(int i, int L, int R)
{
lf[i] = L; rf[i] = R; add[i] = mi[i] = ma[i] = 0;
if (L == R){
sum[i] = a[L];
return;
}
int M = (L + R) >> 1;
build(i << 1, L, M);
build(i << 1 | 1, M + 1, R);
sum[i] = sum[i << 1] + sum[i << 1 | 1];
} void upd(int i, int L, int R,int v)
{
if (L == lf[i] && R == rf[i]){
add[i] += v;
mi[i] += v;
ma[i] += v;
return;
}
pushDown(i);
int M = (lf[i] + rf[i]) >> 1;
if (R <= M){
upd(i << 1, L, R,v);
}
else if (L > M){
upd(i << 1 | 1, L, R, v);
}
else{
upd(i << 1, L, M, v);
upd(i << 1 | 1, M + 1, R, v);
}
pushUp(i);
} ll query(int i)
{
if (ma[i] <= 0) return 0;
if (mi[i] > 1) return 0;
if (ma[i] == mi[i] && ma[i] == 1){
return sum[i];
}
pushDown(i);
return query(i << 1) + query(i << 1 | 1);
} struct Node
{
ll x;
ll bg, ed;
int v;
Node(ll xi, ll bgi, ll edi,int vi) :x(xi), bg(bgi), ed(edi),v(vi){}
bool operator < (const Node &b)const{
return x == b.x ? v>b.v : x < b.x;
}
};
vector<Node> vec;
vector<ll> dis; int main()
{
int T; cin >> T; int ca = 0;
while (T--)
{
scanf("%d", &n);
ll x1, x2, y1, y2;
vec.clear();
vec.reserve(2 * n + 100);
dis.clear();
for (int i = 0; i < n; ++i){
scanf("%I64d%I64d%I64d%I64d", &x1, &y1, &x2, &y2);
vec.push_back(Node(x1, y1, y2,1));
vec.push_back(Node(x2, y1, y2,-1));
dis.push_back(y1);
dis.push_back(y2);
}
sort(dis.begin(), dis.end());
nSize = unique(dis.begin(), dis.end()) - dis.begin();
for (int i = 1; i < nSize; ++i){
a[i] = dis[i] - dis[i - 1];
}
for (int i = 0; i < vec.size(); ++i){
int lid = lower_bound(dis.begin(), dis.begin()+nSize, vec[i].bg) - dis.begin();
int rid = lower_bound(dis.begin(), dis.begin()+nSize, vec[i].ed) - dis.begin();
vec[i].bg = lid + 1;
vec[i].ed = rid;
}
sort(vec.begin(), vec.end());
build(1, 1, nSize - 1); ll ans = 0;
ll preLen = 0;
ll prex = vec[0].x;
for (int i = 0; i < vec.size(); ++i){
ll val = vec[i].x;
while (i<vec.size()&&vec[i].x == val){
upd(1, vec[i].bg, vec[i].ed, vec[i].v);
++i;
}
--i;
ans += preLen*(vec[i].x - prex);
prex = vec[i].x;
preLen = query(1);
}
printf("Case %d: %I64d\n", ++ca, ans);
}
return 0;
}

FZU2187 回家种地(矩形面积并)的更多相关文章

  1. FZU 2187 回家种地 ( 扫描线 + 离散 求矩阵单次覆盖面积 )

    2187 回家种地 Accept: 56    Submit: 230Time Limit: 1000 mSec    Memory Limit : 32768 KB Problem Descript ...

  2. [LeetCode] Rectangle Area 矩形面积

    Find the total area covered by two rectilinear rectangles in a2D plane. Each rectangle is defined by ...

  3. POJ 1151 Atlantis(线段树-扫描线,矩形面积并)

    题目链接:http://poj.org/problem?id=1151 题目大意:坐标轴上给你n个矩形, 问这n个矩形覆盖的面积 题目思路:矩形面积并. 代码如下: #include<stdio ...

  4. 25.按要求编写一个Java应用程序: (1)编写一个矩形类Rect,包含: 两个属性:矩形的宽width;矩形的高height。 两个构造方法: 1.一个带有两个参数的构造方法,用于将width和height属性初化; 2.一个不带参数的构造方法,将矩形初始化为宽和高都为10。 两个方法: 求矩形面积的方法area() 求矩形周长的方法perimeter() (2)通过继承Rect类编写一个具有

    package zhongqiuzuoye; //自己写的方法 public class Rect { public double width; public double height; Rect( ...

  5. 扫描线 + 线段树 : 求矩形面积的并 ---- hnu : 12884 Area Coverage

    Area Coverage Time Limit: 10000ms, Special Time Limit:2500ms, Memory Limit:65536KB Total submit user ...

  6. 【HDU 1542】Atlantis(线段树+离散化,矩形面积并)

    求矩形面积并,离散化加线段树. 扫描线法: 用平行x轴的直线扫,每次ans+=(下一个高度-当前高度)*当前覆盖的宽度. #include<algorithm> #include<c ...

  7. 2015baidu复赛 矩形面积(包凸 && ps:附quickhull模板)

    矩形面积 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  8. 2015年百度之星初赛(1) --- F 矩形面积

    矩形面积 Problem Description 小度熊有一个桌面,小度熊剪了很多矩形放在桌面上,小度熊想知道能把这些矩形包围起来的面积最小的矩形的面积是多少.   Input 第一行一个正整数 T, ...

  9. POJ 1151 / HDU 1542 Atlantis 线段树求矩形面积并

    题意:给出矩形两对角点坐标,求矩形面积并. 解法:线段树+离散化. 每加入一个矩形,将两个y值加入yy数组以待离散化,将左边界cover值置为1,右边界置为2,离散后建立的线段树其实是以y值建的树,线 ...

随机推荐

  1. 09.VUE学习之watch监听属性变化实现类百度搜索栏功能ajax异步请求数据,返回字符串

    cmd下安装axios npm install axios 安装好后,会多出node_modules文件夹 思路: 监听data里的word改变时,发送ajax异步请求数据, 把返回的数据赋值给dat ...

  2. python3 练习题100例 (十四)

    今天逛贴吧,看到有人求助,做了一下.请大家指正! #!/usr/bin/env python3 # -*- coding: utf-8 -*- __author__ = 'Fan Lijun' imp ...

  3. java中equals和==区别

    equals 方法是 java.lang.Object 类的方法. 有两种用法说明: (1)对于字符串变量来说,使用“==”和“equals()”方法比较字符串时,其比较方法不同. “==”比较两个变 ...

  4. Docker背后的内核知识(二)

    cgroups资源限制 上一节中Docker背后的内核知识(一),我们了解了Docker背后使用的资源隔离技术namespace,通过系统调用构建了一个相对隔离的shell环境,也可以称之为简单的“容 ...

  5. IT帮2019年2月线下活动【定义工作,解读自我】之站桩练习

    2019年2月IT帮线下活动[定义工作,解读自我] 昨天的活动收获很大,全面的总结周老师会另写一篇来帮助大家回顾.我想说一下其中最打动我的一句话:“只有你能决定你有多优秀!” “工作中把自己当成企业家 ...

  6. SparkSQL查询程序的两种方法,及其对比

    import包: import org.apache.spark.{SparkConf, SparkContext}import org.apache.spark.rdd.RDDimport org. ...

  7. 更改 Mac 上的功能键行为

    您可以将 Apple 键盘上的顶行按键用作标准功能键,或用来控制 Mac 的内建功能.   如果您的 Apple 键盘部分顶行按键上印有图标,则这些按键可用于执行每个图标所示的特殊功能.这些按键也可用 ...

  8. Python 连接数据库失败

    什么是 PyMySQL? PyMySQL 是在 Python3.x 版本中用于连接 MySQL 服务器的一个库,Python2中则使用mysqldb. PyMySQL 遵循 Python 数据库 AP ...

  9. kickstart配置文件详解和system-config-kickstart

    kickstart是什么         许多系统管理员宁愿使用自动化的安装方法来安装红帽企业 Linux.为了满足这种需要,红帽创建了kickstart安装方法.使用kickstart,系统管理员可 ...

  10. [oldboy-django][1初始django]模态对话框 + 动态加载gif (多对多数据库表)

    ajax+对话框(多对多) - 遮罩层,动态加载gif层,对话框层, a.一点击添加,绑定事件: - 出现遮罩层和动态gif层 - ajax向后台发送请求获取所有班级数据 - success,隐藏动态 ...