矩形面积并(只覆盖一次的面积)的裸题。好久没写代码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. js中如何把RGB颜色转换为16进制颜色

    将RGB颜色值转换为16进制颜色值,主要是将 R.G.B 值分别转换为对应的十六进制值,填入 #RRGGBB 中. 推荐在线颜色转换工具:http://www.ecjson.com/rgbhex/ 例 ...

  2. unix gcc编译过程

    gcc编译过程 现代编译器常见的编译过程: 源文件-->预处理-->编译/优化-->汇编-->链接-->可执行文件 对于gcc而言: 第一步 预处理       命令: ...

  3. #include "*.c"文件的妙用

    在看uCOS II V2.91版本源代码时,在ucos_ii.c源文件中发现下面的代码: #include <os_core.c> #include <os_flag.c> # ...

  4. as API一些容易忘记的属性和方法

    1.在flash动画里的一些动态文本会随着动画的执行,有抖动,解决问题的方法: tt为动画里的动态文本,tt.transform.matrix=null;

  5. python3与django中@property详解

    django提供了内置装饰器 @staticmethod\@classmethod\property 在OSQA中,@property的使用频率是非常高的.下面就是它的使用方法: @property ...

  6. IOS开发---菜鸟学习之路--(二十二)-近期感想以及我的IOS学习之路

    在不知不觉当中已经写了21篇内容 其实一开始是没有想些什么东西的 只是买了Air后 感觉用着挺舒服的,每天可以躺在床上,就一台笔记本,不用网线,不用电源,不用鼠标,不用键盘,干干脆脆的就一台笔记本. ...

  7. 记一次Entity Framework 项目的优化过程

    在博客园看了不少其他大神的经验.今天也抽空贡献点自己的经验(并不是说自己也是大神..小弟还只新手程序员去年才毕业的) 好了废话不多说,直接进入主题.(具体的好坏各位看官就随便看看吧..没有什么好坏之分 ...

  8. [oldboy-django][6其他]微信二维码扫码登录注册

    http://blog.csdn.net/maerdym/article/details/46380309 http://blog.csdn.net/jiang1013nan/article/deta ...

  9. Gym100623A Access Control Lists

    Gym 100623A Access Control Lists 这个题很sb啊,就是去设置个交换机 我们可以给一个IP进行设置,也可以对一个网段就行设置,但是IP是优于网段的,比如样例的第一个 网段 ...

  10. [SCOI2007][bzoj1070] 修车 [费用流]

    题面 传送门 思路 我们考虑某个工人修车的从前到后序列如下: ${W_1,W_2,W_3,...,W_n}$ 那么,对于这n辆车的车主而言,他们等候的总时间为: $\sum_{i=1}^{n}W_i\ ...