题意:给定序列,每次修改一个值,求前缀最大值的个数。

解:线段树经典应用。

每个节点维护最大值和该区间前缀最大值个数。

发现我们不用下传标记,只需要合并区间。

需要实现一个函数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代码

最新文章

  1. Chrome 中的彩蛋,一款小游戏,你知道吗?
  2. 动态主机配置协议(DHCP)如何启动和关闭
  3. 【JAVA】ConcurrentHashMap
  4. 第十八章:Android 打包部署
  5. 点餐系统web版功能需求
  6. MyEclipse启动失败
  7. SGU 101 修改
  8. jQuery查看dom元素上绑定的事件列表
  9. 吧php脚本打包成 exe程序
  10. bzoj3208
  11. LVS+Keepalived+Nginx+Tomcat高可用负载均衡集群配置(DR模式,一个VIP,多个端口)
  12. phpcms v9联动菜单实现筛选
  13. 常用的js对象扩展方法
  14. Nagios的客户端的安装
  15. xcode7,ios9 部分兼容设置
  16. ImCash:韩国最大交易所遭遇至暗时刻:2018年亏损1.8亿美元
  17. centos7配置consul
  18. 批处理-Java JDK环境变量配置
  19. 【Nowcoder71E】组一组(差分约束,最短路)
  20. hadoop常见面试题

热门文章

  1. 网络对抗技术 2017-2018-2 20152515 Exp3 免杀原理与实践
  2. vue 打包后,后缀名为.woff等字体问题不能用解决办法
  3. 利用RMAN转移裸设备到文件系统
  4. HTML 图像实例
  5. 计算机基础知识 一 Basic knowledge of computers One
  6. [翻译]:Cinemachine 官方文档(0)
  7. 【独家】K8S漏洞报告|近期bug fix解读&amp;1.11主要bug fix汇总
  8. CentOS7安装OpenStack(Rocky版)-01.控制节点的系统环境准备
  9. 统计学习方法c++实现之六 支持向量机(SVM)及SMO算法
  10. Nodejs如何把接收图片base64格式保存为文件存储到服务器上