采用扫描线的思想,其实是区间更新的题目

题解链接https://blog.csdn.net/shiqi_614/article/details/7819232

注意处理细节:1)因为边框上的点不算,所以要当出边入边重合时,要先更新出边,再更新入边

       2)同理,在y轴上建立的线段树应该把坐标离散成互不相交的点,如(0,1),(1,2),(2,3)等开区间来代替[0,1],[1,2],[2,3],这样就能避免算入边框上的点。

          怎么使用开区间?如果更新的线段是[1,2],那么实际上只能覆盖住[1,1]所以只要在update的两个分支中修改即可

#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#include<map>
#define ll long long
using namespace std;
#include<algorithm>
#define maxn 40005
#define lson l,m,rt<<1
#define rson m,r,rt<<1|1
struct Seg{
ll x,y1,y2,c;
Seg(){}
Seg(ll a,ll b,ll c,ll d):x(a),y1(b),y2(c),c(d){}
bool operator<(const Seg& a)const{
if(x==a.x) return c<a.c;
return x<a.x;
}
}segs[maxn*]; int w,h;
ll tot,toty,data[maxn];
map<ll,int> mp;//哈希表
int Max[maxn<<],lazy[maxn<<];//在y轴上建立线段树
inline void pushup(int rt){
Max[rt]=max(Max[rt<<],Max[rt<<|]);
}
inline void pushdown(int rt){
if(lazy[rt]){
Max[rt<<]+=lazy[rt];
Max[rt<<|]+=lazy[rt];
lazy[rt<<]+=lazy[rt];
lazy[rt<<|]+=lazy[rt];
lazy[rt]=;
}
}
void update(int L,int R,int c,int l,int r,int rt){
if(L<=l && R>=r){
lazy[rt]+=c;
Max[rt]+=c;
return;
}
pushdown(rt);
int m=l+r>>;
if(L<m) update(L,R,c,lson);//离散化后要作为开区间处理
if(R>m) update(L,R,c,rson);
pushup(rt);
}
void init(){
toty=tot=;
mp.clear();
memset(Max,,sizeof Max);
memset(lazy,,sizeof lazy);
}
int main(){
ll n,a,b,c;
while(scanf("%lld%d%d",&n,&w,&h)==){
init();
for(int i=;i<=n;i++){
scanf("%lld%lld%lld",&a,&b,&c);
segs[tot++]=Seg(a,b,b+h,c);segs[tot++]=Seg(a+w,b,b+h,-c);
data[toty++]=b;data[toty++]=b+h;
}
sort(data,data+toty);
sort(segs,segs+tot);
toty=unique(data,data+toty)-data;
for(int i=;i<toty;i++) mp[data[i]]=i;//用map(哈希)离散化 int mx=;
for(int i=;i<tot;i++){
update(mp[segs[i].y1],mp[segs[i].y2],segs[i].c,,toty,);
mx=max(mx,Max[]);
}
printf("%d\n",mx);
}
return ;
}

