【模板】线段树
1|0RT,本人自己写的线段树,支持区修区查和RMQ。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 | <code-pre class = "code-pre" id= "pre-4mb7be" ><code-line class = "line-numbers-rows" ></code-line> //By lzj <code-line class = "line-numbers-rows" ></code-line>#include <cstdio> <code-line class = "line-numbers-rows" ></code-line>#define ri register int <code-line class = "line-numbers-rows" ></code-line>#define ls p<<1 <code-line class = "line-numbers-rows" ></code-line>#define rs p<<1|1 <code-line class = "line-numbers-rows" ></code-line>#define int long long <code-line class = "line-numbers-rows" ></code-line>#define INF 1e15 <code-line class = "line-numbers-rows" ></code-line> using namespace std; <code-line class = "line-numbers-rows" ></code-line> <code-line class = "line-numbers-rows" ></code-line> const int N=1e6+15; <code-line class = "line-numbers-rows" ></code-line> <code-line class = "line-numbers-rows" ></code-line> struct node{ <code-line class = "line-numbers-rows" ></code-line> int l,r; <code-line class = "line-numbers-rows" ></code-line> int tag1,tag2; <code-line class = "line-numbers-rows" ></code-line> int sum,maxn,minn; <code-line class = "line-numbers-rows" ></code-line>}tree[N<<2]; <code-line class = "line-numbers-rows" ></code-line> <code-line class = "line-numbers-rows" ></code-line> inline int read(){ <code-line class = "line-numbers-rows" ></code-line> int f=1; int num=0; <code-line class = "line-numbers-rows" ></code-line> char ch= getchar (); <code-line class = "line-numbers-rows" ></code-line> while (ch< '0' ||ch> '9' ){f|=(ch== '-' ?-1:1);ch= getchar ();} <code-line class = "line-numbers-rows" ></code-line> while (ch>= '0' &&ch<= '9' ){num=(num<<1)+(num<<3)+(ch^48); ch= getchar ();} <code-line class = "line-numbers-rows" ></code-line> return num*f; <code-line class = "line-numbers-rows" ></code-line>} <code-line class = "line-numbers-rows" ></code-line> <code-line class = "line-numbers-rows" ></code-line> void write( int x) { <code-line class = "line-numbers-rows" ></code-line> if (x<0) putchar ( '-' ),x=-x; <code-line class = "line-numbers-rows" ></code-line> if (x>9) write(x/10); <code-line class = "line-numbers-rows" ></code-line> putchar (x%10+ '0' ); <code-line class = "line-numbers-rows" ></code-line>} <code-line class = "line-numbers-rows" ></code-line> <code-line class = "line-numbers-rows" ></code-line> int max( int a, int b){ <code-line class = "line-numbers-rows" ></code-line> return a>b?a:b; <code-line class = "line-numbers-rows" ></code-line>} <code-line class = "line-numbers-rows" ></code-line> <code-line class = "line-numbers-rows" ></code-line> int min( int a, int b){ <code-line class = "line-numbers-rows" ></code-line> return a<b?a:b; <code-line class = "line-numbers-rows" ></code-line>} <code-line class = "line-numbers-rows" ></code-line> <code-line class = "line-numbers-rows" ></code-line> int n,q,op,x,y,z; <code-line class = "line-numbers-rows" ></code-line> int a[N]; <code-line class = "line-numbers-rows" ></code-line> <code-line class = "line-numbers-rows" ></code-line> void pushup( int p){ <code-line class = "line-numbers-rows" ></code-line> tree[p].sum=tree[ls].sum+tree[rs].sum; <code-line class = "line-numbers-rows" ></code-line> tree[p].maxn=max(tree[ls].maxn,tree[rs].maxn); <code-line class = "line-numbers-rows" ></code-line> tree[p].minn=min(tree[ls].minn,tree[rs].minn); <code-line class = "line-numbers-rows" ></code-line>} <code-line class = "line-numbers-rows" ></code-line> <code-line class = "line-numbers-rows" ></code-line> void pushdown( int p){ <code-line class = "line-numbers-rows" ></code-line> if (tree[p].tag1!=-INF){ <code-line class = "line-numbers-rows" ></code-line> tree[ls].tag1=tree[rs].tag1=tree[p].tag1; <code-line class = "line-numbers-rows" ></code-line> tree[ls].maxn=tree[p].tag1; <code-line class = "line-numbers-rows" ></code-line> tree[rs].maxn=tree[p].tag1; <code-line class = "line-numbers-rows" ></code-line> tree[ls].minn=tree[p].tag1; <code-line class = "line-numbers-rows" ></code-line> tree[rs].minn=tree[p].tag1; <code-line class = "line-numbers-rows" ></code-line> tree[ls].sum=tree[p].tag1*(tree[ls].r-tree[ls].l+1); <code-line class = "line-numbers-rows" ></code-line> tree[rs].sum=tree[p].tag1*(tree[rs].r-tree[rs].l+1); <code-line class = "line-numbers-rows" ></code-line> tree[ls].tag2=tree[rs].tag2=0; <code-line class = "line-numbers-rows" ></code-line> tree[p].tag1=-INF; <code-line class = "line-numbers-rows" ></code-line> } <code-line class = "line-numbers-rows" ></code-line> if (tree[p].tag2){ <code-line class = "line-numbers-rows" ></code-line> tree[ls].tag2+=tree[p].tag2; <code-line class = "line-numbers-rows" ></code-line> tree[rs].tag2+=tree[p].tag2; <code-line class = "line-numbers-rows" ></code-line> tree[ls].maxn+=tree[p].tag2; <code-line class = "line-numbers-rows" ></code-line> tree[rs].maxn+=tree[p].tag2; <code-line class = "line-numbers-rows" ></code-line> tree[ls].minn+=tree[p].tag2; <code-line class = "line-numbers-rows" ></code-line> tree[rs].minn+=tree[p].tag2; <code-line class = "line-numbers-rows" ></code-line> tree[ls].sum+=tree[p].tag2*(tree[ls].r-tree[ls].l+1); <code-line class = "line-numbers-rows" ></code-line> tree[rs].sum+=tree[p].tag2*(tree[rs].r-tree[rs].l+1); <code-line class = "line-numbers-rows" ></code-line> tree[p].tag2=0; <code-line class = "line-numbers-rows" ></code-line> } <code-line class = "line-numbers-rows" ></code-line>} <code-line class = "line-numbers-rows" ></code-line> <code-line class = "line-numbers-rows" ></code-line> void build( int p, int l, int r){ <code-line class = "line-numbers-rows" ></code-line> tree[p].l=l;tree[p].r=r; tree[p].tag1=-INF;tree[p].tag2=0; <code-line class = "line-numbers-rows" ></code-line> if (l==r){ <code-line class = "line-numbers-rows" ></code-line> tree[p].sum=tree[p].minn=tree[p].maxn=a[l]; return ; <code-line class = "line-numbers-rows" ></code-line> } <code-line class = "line-numbers-rows" ></code-line> int mid=(l+r)>>1; <code-line class = "line-numbers-rows" ></code-line> build(ls,l,mid); <code-line class = "line-numbers-rows" ></code-line> build(rs,mid+1,r); <code-line class = "line-numbers-rows" ></code-line> pushup(p); <code-line class = "line-numbers-rows" ></code-line>} <code-line class = "line-numbers-rows" ></code-line> <code-line class = "line-numbers-rows" ></code-line> void update1( int p, int l, int r, int delta){ <code-line class = "line-numbers-rows" ></code-line> if (l<=tree[p].l&&tree[p].r<=r){ <code-line class = "line-numbers-rows" ></code-line> tree[p].sum=delta*(tree[p].r-tree[p].l+1); <code-line class = "line-numbers-rows" ></code-line> tree[p].maxn=tree[p].minn=delta; <code-line class = "line-numbers-rows" ></code-line> tree[p].tag1=delta; <code-line class = "line-numbers-rows" ></code-line> tree[p].tag2=0; <code-line class = "line-numbers-rows" ></code-line> return ; <code-line class = "line-numbers-rows" ></code-line> } <code-line class = "line-numbers-rows" ></code-line> pushdown(p); <code-line class = "line-numbers-rows" ></code-line> int mid=(tree[p].l+tree[p].r)>>1; <code-line class = "line-numbers-rows" ></code-line> if (l<=mid) update1(ls,l,r,delta); <code-line class = "line-numbers-rows" ></code-line> if (r>mid) update1(rs,l,r,delta); <code-line class = "line-numbers-rows" ></code-line> pushup(p); <code-line class = "line-numbers-rows" ></code-line>} <code-line class = "line-numbers-rows" ></code-line> <code-line class = "line-numbers-rows" ></code-line> void update2( int p, int l, int r, int delta){ <code-line class = "line-numbers-rows" ></code-line> if (l<=tree[p].l&&tree[p].r<=r){ <code-line class = "line-numbers-rows" ></code-line> tree[p].maxn+=delta; <code-line class = "line-numbers-rows" ></code-line> tree[p].minn+=delta; <code-line class = "line-numbers-rows" ></code-line> tree[p].sum+=(tree[p].r-tree[p].l+1)*delta; <code-line class = "line-numbers-rows" ></code-line> tree[p].tag2+=delta; <code-line class = "line-numbers-rows" ></code-line> return ; <code-line class = "line-numbers-rows" ></code-line> } <code-line class = "line-numbers-rows" ></code-line> pushdown(p); <code-line class = "line-numbers-rows" ></code-line> int mid=(tree[p].l+tree[p].r)>>1; <code-line class = "line-numbers-rows" ></code-line> if (l<=mid) update2(ls,l,r,delta); <code-line class = "line-numbers-rows" ></code-line> if (r>mid) update2(rs,l,r,delta); <code-line class = "line-numbers-rows" ></code-line> pushup(p); <code-line class = "line-numbers-rows" ></code-line>} <code-line class = "line-numbers-rows" ></code-line> <code-line class = "line-numbers-rows" ></code-line> int qmax( int p, int l, int r){ <code-line class = "line-numbers-rows" ></code-line> if (l<=tree[p].l&&tree[p].r<=r){ <code-line class = "line-numbers-rows" ></code-line> return tree[p].maxn; <code-line class = "line-numbers-rows" ></code-line> } <code-line class = "line-numbers-rows" ></code-line> pushdown(p); <code-line class = "line-numbers-rows" ></code-line> int mid=(tree[p].l+tree[p].r)>>1,val=-INF; <code-line class = "line-numbers-rows" ></code-line> if (l<=mid) val=max(val,qmax(ls,l,r)); <code-line class = "line-numbers-rows" ></code-line> if (r>mid) val=max(val,qmax(rs,l,r)); <code-line class = "line-numbers-rows" ></code-line> return val; <code-line class = "line-numbers-rows" ></code-line>} <code-line class = "line-numbers-rows" ></code-line> <code-line class = "line-numbers-rows" ></code-line> int qmin( int p, int l, int r){ <code-line class = "line-numbers-rows" ></code-line> if (l<=tree[p].l&&tree[p].r<=r){ <code-line class = "line-numbers-rows" ></code-line> return tree[p].minn; <code-line class = "line-numbers-rows" ></code-line> } <code-line class = "line-numbers-rows" ></code-line> pushdown(p); <code-line class = "line-numbers-rows" ></code-line> int mid=(tree[p].l+tree[p].r)>>1,val=INF; <code-line class = "line-numbers-rows" ></code-line> if (l<=mid) val=min(val,qmin(ls,l,r)); <code-line class = "line-numbers-rows" ></code-line> if (r>mid) val=min(val,qmin(rs,l,r)); <code-line class = "line-numbers-rows" ></code-line> return val; <code-line class = "line-numbers-rows" ></code-line>} <code-line class = "line-numbers-rows" ></code-line> <code-line class = "line-numbers-rows" ></code-line> int query( int p, int l, int r){ <code-line class = "line-numbers-rows" ></code-line> if (l<=tree[p].l&&tree[p].r<=r){ <code-line class = "line-numbers-rows" ></code-line> return tree[p].sum; <code-line class = "line-numbers-rows" ></code-line> } <code-line class = "line-numbers-rows" ></code-line> pushdown(p); <code-line class = "line-numbers-rows" ></code-line> int mid=(tree[p].l+tree[p].r)>>1,val=0; <code-line class = "line-numbers-rows" ></code-line> if (l<=mid) val+=query(ls,l,r); <code-line class = "line-numbers-rows" ></code-line> if (r>mid) val+=query(rs,l,r); <code-line class = "line-numbers-rows" ></code-line> return val; <code-line class = "line-numbers-rows" ></code-line>} <code-line class = "line-numbers-rows" ></code-line> <code-line class = "line-numbers-rows" ></code-line> signed main(){ <code-line class = "line-numbers-rows" ></code-line> n=read(); q=read(); <code-line class = "line-numbers-rows" ></code-line> for (ri i=1;i<=n;i++) a[i]=read(); <code-line class = "line-numbers-rows" ></code-line> build(1,1,n); <code-line class = "line-numbers-rows" ></code-line> while (q--){ <code-line class = "line-numbers-rows" ></code-line> op=read(); <code-line class = "line-numbers-rows" ></code-line> if (op==1){ <code-line class = "line-numbers-rows" ></code-line> x=read(); y=read(); z=read(); <code-line class = "line-numbers-rows" ></code-line> update1(1,x,y,z); <code-line class = "line-numbers-rows" ></code-line> } <code-line class = "line-numbers-rows" ></code-line> if (op==2){ <code-line class = "line-numbers-rows" ></code-line> x=read(); y=read(); z=read(); <code-line class = "line-numbers-rows" ></code-line> update2(1,x,y,z); <code-line class = "line-numbers-rows" ></code-line> } <code-line class = "line-numbers-rows" ></code-line> if (op==3){ <code-line class = "line-numbers-rows" ></code-line> x=read(); y=read(); <code-line class = "line-numbers-rows" ></code-line> write(qmax(1,x,y)); <code-line class = "line-numbers-rows" ></code-line> putchar ( '\n' ); <code-line class = "line-numbers-rows" ></code-line> } <code-line class = "line-numbers-rows" ></code-line> if (op==4){ <code-line class = "line-numbers-rows" ></code-line> x=read(); y=read(); <code-line class = "line-numbers-rows" ></code-line> write(qmin(1,x,y)); <code-line class = "line-numbers-rows" ></code-line> putchar ( '\n' ); <code-line class = "line-numbers-rows" ></code-line> } <code-line class = "line-numbers-rows" ></code-line> if (op==5){ <code-line class = "line-numbers-rows" ></code-line> x=read(); y=read(); <code-line class = "line-numbers-rows" ></code-line> write(query(1,x,y)); <code-line class = "line-numbers-rows" ></code-line> putchar ( '\n' ); <code-line class = "line-numbers-rows" ></code-line> } <code-line class = "line-numbers-rows" ></code-line> } <code-line class = "line-numbers-rows" ></code-line> return 0; <code-line class = "line-numbers-rows" ></code-line>} </code-pre> |
__EOF__

本文作者:TheSky233
本文链接:https://www.cnblogs.com/TheSky233/p/16058522.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
本文链接:https://www.cnblogs.com/TheSky233/p/16058522.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现