POJ 3468 A Simple Problem with Integers(线段树成段更新)
题意:
1~n的数字,每次对其中一段进行增加和查询操作
思路:
1. 存储都要开成long long int
2. 延迟更新要注意:左右孩子加上父节点的值,而非等于父节点的值
3. 查询和增加操作都要进行延迟更新
#include <cstdio>
#define lhs l, m, rt << 1
#define rhs m + 1, r, rt << 1 | 1
const int maxn = 100010;
long long int seg[maxn << 2];
long long int col[maxn << 2];
void PushUp(int rt)
{
seg[rt] = seg[rt << 1] + seg[rt << 1 | 1];
}
void PushDown(int rt, int len)
{
if (col[rt])
{
col[rt << 1] += col[rt];
col[rt << 1 | 1] += col[rt];
seg[rt << 1] += (len - (len >> 1)) * col[rt];
seg[rt << 1 | 1] += (len >> 1) * col[rt];
col[rt] = 0;
}
}
void Build(int l, int r, int rt)
{
col[rt] = 0;
if (l == r)
scanf("%lld", &seg[rt]);
else
{
int m = (l + r) >> 1;
Build(lhs);
Build(rhs);
PushUp(rt);
}
}
void Update(int beg, int end, int value, int l, int r, int rt)
{
if (beg <= l && r <= end)
{
col[rt] += value;
seg[rt] += (r - l + 1) * value;
}
else
{
PushDown(rt, r - l + 1);
int m = (l + r) >> 1;
if (beg <= m)
Update(beg, end, value, lhs);
if (end > m)
Update(beg, end, value, rhs);
PushUp(rt);
}
}
long long int Query(int beg, int end, int l, int r, int rt)
{
if (beg <= l && r <= end)
return seg[rt];
PushDown(rt, r - l + 1);
long long int ret = 0;
int m = (l + r) >> 1;
if (beg <= m)
ret += Query(beg, end, lhs);
if (end > m)
ret += Query(beg, end, rhs);
return ret;
}
int main()
{
int n, q;
scanf("%d %d", &n, &q);
Build(1, n, 1);
for (int i = 0; i < q; ++i)
{
char op[8];
int a, b, c;
scanf("%s", op);
if (op[0] == 'Q')
{
scanf("%d %d", &a, &b);
printf("%lld\n", Query(a, b, 1, n, 1));
}
else if (op[0] == 'C')
{
scanf("%d %d %d", &a, &b, &c);
Update(a, b, c, 1, n, 1);
}
}
return 0;
}
-------------------------------------------------------
kedebug
Department of Computer Science and Engineering,
Shanghai Jiao Tong University
E-mail: kedebug0@gmail.com
GitHub: http://github.com/kedebug
-------------------------------------------------------
分类:
数据结构
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· Spring AI + Ollama 实现 deepseek-r1 的API服务和调用
· 数据库服务器 SQL Server 版本升级公告
· 程序员常用高效实用工具推荐,办公效率提升利器!
· C#/.NET/.NET Core技术前沿周刊 | 第 23 期(2025年1.20-1.26)