第一次做扫描线,然后使我对线段树的理解发生了动摇= =。。这个pushup写的有点神奇。代码如下:

 #include <stdio.h>
#include <algorithm>
#include <string.h>
#define t_mid (l+r>>1)
#define ls (o<<1)
#define rs (o<<1|1)
#define lson ls,l,t_mid
#define rson rs,t_mid+1,r
using namespace std;
const int N = + ;
const int MAXN = + ;
typedef long long ll; struct seg
{
int x1,x2,y,d;
bool operator < (const seg & temp) const
{
// 先加边后减边,这样的话就不会出现lazy[o] < 0的情况了
return y == temp.y ? d > temp.d : y < temp.y;
}
}g[N*];
int n,tot,c[MAXN<<],lazy[MAXN<<]; void add(int x1,int x2,int y,int d)
{
tot ++;
g[tot] = {x1,x2,y,d};
}
void read()
{
tot = ;
for(int i=;i<=n;i++)
{
int x1, y1, x2, y2, x3, y3, x4, y4;
scanf("%d%d%d%d%d%d%d%d",&x1, &y1, &x2, &y2, &x3, &y3, &x4, &y4);
if(x1 != x3)
{
add(x1,x3,y1,);
add(x1,x3,y2,-);
}
if(x4 != x2)
{
add(x4,x2,y1,);
add(x4,x2,y2,-);
}
add(x3,x4,y1,);
add(x3,x4,y3,-);
add(x3,x4,y4,);
add(x3,x4,y2,-);
}
sort(g+,g++tot);
} void up(int o) {c[o] = c[ls] + c[rs];}
/*void down(int o,int l,int r)
{
if(l == r) return ;
int len = r - l + 1;
if(lazy[o])
{
lazy[ls] = lazy[rs] = lazy[o];
if(lazy[o] > 0)
{
c[ls] = len - len / 2;
c[rs] = len / 2;
}
else
{
c[ls] = c[rs] = 0;
}
lazy[o] = 0;
}
}*/ void pushup(int o,int l,int r)
{
if(lazy[o] > )
{
//if(lazy[o] < 0) for(int i=1;i<=1000000000000LL;i++);
// 注意seg的排序规则!
c[o] = r - l + ;
}
else
{
// lazy[o] == 0
if(l == r) c[o] = ;
else up(o);
}
}
void update(int o,int l,int r,int ql,int qr,int f)
{
if(l == ql && r == qr)
{
lazy[o] += f;
pushup(o,l,r);
return ;
}
if(qr <= t_mid) update(lson,ql,qr,f);
else if(ql > t_mid) update(rson,ql,qr,f);
else
{
update(lson,ql,t_mid,f);
update(rson,t_mid+,qr,f);
}
pushup(o,l,r);
} void solve()
{
ll ans = ;
memset(c,,sizeof(c));
memset(lazy,,sizeof(lazy));
for(int i=;i<=tot;)
{
int j = i;
while(j <= tot && g[j].y == g[i].y) j++;
for(int k=i;k<j;k++) update(,,MAXN,g[k].x1+,g[k].x2,g[k].d);
if(j <= tot) ans += (ll)(c[])*(g[j].y-g[i].y);
i = j;
}
printf("%I64d\n",ans);
} int main()
{
while(scanf("%d",&n) == && n)
{
read();
solve();
}
return ;
}

