个人Limitの线段树题单题解主目录:Limitの线段树题单 题解目录_HeartFireY的博客-CSDN博客
给定序列,要求支持单点修改,查询序列中 a [ i ] = s [ i − 1 ] a[i] = s[i - 1] a[i]=s[i−1] 的点(SPJ)
线段树维护 a i − s i − 1 a_i - s_{i - 1} ai−si−1的区间最大值,然后树上二分查询即可
洛谷传送门:CF992E Nastya and King-Shamans - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
CF传送门:E. Nastya and King-Shamans (codeforces.com)
题目分析首先考虑暴力解决:每次暴力检查所有的 a [ i ] a[i] a[i],需要检查 n n n个数字。
发现对于所有的 i i i,满足条件的一定不超过 log s n \log s_n logsn个:
-
因为对于满足条件的 i , a i − s i − 1 ≥ 0 i,a_i - s_{i - 1}≥0 i,ai−si−1≥0, 因此 s i ≥ 2 s i − 1 s_i ≥ 2s_{i - 1} si≥2si−1
-
故每有一个满足条件的 i i i, s s s就会翻倍。因此总共满足条件的不超过 log s n \log s_n logsn个
用线段树维护 a i − s i − 1 a_i - s_{i - 1} ai−si−1的区间最大值,由于查询的叶子节点不会超过 log s n \log s_n logsn故复杂度正确
- 单点修改操作等同于对前缀和后缀序列的区间修改及对原序列的单点修改,线段树支持区间修改即可
#include
#pragma gcc optimize("O2")
#pragma g++ optimize("O2")
#define int long long
#define endl '\n'
using namespace std;
const int N = 2e6 + 10, MOD = 1e9 + 7;
namespace ffastIO {
const int bufl = 1
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?