题意:http://www.lydsy.com/JudgeOnline/problem.php?id=2957

sol  :首先考虑转化问题,即给你一个斜率序列,让你动态维护单调栈

   考虑线段树,令get(x,r)表示以r为初值在节点x时会增加多少个数

   递归处理,get(x,r)=get(lson[x],r)+get(rson[x],max(mx[lson[x]],r))

   然而这样复杂度是爆炸的.....考虑预处理get(rson[x],mx[lson[x]])

   这样的话每次查询答案分为以下情况

     mx[lson[x]]>=r,这样的话右边已经预处理好了,递归左边即可

     mx[lson[x]]<r,这样的话左边的贡献为0,递归右边即可

   那么我们只需维护get(rson[x],mx[lson[x]])即可

   对于每次将位置pos修改为val,仅会对其右侧产生影响,分为以下情况

     若val<=mx[lson[x]],则对get(rson[x],mx[lson[x]])无影响

     若val>mx[lson[x]],那么递归进右边处理

   最终复杂度O(n*log^2)

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
const int Mx=400010;
int n,m,l[Mx],r[Mx],lson[Mx],rson[Mx],ans[Mx];
double maxn[Mx];void build(int x,int L,int R)
{l[x]=L,r[x]=R;lson[x]=x*2,rson[x]=x*2+1;if(L==R) return ;int mid=(L+R)/2;build(lson[x],L,mid);build(rson[x],mid+1,R);
}int cal(int x,double val)
{int L=l[x],R=r[x];if(L==R) return maxn[x]>val;if(maxn[lson[x]]<=val) return cal(rson[x],val);return ans[x]-ans[lson[x]]+cal(lson[x],val);
}void change(int x,int pos,double c)
{int L=l[x],R=r[x],mid=(L+R)/2;if(L==R) { ans[x]=1,maxn[x]=c; return ; }if(pos<=mid) change(lson[x],pos,c);else change(rson[x],pos,c);maxn[x]=max(maxn[lson[x]],maxn[rson[x]]);ans[x]=ans[lson[x]]+cal(rson[x],maxn[lson[x]]);
}int main()
{scanf("%d%d",&n,&m);build(1,1,n);for(int i=1,x,y;i<=m;i++){scanf("%d%d",&x,&y);change(1,x,(double) y/x);printf("%d\n",ans[1]);}return 0;
}

转载于:https://www.cnblogs.com/xiaoxubi/p/6632671.html

bzoj2957:楼房重建相关推荐

  1. [BZOJ2957]楼房重建

    楼房重建 题解 很容易发现,一个楼房能够被看到当且仅当它前面的楼房的斜率都比它的小. 我们显然可以把斜率这东西离散化下来,当成一个权值,所以我们相当于要事实维护有多少个不同的前缀最大值. 首先这应该很 ...

  2. BZOJ2957:楼房重建(线段树)

    Description 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子. 为了简化问题,我们考虑这些 ...

  3. BZOJ2957 楼房重建

    Description 平面上有\(n\)个位置\(1\dots n\),第\(i\)个位置有一个高为\(H_i\)的楼房:所有\(H\)初始值为\(0\).每次修改一个\(H_i\),求修改后从\( ...

  4. BZOJ2957楼房重建

    传送门  https://www.luogu.org/problemnew/show/P4198 蒟蒻渣渣禹看到这个题时十分不想写线段树emmmm 于是乎....分块!!! 分块.思路就是:如果一个楼 ...

  5. Bzoj2957: 楼房重建

    题目 传送门 Sol 线段树,维护斜率单增的最高点和长度 更新,以下的都是指斜率 当前点的左儿子更新上来,右儿子递归 如果右儿子的左儿子的最大值大于左儿子的 加上算出右儿子的右儿子的贡献(右儿子贡献减 ...

  6. bzoj-2957 楼房重建

    题意: 数轴上有n个楼,分别在1~n这些点上: m次查询.每次改变一个楼的高度,问从(0,0)这个点能够看到多少楼: 题解: 对于一个楼来说要想看到这个楼.那么前面的楼的斜率一定比这个楼小: 那么考虑 ...

  7. BZOJ 2957楼房重建

    传送门 线段树 //Twenty #include<cstdio> #include<cstdlib> #include<iostream> #include< ...

  8. P4198 楼房重建 线段树 + 区间合并

    传送门 文章目录 题意: 思路: 题意: 题面有点问题,按照人类正常的理解来就好啦. 思路: 可以想到维护每个位置的一个斜率,模拟的话就是从第一个位置开始向后选,当某个位置斜率大于当前位置的时候,答案 ...

  9. LG P4198 楼房重建(线段树)

    LG P4198 楼房重建 Solution 基础的线段树题,虽然我还不熟练就是了. 大概就是单点修改,求全局的极大子序列. 我们需要维护一个区间最大值aaa和极大子序列长度sss. 合并xxx的左右 ...

  10. [luogu P4198] 楼房重建(线段树 + 思维)

    luogu 楼房重建 problem solution code problem 洛谷链接 solution 非常巧妙的一道题,对线段树的运用很灵活. 显然这个与原点的连线可以想到将每个点转化为与原点 ...

最新文章

  1. 参加java培训真的能学到有用的吗
  2. 卧槽,别人家的黑客增长!
  3. 基于FPGA的异步FIFO设计
  4. 高级JAVA - 手写简单的重试组件学习Spring Retry
  5. json 潜逃 结构体_JSON还原为结构体
  6. 关于Nocas的几个问题
  7. “我觉得,这个项目只需要 2 个小时”
  8. 最优矩阵链乘(动态规划)
  9. android apn切换工具,Android修改和添加APN网络
  10. kernel下msm的版本信息
  11. 2 什么是计算机网络设置密码,怎么设置电脑网络密码
  12. Origin数据设置为日期/时间的方法
  13. 狂乱的潇洒主义者,频繁的追求自由者!
  14. 【原创-更新完毕】|日历拼图游戏的解决方案(C语言-进阶应用)-详解连载2
  15. WOL wake on lan 功能 nodejs android kotlin实现
  16. 笔记_配置IP测网络
  17. selenium 爬抖音
  18. Android procrank 使用以及原理
  19. 什么台灯护眼效果好?适合暑假学习护眼灯推荐
  20. 干货 | 携程机票前端安卓虚拟机测试集群建设实践

热门文章

  1. POJ 1861 Network
  2. Windows Phone 8 企业应用部署指南(二)
  3. CCNP中单区域OSPF详解(第一部分)
  4. 一个客户端刷新的例子
  5. mysql-创建函数,存储过程以及视图
  6. 青光眼-复内路粘小管成形术(ABiC)-转载
  7. Desktop: ERROR: Cannot set priority of namenode process 35122
  8. Error: Already running on PID 31356 (or pid file 'log/gunicorn.pid' is stale)
  9. Wine cannot find the ncurses library (libncurses.so.5)
  10. fill value must be in categories解决一例