第一次做扫描线,然后使我对线段树的理解发生了动摇= =。。这个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. NFS服务器原理

    NFS服务器   port:2049      NFS 为 Network FileSystem 的简称,它的目的就是想让不同的机器.不同的操作系统可以彼此分享个别的档案啦!目前在 Unix Like ...

  2. jquery中onclick=&quot;fn&quot;中$(this)所代表的对象

    jquery中onclick="fn"中$(this)所代表的对象 js方法 function qiehuan(){ var src = $(this).attr("da ...

  3. [Locked] Verify Preorder Sequence in Binary Search Tree

    Verify Preorder Sequence in Binary Search Tree Given an array of numbers, verify whether it is the c ...

  4. Light OJ 1067 Combinations (乘法逆元)

    Description Given n different objects, you want to take k of them. How many ways to can do it? For e ...

  5. java 面试题汇总(未完成)

    版权声明:本文博客原创文章,博客,未经同意,不得转载.

  6. JAVA线程概念

    一.操作系统中线程和进程的概念 现在的操作系统是多任务操作系统.多线程是实现多任务的一种方式. 进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程中可以启动多个线程.比如在 ...

  7. RX系列一 | ReactiveX根源 | 观察者模式分析

    RX系列一 | ReactiveX根源 | 观察者模式分析 Rx的响应式编程算是很火了,对吧,但是我的工作基本上就不会接触,所以学习的比较晚,到现在才分享给大家,我们一点点的去学,当你看完这整个系列的 ...

  8. Python3学习笔记32-xlwt模块

    xlwt模块是用来写入excel的第三方模块,需要下载安装后才能使用. 设置字体样式 import xlwt #初始化一个excel excel = xlwt.Workbook(encoding='u ...

  9. 基于URL的高层次Java网络编程

    一致资源定位器URL URL(Uniform Resource Locator)是一致资源定位器的简称,它表示Internet上某一资源的地址.通过URL我们可以访问Internet上的各种网络资源, ...

  10. left join 注意事项

    相信对于熟悉SQL的人来说,LEFT JOIN非常简单,采用的时候也很多,但是有个问题还是需要注意一下.假如一个主表M有多个从表的话A B C …..的话,并且每个表都有筛选条件,那么把筛选条件放到哪 ...