当前位置: 首页 > article >正文

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

 

 

动态开点线段树 | 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 long

struct 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.kler.cn/a/311888.html

相关文章:

  • 后端:Aop 面向切面编程
  • 常见error集合
  • 【LeetCode】【算法】23. 合并K个升序链表
  • 异步提交Django
  • 【前端】HTML标签汇总
  • SpringBoot单体服务无感更新启动,动态检测端口号并动态更新
  • 基于Android Studio 蜜雪冰城(奶茶饮品点餐)—原创
  • Java ERP系统源码深度解析:Spring Cloud Alibaba和Spring Boot的微服务实战
  • 云WAF能做什么?看它如何帮你应对网络攻击
  • 武汉网站建设实施方案
  • 猫咪为什么不吃猫罐头?解决挑食小猫!美味主食罐推荐!
  • 2.4 数据库表字段约束
  • 水经微图PC版5.0.0即将内测
  • MATLAB数学规划:2.线性规划
  • 分享一个 在线拍卖系统 商品竞拍平台Java、python、php三个技术版本(源码、调试、LW、开题、PPT)
  • MATLAB系列03:分支语句和编程设计
  • 指挥中心操作台怎么布局更合理
  • Can‘t connect to local MySQL server through socket
  • 【线性规划求解系列】MATLAB中使用linprog解决线性规划问题
  • 【学术会议:中国杭州,机器学习和计算机应用面临的新的挑战问题和研究方向】第五届机器学习与计算机应用国际学术会议(ICMLCA 2024)
  • 大数据-141 - ClickHouse 集群 副本和分片 Zk 的配置 Replicated MergeTree原理详解
  • Linux 环境永久更换国内pip镜像源地址
  • 【MySQL】表的相关操作
  • 你敢相信吗,我用AI撸了一个在线计算器网站!
  • ElasticSearch7整合es-head,ES配置密码
  • 微软 Azure AI 服务免费试用及申请:语音识别、文本转语音、基于视觉、语言处理、文档分析等10大场景