HDU 3265 Posters ——(线段树+扫描线)的更多相关文章

  1. HDU 3265 Posters (线段树+扫描线)(面积并)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3265 给你n个中间被挖空了一个矩形的中空矩形,让你求他们的面积并. 其实一个中空矩形可以分成4个小的矩 ...

  2. HDU 1542 - Atlantis - [线段树+扫描线]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1542 Time Limit: 2000/1000 MS (Java/Others) Memory Li ...

  3. 覆盖的面积 HDU - 1255 (线段树-扫描线)模板提

    给定平面上若干矩形,求出被这些矩形覆盖过至少两次的区域的面积. Input输入数据的第一行是一个正整数T(1<=T<=100),代表测试数据的数量.每个测试数据的第一行是一个正整数N(1& ...

  4. HDU 1542 Atlantis (线段树 + 扫描线 + 离散化)

    Atlantis Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...

  5. hdu 1542 Atlantis (线段树扫描线)

    大意: 求矩形面积并. 枚举$x$坐标, 线段树维护$[y_1,y_2]$内的边是否被覆盖, 线段树维护边时需要将每条边挂在左端点上. #include <iostream> #inclu ...

  6. HDU 1828 Picture (线段树+扫描线)(周长并)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1828 给你n个矩形,让你求出总的周长. 类似面积并,面积并是扫描一次,周长并是扫描了两次,x轴一次,y ...

  7. HDU 1828 Picture (线段树:扫描线周长)

    依然是扫描线,只不过是求所有矩形覆盖之后形成的图形的周长. 容易发现,扫描线中的某一条横边对答案的贡献. 其实就是 加上/去掉这条边之前的答案 和 加上/去掉这条边之后的答案 之差的绝对值 然后横着竖 ...

  8. Atlantis HDU - 1542 (线段树扫描线)

    There are several ancient Greek texts that contain descriptions of the fabled island Atlantis. Some ...

  9. hdu 1542(线段树+扫描线 求矩形相交面积)

    Atlantis Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Su ...

  10. HDU 3265 Posters(线段树)

    HDU 3265 Posters pid=3265" target="_blank" style="">题目链接 题意:给定一些矩形海报.中间有 ...

随机推荐

  1. Block使用中的一些要注意的地方

    本文主要是阐述一下Block中如何的使用外部变量以及block本身的内存管理. 先定义一个block变量,作为后续的例子中使用: typedef void(^BlockCC)(void); Block ...

  2. javascript动画效果之缓冲动画

    这里的html和css的代码是复制之前的随便匀速运动的,所以不需要改变 <!DOCTYPE html> <html> <head> <meta charset ...

  3. 【Machine Learning in Action --4】朴素贝叶斯从个人广告中获取区域倾向

    背景:广告商往往想知道关于一个人的一些特定人口统计信息,以便能更好地定向推销广告. 我们将分别从美国的两个城市中选取一些人,通过分析这些人发布的信息,来比较这两个城市的人们在广告用词上是否不同.如果结 ...

  4. events.js:72 throw er; // Unhandled 'error' event

    http://stackoverflow.com/questions/24525253/events-js72-throw-er-unhandled-error-event 出现了一个上述的错误. e ...

  5. 转载 Deep learning:一(基础知识_1)

    前言: 最近打算稍微系统的学习下deep learing的一些理论知识,打算采用Andrew Ng的网页教程UFLDL Tutorial,据说这个教程写得浅显易懂,也不太长.不过在这这之前还是复习下m ...

  6. leetcode441(巧妙利用取整和解方程)

    You have a total of n coins that you want to form in a staircase shape, where every k-th row must ha ...

  7. iOS 的 APP 如何适应 iPhone 5s/6/6Plus 三种屏幕的尺寸?

    初代iPhone 2007年,初代iPhone发布,屏幕的宽高是 320 x 480 像素.下文也是按照宽度,高度的顺序排列.这个分辨率一直到iPhone 3GS也保持不变. 那时编写iOS的App( ...

  8. 利用proxychains在终端使用socks5代理

    最近用各种脚本下载东西的时候发现有的站点需要当地IP才能下,比如.....nico, youtube等: 所以就找了下能在终端用socks5代理的工具,最后找到了proxychains,从此再无压力= ...

  9. textFiled输入字数的控制问题之—把带输入的拼音也判断了

    一个textFiled,控制只能输入五个字,现在你已经输入了四个字,在输入第五个字的时候,输入一个拼音之后就不能输入后一个拼音,这里把拼音也当成字来判断了,这种情况下就需要_textFiled.mar ...

  10. 用GDB调试程序的设置 Segmentation fault(Core Dump)调试

    在写wifi库的时候碰见一个 Segmentation fault(Core Dump) 所以需要用GDB调试下. 在cmake的时候,修改CMakeLists.txt set(CMAKE_C_FLA ...