【模板】分块
今天写分块的时候模板忘光了,故写以记之。
Code
Init
void init()
{
sz = sqrt(n), block = n / sz + (n % sz != 0);
for (int i = 1; i <= block; i ++)
st[i] = (i - 1) * sz + 1, ed[i] = i * sz;
ed[block] = n;
for (int i = 1; i <= block; i ++)
for (int j = st[i]; j <= ed[i]; j ++)
belong[j] = i;
}
其中块长视题目情况而改变,一般为 \(\sqrt n\)。
Modify / Query
void/int function(int x, int y)
{
int bx = belong[x], by = belong[y];
// pushdown(bx), pushdown(by); 根据题目情况而改变
if (by <= bx + 1) // 特判没有完整块的情况
{
for (int i = x; i <= y; i ++)
...;
return ...;
}
for (int i = x; i <= st[bx]; i ++) ...;
for (int i = st[by]; i <= y; i ++) ...;
for (int i = bx + 1; i <= by - 1; i ++) ...;
}
区间和
void modify(int x, int y, int k)
{
int bx = belong[x], by = belong[y];
if (by - bx <= 1)
{
for (int i = x; i <= y; i ++)
a[i] += k, sum[belong[i]] += k;
return;
}
for (int i = x; i <= ed[bx]; i ++) a[i] += k, sum[bx] += k;
for (int i = bx + 1; i <= by - 1; i ++) tag[i] += k;
for (int i = st[by]; i <= y; i ++) a[i] += k, sum[by] += k;
}
int query(int x, int y)
{
int bx = belong[x], by = belong[y];
if (by - bx <= 1)
{
int res = 0;
for (int i = x; i <= y; i ++) res += a[i] + tag[belong[i]];
return res;
}
int res = 0;
for (int i = x; i <= ed[bx]; i ++) res += a[i] + tag[bx];
for (int i = bx + 1; i <= by - 1; i ++)
res += sum[i] + tag[i] * (ed[i] - st[i] + 1);
for (int i = st[by]; i <= y; i ++) res += a[i] + tag[by];
return res;
}
标签:
笔记/模板
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探