洛谷P4198 楼房重建
2024-10-11 17:32:38
题意:给定序列,每次修改一个值,求前缀最大值的个数。
解:线段树经典应用。
每个节点维护最大值和该区间前缀最大值个数。
发现我们不用下传标记,只需要合并区间。
需要实现一个函数int ask([l r] lm)求出区间[l r]中前一个数是lm时前缀最大值个数。
那么当lm >= large[ls]时,return ask([mid r] lm)
这个很好理解,左子区间的所有数都不会成为前缀最大值。
当lm < large[ls]时,return ask([l mid] lm) + (sum[o] - sum[ls])
这个注意,不是sum[rs]因为sum[rs]的意义是从0开始,而这个的前面会有large[ls]挡着,所以是sum[o] - sum[ls]
修改的时候先一路到底把large值改了。然后return的时候把沿途区间都更新。
具体来说就是sum[o] = ask([l r] 0)...等等,好像有问题。
lm < large[ls]的时候,求值是要调用sum[o]的,这不就循环调用导致出错了吗?
所以写成sum[o] = sum[ls] + ask([mid r] large[ls])即可。
本题不用建树。需要建树的时候就跟修改类似的写法即可。
#include <cstdio>
#include <algorithm> const int N = ; double a[N], large[N << ];
int n, sum[N << ]; int ask(int l, int r, int o, double lm) {
if(l == r) {
return (lm < a[r]);
}
int mid = (l + r) >> ;
if(lm > large[o << ]) {
return ask(mid + , r, o << | , lm);
}
else {
return sum[o] - sum[o << ] + ask(l, mid, o << , lm);
}
} void change(int p, double v, int l, int r, int o) {
if(l == r) {
large[o] = v;
sum[o] = ;
return;
}
int mid = (l + r) >> ;
if(p <= mid) {
change(p, v, l, mid, o << );
}
else {
change(p, v, mid + , r, o << | );
}
large[o] = std::max(large[o << ], large[o << | ]);
sum[o] = sum[o << ] + ask(mid + , r, o << | , large[o << ]);
return;
} int main() {
int m;
scanf("%d%d", &n, &m);
for(int i = , x, y; i <= m; i++) {
scanf("%d%d", &x, &y);
a[x] = (double)(y) / x;
change(x, a[x], , n, );
printf("%d\n", sum[]);
} return ;
}
AC代码
最新文章
- Chrome 中的彩蛋,一款小游戏,你知道吗?
- 动态主机配置协议(DHCP)如何启动和关闭
- 【JAVA】ConcurrentHashMap
- 第十八章:Android 打包部署
- 点餐系统web版功能需求
- MyEclipse启动失败
- SGU 101 修改
- jQuery查看dom元素上绑定的事件列表
- 吧php脚本打包成 exe程序
- bzoj3208
- LVS+Keepalived+Nginx+Tomcat高可用负载均衡集群配置(DR模式,一个VIP,多个端口)
- phpcms v9联动菜单实现筛选
- 常用的js对象扩展方法
- Nagios的客户端的安装
- xcode7,ios9 部分兼容设置
- ImCash:韩国最大交易所遭遇至暗时刻:2018年亏损1.8亿美元
- centos7配置consul
- 批处理-Java JDK环境变量配置
- 【Nowcoder71E】组一组(差分约束,最短路)
- hadoop常见面试题
热门文章
- 网络对抗技术 2017-2018-2 20152515 Exp3 免杀原理与实践
- vue 打包后,后缀名为.woff等字体问题不能用解决办法
- 利用RMAN转移裸设备到文件系统
- HTML 图像实例
- 计算机基础知识 一 Basic knowledge of computers One
- [翻译]:Cinemachine 官方文档(0)
- 【独家】K8S漏洞报告|近期bug fix解读&;1.11主要bug fix汇总
- CentOS7安装OpenStack(Rocky版)-01.控制节点的系统环境准备
- 统计学习方法c++实现之六 支持向量机(SVM)及SMO算法
- Nodejs如何把接收图片base64格式保存为文件存储到服务器上