bzoj2957:楼房重建
题意: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:楼房重建相关推荐
- [BZOJ2957]楼房重建
楼房重建 题解 很容易发现,一个楼房能够被看到当且仅当它前面的楼房的斜率都比它的小. 我们显然可以把斜率这东西离散化下来,当成一个权值,所以我们相当于要事实维护有多少个不同的前缀最大值. 首先这应该很 ...
- BZOJ2957:楼房重建(线段树)
Description 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子. 为了简化问题,我们考虑这些 ...
- BZOJ2957 楼房重建
Description 平面上有\(n\)个位置\(1\dots n\),第\(i\)个位置有一个高为\(H_i\)的楼房:所有\(H\)初始值为\(0\).每次修改一个\(H_i\),求修改后从\( ...
- BZOJ2957楼房重建
传送门 https://www.luogu.org/problemnew/show/P4198 蒟蒻渣渣禹看到这个题时十分不想写线段树emmmm 于是乎....分块!!! 分块.思路就是:如果一个楼 ...
- Bzoj2957: 楼房重建
题目 传送门 Sol 线段树,维护斜率单增的最高点和长度 更新,以下的都是指斜率 当前点的左儿子更新上来,右儿子递归 如果右儿子的左儿子的最大值大于左儿子的 加上算出右儿子的右儿子的贡献(右儿子贡献减 ...
- bzoj-2957 楼房重建
题意: 数轴上有n个楼,分别在1~n这些点上: m次查询.每次改变一个楼的高度,问从(0,0)这个点能够看到多少楼: 题解: 对于一个楼来说要想看到这个楼.那么前面的楼的斜率一定比这个楼小: 那么考虑 ...
- BZOJ 2957楼房重建
传送门 线段树 //Twenty #include<cstdio> #include<cstdlib> #include<iostream> #include< ...
- P4198 楼房重建 线段树 + 区间合并
传送门 文章目录 题意: 思路: 题意: 题面有点问题,按照人类正常的理解来就好啦. 思路: 可以想到维护每个位置的一个斜率,模拟的话就是从第一个位置开始向后选,当某个位置斜率大于当前位置的时候,答案 ...
- LG P4198 楼房重建(线段树)
LG P4198 楼房重建 Solution 基础的线段树题,虽然我还不熟练就是了. 大概就是单点修改,求全局的极大子序列. 我们需要维护一个区间最大值aaa和极大子序列长度sss. 合并xxx的左右 ...
- [luogu P4198] 楼房重建(线段树 + 思维)
luogu 楼房重建 problem solution code problem 洛谷链接 solution 非常巧妙的一道题,对线段树的运用很灵活. 显然这个与原点的连线可以想到将每个点转化为与原点 ...
最新文章
- 参加java培训真的能学到有用的吗
- 卧槽,别人家的黑客增长!
- 基于FPGA的异步FIFO设计
- 高级JAVA - 手写简单的重试组件学习Spring Retry
- json 潜逃 结构体_JSON还原为结构体
- 关于Nocas的几个问题
- “我觉得,这个项目只需要 2 个小时”
- 最优矩阵链乘(动态规划)
- android apn切换工具,Android修改和添加APN网络
- kernel下msm的版本信息
- 2 什么是计算机网络设置密码,怎么设置电脑网络密码
- Origin数据设置为日期/时间的方法
- 狂乱的潇洒主义者,频繁的追求自由者!
- 【原创-更新完毕】|日历拼图游戏的解决方案(C语言-进阶应用)-详解连载2
- WOL wake on lan 功能 nodejs android kotlin实现
- 笔记_配置IP测网络
- selenium 爬抖音
- Android procrank 使用以及原理
- 什么台灯护眼效果好?适合暑假学习护眼灯推荐
- 干货 | 携程机票前端安卓虚拟机测试集群建设实践
热门文章
- POJ 1861 Network
- Windows Phone 8 企业应用部署指南(二)
- CCNP中单区域OSPF详解(第一部分)
- 一个客户端刷新的例子
- mysql-创建函数,存储过程以及视图
- 青光眼-复内路粘小管成形术(ABiC)-转载
- Desktop: ERROR: Cannot set priority of namenode process 35122
- Error: Already running on PID 31356 (or pid file 'log/gunicorn.pid' is stale)
- Wine cannot find the ncurses library (libncurses.so.5)
- fill value must be in categories解决一例