博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bzoj2957 楼房重建(线段树)
阅读量:4310 次
发布时间:2019-06-06

本文共 1154 字,大约阅读时间需要 3 分钟。

在杜教直播中得知2018多校第八场第10题和这个题很相近,所以先补这个题。

代码和思路借鉴了这篇博客:http://hzwer.com/6746.html。

这题是询问从原点能看到的楼房数目,首先对某一个点修改后,对之前的点没有影响,所以只需要处理后面的点,而后面的点分为两种情况:

1:查询区间的左半部分的最大值小于等于修改的值,这种情况不用管左半区间了,因为左半区间对答案更新没有影响,更新右半区间就行了。

2:左半区间的最大值大于修改的值,那么只用更新左半区间的值就行了,不影响右侧的贡献(右侧的贡献取决于左侧的最大值)。

代码:

#include
using namespace std;const int maxn=100010;struct node{ int l,r,cnt; double val;}t[4*maxn];void build(int o,int l,int r){ t[o].l=l,t[o].r=r; int mid=(l+r)>>1; if(l==r)return; build(o<<1,l,mid); build(o<<1|1,mid+1,r);}int cal(int o,double val){ int l=t[o].l,r=t[o].r; if(l==r)return t[o].val>val; if(t[o<<1].val<=val)return cal(o<<1|1,val); return t[o].cnt-t[o<<1].cnt+cal(o<<1,val);}void update(int o,int pos,double val){ int l=t[o].l,r=t[o].r,mid=(l+r)>>1; if(l==r){ t[o].cnt=1; t[o].val=val; return; } if(pos<=mid)update(o<<1,pos,val); else update(o<<1|1,pos,val); t[o].val=max(t[o<<1].val,t[o<<1|1].val); t[o].cnt=t[o<<1].cnt+cal(o<<1|1,t[o<<1].val);}int main(){ int n,m,x,y; scanf("%d%d",&n,&m); build(1,1,n); while(m--){ scanf("%d%d",&x,&y); update(1,x,(double)y/x); printf("%d\n",t[1].cnt); }}

  

转载于:https://www.cnblogs.com/pkgunboat/p/9492639.html

你可能感兴趣的文章
vnpy学习11_增加测试评估指标
查看>>
资金流入流出计算方法
查看>>
海龟交易法则07_如何衡量风险
查看>>
海龟交易法则08_风险与资金管理
查看>>
海龟交易法则09_海龟式积木
查看>>
海龟交易法则10_通用积木
查看>>
海龟交易法则14_掌控心魔
查看>>
海龟交易法则16_附原版海龟交易法则
查看>>
克罗谈投资策略01_期货交易中的墨菲法则
查看>>
克罗谈投资策略02_赢家和输家
查看>>
克罗谈投资策略03_你所期望的赌博方式
查看>>
克罗谈投资策略04_感觉与现实
查看>>
通向财务自由之路01_导读
查看>>
通向财务自由之路02_成功的决定因素:你
查看>>
中低频量化交易策略研发01_引言
查看>>
中低频量化交易策略研发06_推进的择时策略
查看>>
史丹·温斯坦称傲牛熊市的秘密
查看>>
期货市场技术分析01_理论基础
查看>>
期货市场技术分析02_趋势的基本概念
查看>>
期货市场技术分析03_主要反转形态
查看>>