Ratio 的线段树
有不知名 HDK 在看马蜂识人的文章 里肆意诋毁我们维什戴尔玩家,写线段树居然用结构体,太可耻了😡😡,为此献上一份真实的 Ratio 的线段树马蜂。
大人,时代变了
过去
这是一棵维护单点修改,区间最大值、最小值以及区间和的标准线段树。
#include<bits/stdc++.h>
#define fo(x,y,z) for(register int (x)((y));(x)<=(z);(x)++)
using namespace std;
const int Ratio=0;
const int N=5e5+5;
int n,m;
int a[N],maxn[N<<2],minn[N<<2],sum[N<<2];
namespace Wisadel
{
#define ls (rt<<1)
#define rs (rt<<1|1)
#define mid ((l+r)>>1)
void Wpushup(int rt)
{
maxn[rt]=max(maxn[ls],maxn[rs]);
minn[rt]=min(minn[ls],minn[rs]);
sum[rt]=sum[ls]+sum[rs];
}
void Wbuild(int rt,int l,int r)
{
if(l==r)
{
maxn[rt]=minn[rt]=sum[rt]=a[l];
return;
}
Wbuild(ls,l,mid),Wbuild(rs,mid+1,r);
Wpushup(rt);
}
void Wupd(int rt,int l,int r,int x,int v)
{
if(l==r){maxn[rt]=minn[rt]=sum[rt]=v;return;}
if(x<=mid) Wupd(ls,l,mid,x,v);
else Wupd(rs,mid+1,r,x,v);
Wpushup(rt);
}
int Wqmax(int rt,int l,int r,int x,int y)
{
if(x<=l&&r<=y) return maxn[rt];
int res=-1e9;
if(x<=mid) res=max(res,Wqmax(ls,l,mid,x,y));
if(y>mid) res=max(res,Wqmax(rs,mid+1,r,x,y));
return res;
}
/*code*/
short main()
{
scanf("%d%d",&n,&m);
fo(i,1,n) scanf("%d",&a[i]);
Wbuild(1,1,n);
fo(i,1,m)
{
int op,aa,bb;scanf("%d%d%d",&op,&aa,&bb);
/*code*/
}
return Ratio;
}
}
int main(){return Wisadel::main();}
认准正版 Ratio 代码
- 采用 Wisadel 作为
namespace
名,实力的象征! - 线段数从不记区间边界,直接传参!
- 左右儿子和 mid 从不自己打,直接
define
! - 函数名前缀
W
,时刻将神放在心中!
如今:
由于被某道不知名模拟赛 D 题的超级线段树给了一拳,所以决定更改马蜂。
主要改变的地方是在运算符前后与变量相连的地方以及标点后添加了空格。
#include<bits/stdc++.h>
#define fo(x,y,z) for(register int (x)((y)); (x) <= (z); (x)++)
using namespace std;
const int Ratio = 0;
const int N = 5e5+5;
int n, m;
int a[N], maxn[N<<2], minn[N<<2], sum[N<<2];
namespace Wisadel
{
#define ls (rt << 1)
#define rs (rt << 1 | 1)
#define mid ((l + r) >> 1)
void Wpushup(int rt)
{
maxn[rt] = max(maxn[ls], maxn[rs]);
minn[rt] = min(minn[ls], minn[rs]);
sum[rt] = sum[ls] + sum[rs];
}
void Wbuild(int rt, int l, int r)
{
if(l == r)
{
maxn[rt] = minn[rt] = sum[rt] = a[l];
return ;
}
Wbuild(ls,l,mid), Wbuild(rs,mid+1,r);
Wpushup(rt);
}
void Wupd(int rt, int l, int r, int x, int v)
{
if(l == r){maxn[rt] = minn[rt] = sum[rt] = v; return ;}
if(x <= mid) Wupd(ls, l, mid, x, v);
else Wupd(rs, mid + 1, r, x, v);
Wpushup(rt);
}
int Wqmax(int rt, int l, int r, int x, int y)
{
if(x <= l && r <= y) return maxn[rt];
int res = -1e9;
if(x <= mid) res = max(res, Wqmax(ls, l, mid, x, y));
if(y > mid) res = max(res, Wqmax(rs, mid + 1, r, x, y));
return res;
}
/*code*/
short main()
{
scanf("%d%d", &n, &m);
fo(i, 1, n) scanf("%d", &a[i]);
Wbuild(1, 1, n);
fo(i, 1, m)
{
int op, aa, bb; scanf("%d%d%d", &op, &aa, &bb);
/*code*/
}
return Ratio;
}
}
int main(){return Wisadel::main();}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】