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

题解链接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. 使用swagger来编写在线api文档

    swagger是一个非常简单,强大的框架.快速上手,只需要引入jar包 , 使用注解就可以生成一个漂亮的在线api文档 pom.xml <dependency> <groupId&g ...

  2. CentOS下安装zookeeper并设置开机自启动

    转自: 一.安装zookeeper # cd /opt/ # mkdir zookeeper # cd zookeeper/ # tar -zxvf zookeeper-3.4.6.tar.gz # ...

  3. Networx蓝屏问题

    本人系统win7专业版64位. 从5月底开始就时不时有蓝屏发生,而且可以说是没有任何征兆就"啪"的一下蓝了... 有时候是隔个四五天蓝屏一次,有时候一天都能蓝好几次,实在是让人恼火 ...

  4. Phalcon的Mvc结构及启动流程(部分源码分析)

    Phalcon本身有支持创建多种形式的Web应用项目以应对不同场景,包括迷你应用.单模块标准应用.以及较复杂的多模块应用 创建项目 Phalcon环境配置安装后,可以通过命令行生成一个标准的Phalc ...

  5. SysTick_CLKSourceConfig 这个函数

    systick的寄存器说明是在<Cortex M3权威指南>里说明了! 其实是有选择的,只是默认是AHB/8.通过设置systick的CTRL寄存器的bit2来设置时钟,设置如下: bit ...

  6. luogu 2294 狡猾的商人 带权并查集

    此题做法多啊 带权并查集,区间dp,前缀和,差分约束 1.自己写的前缀和, 11 #include<bits/stdc++.h> #define rep(i,x,y) for(regist ...

  7. EntityFramework用法探索(八)事务处理

    使用 前文中描述的Retail示例 ,在Customer对象的Mapping中设置Name属性:我们构造一个有效的Customer对象,再构造一个无效的Name属性为空的对象. DomainModel ...

  8. sql 分页row_number() over(order by key)

    select * from ( select row_number() over(order by BD008_001) as row ,* from (select * from bd008)t ) ...

  9. Linux之Ubuntu安装搜狗输入法

    1.下载搜狗输入法安装包 搜狗官网:https://pinyin.sogou.com/linux/ 2.更新ubuntu内置的包管理器apt-get的软件源[如果中途安装失败,经常是此原因造成的] s ...

  10. UBUNTU18.04安装网易云音乐并直接图标启动

    这是一个网友改的程序,安装好以后把 ~/.cache/netcase-cloud-music 这个目录删除掉,就可以正常使用了,不用root权限