势能线段树
简介
通过定义势能函数
例题
P4145 上帝造题的七分钟 2 / 花神游历各国
典。
设
一个元素不停的开根一定会变成
放在线段树上,维护区间最大值即可。
时间复杂度
代码:
namespace Segment_Tree {
#define mid (L + R) >> 1
#define son p, L, R
#define lson ls(p), L, (L + R) >> 1
#define rson rs(p), ((L + R) >> 1) + 1, R
int mx[N << 2], sum[N << 2];
inline int ls(int p) {
return p << 1;
}
inline int rs(int p) {
return p << 1 | 1;
}
inline void psup(int p) {
mx[p] = max(mx[ls(p)], mx[rs(p)]);
sum[p] = sum[ls(p)] + sum[rs(p)];
return ;
}
inline void build(int p = 1, int L = 1, int R = n) {
if(L == R) {
mx[p] = sum[p] = a[L];
return ;
}
build(lson), build(rson), psup(p);
return ;
}
inline void add(int l, int r, int p = 1, int L = 1, int R = n) {
if(mx[p] <= 1) return ;
if(L == R) {
sum[p] = sqrt(sum[p]);
mx[p] = sqrt(mx[p]);
return ;
}
if(l <= mid) add(l, r, lson);
if(r > mid) add(l, r, rson);
psup(p);
return ;
}
inline int query(int l, int r, int p = 1, int L = 1, int R = n) {
if(l <= L && R <= r) return sum[p];
int res = 0;
if(l <= mid) res += query(l, r, lson);
if(r > mid) res += query(l, r, rson);
return res;
}
#undef mid
#undef son
#undef lson
#undef rson
}
P9989 [Ynoi Easy Round 2023] TEST_69
Ynoi!不过是 Easy Round。
还是设
注意到每次有效操作至少会除去
在线段树上维护区间
时间复杂度
namespace Segment_Tree {
#define mid (L + R) >> 1
#define son p, L, R
#define lson ls(p), L, (L + R) >> 1
#define rson rs(p), ((L + R) >> 1) + 1, R
int sum[N << 2];
__int128 lcm[N << 2];
inline __int128 Lcm(__int128 x, __int128 y) {
return x / __gcd(x, y) * y;
}
inline int ls(int p) {
return p << 1;
}
inline int rs(int p) {
return p << 1 | 1;
}
inline void psup(int p) {
sum[p] = (sum[ls(p)] + sum[rs(p)]) % mod;
if(Lcm(lcm[ls(p)], lcm[rs(p)]) <= 1e18) lcm[p] = Lcm(lcm[ls(p)], lcm[rs(p)]);
else lcm[p] = 1e18;
return ;
}
inline void build(int p = 1, int L = 1, int R = n) {
if(L == R) {
sum[p] = lcm[p] = a[L];
return ;
}
build(lson), build(rson), psup(p);
return ;
}
inline void add(int l, int r, int k, int p = 1, int L = 1, int R = n) {
if(Lcm(lcm[p], k) == k) return ;
if(L == R) {
sum[p] = __gcd(sum[p], k);
lcm[p] = sum[p];
return ;
}
if(l <= mid) add(l, r, k, lson);
if(r > mid) add(l, r, k, rson);
psup(p);
return ;
}
inline int query(int l, int r, int p = 1, int L = 1, int R = n) {
if(l <= L && R <= r) return sum[p];
int res = 0;
if(l <= mid) res = (res + query(l, r, lson)) % mod;
if(r > mid) res = (res + query(l, r, rson)) % mod;
return res % mod;
}
#undef mid
#undef son
#undef lson
#undef rson
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
· PowerShell开发游戏 · 打蜜蜂
· 凌晨三点救火实录:Java内存泄漏的七个神坑,你至少踩过三个!