poj12482 扫描线+lazy-tag的更多相关文章

  1. _bzoj1798 [Ahoi2009]Seq 维护序列seq【线段树 lazy tag】

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1798 注意,应保证当前节点维护的值是正确的,lazy tag只是一个下传标记,在下传时应即时 ...

  2. hiho1080 - 数据结构 线段树(入门题,两个lazy tag)

    题目链接 维护区间和,两个操作:一个是将某个区间设置成一个值,一个是将某个区间增加一个固定值 /**************************************************** ...

  3. hihoCoder #1080 : 更为复杂的买卖房屋姿势 (线段树,多tag)

    题意: 有编号为0~n的n+1个房屋,给出每个房屋的起始价格,随后给出m种修改,每次修改都要进行输出所有房屋的价格总和.修改有两种方式:(1)政府调控,编号L~R全置为同一价格(0)房屋自行涨跌,编号 ...

  4. poj2482

    (题外话:这题这是ACMer的福利啊……)我非常不擅长做矩形类的数据结构一般来说,二维的问题我们要转化为一维来考虑感觉一般的手法是对一维排序,并且线性扫描这一维,然后用各种数据结构维护另一维上的最优值 ...

  5. [Noip复习知识点][个人向]Zackzh

    只是列列一些要复习的,努力复习吧,有种noip退役的赶脚. 一.模拟 (这你也不会?退役吧) 二.DP 1.基础dp 2.区间dp 3.状压dp 4.树形dp 6.概率(期望)dp 7.环形dp 8. ...

  6. [bzoj4722]由乃

    身为10班人,就凭标题,这道题是一定要做的. 但是做了才发现有毒....所以是信念和题解和大腿支撑了我! 先"假设"自己实力过硬,推出了结论:当区间过大时,必定存在一种方案可以输出 ...

  7. [CQOI 2014] 数三角形 & 机械排序臂

    数三角形 bzoj 3505 要知道一个公式就是(a,b)和(x,y)两点所成线段上面的整点数是gcd(a-x,b-y)-1,通过枚举原点到map上任意一点所能成的三角形,再平移,得到要去掉的三点共线 ...

  8. JSOI 2008 火星人prefix

    FROM http://www.lydsy.com/JudgeOnline/problem.php?id=1014 LCP问题 给定串 S[0..n] , 对于一对(a,b)其中0<a,b< ...

  9. bzoj3211,bzoj3038

    线段树的裸题: 但是操作很奇怪,开方是不能lazy tag的 看来只能暴力修改了 但注意,开放开到1的时候就不用开,立一个flag就可以了 这可以大大的优化: 其实我是来复习线段树的 ..] of i ...

随机推荐

  1. 【CSS】定义元素的对齐方式

    1.文本内容居中对齐:text-align.扩展用法:父元素嵌套子元素时,且子元素的宽度小于父元素宽度,使用text-align:center,可以实现子元素的居中对齐. <!DOCTYPE h ...

  2. 学习windows编程 day4 之视口和窗口

    LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { HDC hdc; PAINTSTRU ...

  3. win2003服务器安全设置教程

    服务器安全设置 1.系统盘和站点放置盘必须设置为NTFS格式,方便设置权限. 2.系统盘和站点放置盘除administrators 和system的用户权限全部去除. 3.启用windows自带防火墙 ...

  4. synchronized实现原理

    线程安全是并发编程中的重要关注点,应该注意到的是,造成线程安全问题的主要诱因有两点,一是存在共享数据(也称临界资源),二是存在多条线程共同操作共享数据.因此为了解决这个问题,我们可能需要这样一个方案, ...

  5. 通过 LPeg 介绍解析表达式语法(Parsing Expression Grammars)

    通过 LPeg 介绍解析表达式语法(Parsing Expression Grammars) 译者: FreeBlues 修订版本: 1.00 最新链接: http://www.cnblogs.com ...

  6. 四、u-boot 链接脚本

    4.1 C语言中的段 编译器在编译程序的时候,将程序中的所有的元素分成了一些组成部分,各部分构成一个段,所以说段是可执行程序的组成部分. 代码段:代码段就是程序中的可执行部分,直观理解代码段就是函数堆 ...

  7. Mac改键软件Karabiner使用教程

    Mac改键软件Karabiner使用教程 目前Mac上比较好用的改键软件是Karabiner,不过对于最新的Sierra系统,Karabiner失效了.这里介绍的实际上是Karabiner-Eleme ...

  8. sql 把多列内容合并

    这个语句不完整.应该是这样:stuff(select ',' + fieldname  from tablename for xml path('')),1,1,'') as ’别名‘这一整句的作用是 ...

  9. Flask最强攻略 - 跟DragonFire学Flask - 第七篇 Flask 中路由系统

    Flask中的路由系统其实我们并不陌生了,从一开始到现在都一直在应用 @app.route("/",methods=["GET","POST" ...

  10. Database学习 - mysql 数据库 外键

    外键 外键约束子表的含义:如果在父表中赵达不到候选键,则不允许在子表上进行insert/update 外键预约对父表的含义:在父表上进行update/delete以更新或删除子表中有一条或多条对应匹配 ...