存档【线段树】

news/2024/10/17 20:34:19/

存一下写到一般的线段树

呃呃

1008-数据结构_2021秋季算法入门班第十一章习题:线段树、树状数组 (nowcoder.com)

#include <bits/stdc++.h>#define int long longusing namespace std;const int mxn=1e5+10;
const int mxe=1e5+10;
const int mod=1e9+7;
const int Inf=1e18;struct info{int sum;
};info operator+(const info &l,const info &r){info res;res.sum=l.sum+r.sum;return res;
}struct tag{int add,mul;
};struct Segtree{info val;tag t;
}tree[mxe<<2][3];
//1为区间和,2为区间平方和int N,M,op,l,r,x;
int a[mxn];void pushup(int rt){tree[rt][1].val=tree[rt<<1][1].val+tree[rt<<1|1][1].val;tree[rt][2].val=tree[rt<<1][2].val+tree[rt<<1|1][2].val;
}
void settag1(int rt,int tot){}
void settag2(int rt,int tot){}
void pushdown(int rt,int tot){for(int i=1;i<=2;i++){if(tree[rt][i].t.add!=0||tree[rt][i].t.mul!=1){if(i==1){settag1(rt<<1,tot-tot/2);settag1(rt<<1|1,tot/2);}else{settag2(rt<<1,tot-tot/2);settag2(rt<<1|1,tot/2);}tree[rt][i].t.add=0;tree[rt][i].t.mul=1;return;}}
}
void build(int rt,int l,int r){if(l==r){//tagtree[rt][1].t.add=tree[rt][2].t.add=0;tree[rt][1].t.mul=tree[rt][2].t.mul=1;//valtree[rt][1].val.sum=a[l];tree[rt][2].val.sum=a[l]*a[l];return;}int mid=l+r>>1;build(rt<<1,l,mid);build(rt<<1|1,mid+1,r);pushup(rt);
}
void modify(int rt,int l,int r,int x,int y,int k,int mode){if(x<=l&&r<=y){if(mode==1){//区间加settag1(rt,r-l+1);//1tree[rt][1].val.sum+=k*(r-l+1);//2tree[rt][2].val.sum=tree[rt][2].val.sum+2*k*tree[rt][1].val.sum+(r-l+1)*k*k;}else{//区间乘settag2(rt,r-l+1);//1tree[rt][1].val.sum*=k;//2tree[rt][2].val.sum*=k*k;}return;}pushdown(rt,r-l+1);int mid=l+r>>1;if(x<=mid) modify(rt<<1,l,mid,x,y,k,mode);if(y>mid) modify(rt<<1|1,mid+1,r,x,y,k,mode);pushup(rt);
}
info query(int rt,int l,int r,int x,int y,int mode){if(x<=l&&r<=y){if(mode==1){return tree[rt][1].val;}else{return tree[rt][2].val;}}pushdown(rt,r-l+1);int mid=l+r>>1;if(x>mid) return query(rt<<1|1,mid+1,y,x,y,mode);else if(y<=mid) return query(rt<<1,l,mid,x,y,mode);else{return query(rt<<1,l,mid,x,y,mode)+query(rt<<1|1,mid+1,r,x,y,mode);}
}
void solve(){cin>>N>>M;for(int i=1;i<=N;i++) cin>>a[i];build(1,1,N);while(M--){cin>>op;if(op==1){cin>>l>>r;cout<<query(1,1,N,l,r,1).sum<<'\n';}else if(op==2){cin>>l>>r;cout<<query(1,1,N,l,r,2).sum<<'\n';}else if(op==3){cin>>l>>r>>x;modify(1,1,N,l,r,x,2);}else{cin>>l>>r>>x;modify(1,1,N,l,r,x,1);}}
}
signed main(){ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);int __=1;//cin>>__;while(__--)solve();return 0;
}


http://www.ppmy.cn/news/798620.html

相关文章

pandas 缺失数据处理大全

本次来介绍关于缺失值数据处理的几个常用方法。 技术交流 技术要学会分享、交流&#xff0c;不建议闭门造车。一个人可以走的很快、一堆人可以走的更远。 本文由粉丝群小伙伴的分享、总结。文章源码、数据、技术交流提升&#xff0c;均可加交流群获取&#xff0c;群友已超过…

Jetpack compose——深入了解recomposition的工作原理

一、compose怎么 实现响应式编程的 Jetpack Compose 是 Android 的现代 UI 工具包&#xff0c;它使用 Kotlin 语言的声明式 UI 模式来简化 UI 开发。在这种模式中&#xff0c;你只需描述 UI 应该如何根据应用的状态进行显示&#xff0c;而 Compose 会在状态发生变化时自动更新…

文字磨练课程:提高编辑和校对效率的方法

提高编辑和校对效率&#xff0c;可以使你更有效地完成写作任务&#xff0c;提升文章质量。以下是一些方法&#xff0c;可以帮助你在编辑和校对过程中提高效率。 1.设定目标和计划 在开始编辑和校对前&#xff0c;设定明确的目标和计划。这可以帮助你集中注意力&#xff0c;提…

锐捷无线AC虚拟化配置-VAC

锐捷无线AC虚拟化配置 拓扑 AC使用WS板卡插在N18K上&#xff0c;AC使用内连口与核心交换机互联 规划好AC的优先级&#xff1a;优先级最高的在18K-1&#xff0c;次高的在18K-2&#xff0c;第3高的18K-1&#xff0c;最低的18K-2&#xff0c;这样分散开&#xff0c;这么做是为了…

Drcom下如何使用路由器上校园网并开启WIFI(以广东工业大学、极路由1S HC5661A为例)

免责声明&#xff1a; 在根据本教程进行实际操作时&#xff0c;如因您操作失误导致出现的一切意外&#xff0c;包括但不限于路由器变砖、故障、数据丢失等情况&#xff0c;概不负责&#xff1b;该技术仅供学习交流&#xff0c;请勿将此技术应用于任何商业行为&#xff0c;所产生…

华为AR1220路由器配置GRE隧道

华为AR1220路由器配置GRE隧道 1、概要 组网要求 AR1、AR2、AR3 属于VPN骨干网&#xff0c;它们之间执行OSPF协议。 AR2和AR3之间使用三层隧道协议&#xff0c;实现PC1和PC2互联。 PC1和PC2上分别指定AR2、AR3为自己的缺省网关 本示例设计路由器型号&#xff1a;华为AR1220 …

ensp 防火墙 USG6000V

1、启动防火墙USG6000V提示&#xff1a; 【解决方法】下载USG6000V的镜像并导入 下载地址&#xff1a;https://pan.baidu.com/s/1qeds31gHtJKOmm6rytqt5w 提取码&#xff1a;re80 2、USG6000V登录的默认账号和密码&#xff1a; 账号&#xff1a;admin…

AC66U-B1) 刷梅林固件教程

下载固件&#xff1a; 华硕ac6u和ac66u-B1用的是相同的固件&#xff0c;7.5版固件下载地址为http://firmware.koolshare.cn/Koolshare_Merlin_Legacy_380/ASUS/RT-AC66U_B1/ 升级固件 目前华硕路由器原厂固件支持刷第三方固件&#xff0c;因此我们只需要进入华硕路由器的后台…