【数据结构】动态开点线段树

devtools/2024/9/20 13:42:31/

 

 

动态开点线段树 | henrytb's blog (henrytbtrue.github.io) 

算法学习笔记(49): 线段树的拓展 - 知乎 (zhihu.com)

星际旅行 终于拿到80pts啦

计算机软件能力认证考试系统

#include<iostream>
using namespace std;
#define ll long long
const ll N=100010;
const ll mod=1e9+7;
#define ll long longstruct Tree{
ll ls,rs;
ll len;
ll s[3];
ll k;ll mul[3];ll add[3];
}tr[4*3*N];ll idx=0;void rotatee(ll a[]){
ll temp=a[0];
a[0]=a[1];a[1]=a[2];a[2]=temp;}void eval(Tree& u,ll k){
k%=3;for(ll i=1;i<=k;i++){
rotatee(u.s);rotatee(u.mul);rotatee(u.add);
}
u.k=(u.k+k)%3;
}
void eval(Tree& u,ll a[],ll b[]){
for(ll i=0;i<3;i++){u.s[i]=(u.s[i]*a[i]%mod+b[i]*u.len%mod)%mod;u.mul[i]=(u.mul[i]*a[i])%mod;u.add[i]=(u.add[i]*a[i]%mod+b[i])%mod;
}}void pushup(Tree& u,Tree& l,Tree& r){
for(ll i=0;i<3;i++)u.s[i]=(l.s[i]+r.s[i])%mod;}void pushup(ll u){
pushup(tr[u],tr[tr[u].ls],tr[tr[u].rs]);
}void pushdown(Tree& u,Tree& l,Tree& r){
eval(l,u.k);eval(r,u.k);
eval(l,u.mul,u.add);eval(r,u.mul,u.add);
u.k=0;for(ll i=0;i<3;i++)u.mul[i]=1,u.add[i]=0;
}
void pushdown(ll u){pushdown(tr[u],tr[tr[u].ls],tr[tr[u].rs]);
}ll add(ll l,ll r){
ll u=++idx;
tr[u].ls=tr[u].rs=0;
tr[u].len=r-l+1;
tr[u].s[0]=tr[u].s[1]=tr[u].s[2]=0;
tr[u].k=0;for(ll i=0;i<3;i++)tr[u].mul[i]=1,tr[u].add[i]=0;
return u;
}void modify(ll& u,ll l,ll r,ll x,ll y,ll k,ll a[],ll b[]){
if(!u)u=add(l,r);
if(x<=l&&r<=y){eval(tr[u],k);eval(tr[u],a,b);return ;
}ll mid=(l+r)>>1;
if(!tr[u].ls)tr[u].ls=add(l,mid);
if(!tr[u].rs)tr[u].rs=add(mid+1,r);
pushdown(u);
if(x<=mid)modify(tr[u].ls,l,mid,x,y,k,a,b);
if(y>=mid+1)modify(tr[u].rs,mid+1,r,x,y,k,a,b);
pushup(u);
}Tree query(ll& u,ll l,ll r,ll x,ll y){
if(!u)u=add(l,r);
if(x<=l&&r<=y){return tr[u];
}ll mid=(l+r)>>1;
if(!tr[u].ls)tr[u].ls=add(l,mid);
if(!tr[u].rs)tr[u].rs=add(mid+1,r);
pushdown(u);
if(y<=mid)return query(tr[u].ls,l,mid,x,y);
else if(x>=mid+1)return query(tr[u].rs,mid+1,r,x,y);
else {Tree leftt=query(tr[u].ls,l,mid,x,y);Tree rightt=query(tr[u].rs,mid+1,r,x,y);Tree root;pushup(root,leftt,rightt);return root;
}}ll get_ans(ll s[]){ll res=0;
for(ll i=0;i<3;i++){res=(res+s[i]*s[i]%mod)%mod;
}
return res;
}
int  main(){ll n,m;
cin>>n>>m;ll root=0;
ll L=1;ll R=n+10;
while(m--){ll op;ll x,y;cin>>op>>x>>y;ll a[3]={1,1,1};ll b[3]={0,0,0};
if(op==1){cin>>b[0]>>b[1]>>b[2];modify(root,L,R,x,y,0,a,b);
}
else if(op==2){cin>>a[0];a[1]=a[2]=a[0];modify(root,L,R,x,y,0,a,b);
}
else if(op==3){modify(root,L,R,x,y,1,a,b);
}
else {cout<<get_ans(query(root,L,R,x,y).s)%mod<<endl;
}
}}


http://www.ppmy.cn/devtools/114538.html

相关文章

搜维尔科技:工程师已经解决OptiTrack捕捉过程中肘部不自然的弯曲

工程师已经解决OptiTrack捕捉过程中肘部不自然的弯曲 搜维尔科技&#xff1a;工程师已经解决OptiTrack捕捉过程中肘部不自然的弯曲

微服务下功能权限与数据权限的设计与实现

在微服务架构下&#xff0c;系统的功能权限和数据权限控制显得尤为重要。随着系统规模的扩大和微服务数量的增加&#xff0c;如何保证不同用户和服务之间的访问权限准确、细粒度地控制&#xff0c;成为设计安全策略的关键。本文将讨论如何在微服务体系中设计和实现功能权限与数…

【图像压缩与重构】基于标准+改进BP神经网络

课题名称&#xff1a;基于标准改进BP神经网络的图像压缩与重构&#xff08;带GUI) 代码获取方式(付费&#xff09;&#xff1a; 相关资料&#xff1a; 1. 代码注释 2.BP神经网络原理文档资料 3.图像压缩原理文档资料 程序实例截图&#xff1a; 1. 基于标准BP神经网络的图…

今日leetCode 18. 四数之和

18. 四数之和 给你一个由 n 个整数组成的数组 nums &#xff0c;和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] &#xff08;若两个四元组元素一一对应&#xff0c;则认为两个四元组重复&#xff09;&#xff…

leetcode hot100_part02_双指针

283.移动零 . - 力扣&#xff08;LeetCode&#xff09;&#xff1b;当前遍历位置不为0&#xff0c;左右指针一起前进&#xff0c;前进到为0的位置&#xff0c;左指针停下&#xff0c;右指针继续前进&#xff0c;右指针直到前进到第一个不为0的位置&#xff0c;然后交换&#x…

尚品汇-秒杀商品存入缓存、Redis发布订阅实现状态位(五十一)

目录&#xff1a; &#xff08;1&#xff09;秒杀业务分析 &#xff08;2&#xff09;搭建秒杀模块 &#xff08;3&#xff09;秒杀商品导入缓存 &#xff08;4&#xff09;redis发布与订阅实现 &#xff08;1&#xff09;秒杀业务分析 需求分析 所谓“秒杀”&#xff0…

计算机人工智能前沿进展-大语言模型方向-2024-09-13

计算机人工智能前沿进展-大语言模型方向-2024-09-13 1. OneEdit: A Neural-Symbolic Collaboratively Knowledge Editing System Authors: Ningyu Zhang, Zekun Xi, Yujie Luo, Peng Wang, Bozhong Tian, Yunzhi Yao, Jintian Zhang, Shumin Deng, Mengshu Sun, Lei Liang, Z…

【vue3】vue3.5

vue3.5是9.1发布的&#xff0c;还挺热乎的&#xff0c;赶快学习起来&#xff01;&#xff01;&#xff01; 组件属性结构解析赋值 组件属性结构解析赋值&#xff0c;高度提高开发体验&#xff0c;这个特性曾经在vue3.3提出过&#xff0c;然后3.4废弃&#xff0c;终于3.5稳定了。…