当前位置: 首页 > news >正文

[JSK]区间平方和

[JSK]区间平方和

大意

需要完成区间修改和区间查询平方和的功能。

思路

首先我们考虑用线段树维护,然后想想 pushup 和 pushdown 怎么写?

定义:
sum, sumq
显然有 pushup:

t[u].sum = t[lc].sum + t[rc].sum;
t[u].sumq = t[lc].sumq + t[rc].sumq;

然后考虑 pushdown,若是对于一段区间全部加上 \(k\) 会发生什么?

不妨设区间长度为 \(2\),即 \(a, b\),原 \(\text{sumq} = a ^ 2 + b ^ 2\),现在为 \((a + k) ^ 2 + (b + k) ^ 2 = a ^ 2 + b ^ 2 + 2ak + 2bk + 2k^2 = a ^ 2 + b ^ 2 + 2k(a + b) + 2 k^2\)
\(a + b = \text{sum}\),即 \(\text{sum} + k ^ 2 \times \text{len} + 2 \times \text{sum} \times k\) 故我们有 pushdown 如下:

if(t[u].add){t[lc].sumq += (t[u].add * t[u].add * (t[lc].r - t[lc].l + 1) + 2  * t[lc].sum * t[u].add);t[rc].sumq += (t[u].add * t[u].add * (t[rc].r - t[rc].l + 1) + 2  * t[rc].sum * t[u].add);t[lc].sum += t[u].add * (t[lc].r - t[lc].l + 1);t[rc].sum += t[u].add * (t[rc].r - t[rc].l + 1);t[lc].add += t[u].add;t[rc].add += t[u].add;t[u].add = 0;
}

然后就没了。

代码

#include<iostream>
using namespace std;#define lc u << 1
#define rc u << 1 | 1const int MAXN = 1e5 + 5;struct node{int l, r;long long add;long long sum, sumq;
}t[MAXN * 4];void pushup(int u){t[u].sum = t[lc].sum + t[rc].sum;t[u].sumq = t[lc].sumq + t[rc].sumq;
}// a ^ 2 + b ^ 2 + c ^ 2
//     (a + k) ^ 2 + (b + k) ^ 2 + (c + k) ^ 2
//     += k ^ 2 * len + 2 * sum * kvoid pushdown(int u){if(t[u].add){t[lc].sumq += (t[u].add * t[u].add * (t[lc].r - t[lc].l + 1) + 2  * t[lc].sum * t[u].add);t[rc].sumq += (t[u].add * t[u].add * (t[rc].r - t[rc].l + 1) + 2  * t[rc].sum * t[u].add);t[lc].sum += t[u].add * (t[lc].r - t[lc].l + 1);t[rc].sum += t[u].add * (t[rc].r - t[rc].l + 1);t[lc].add += t[u].add;t[rc].add += t[u].add;t[u].add = 0;}
}void build(int u, int l, int r){t[u] = {l, r, 0, 0, 0};if(l == r) return;int mid = (l & r) + ((l ^ r) >> 1);build(lc, l, mid);build(rc, mid + 1, r);pushup(u);
}void update(int u, int l, int r, int k){if(l <= t[u].l && t[u].r <= r){t[u].add += k;t[u].sumq += (2 * k * t[u].sum + k * k * (t[u].r - t[u].l + 1));t[u].sum += k * (t[u].r - t[u].l + 1);return;}int mid = (t[u].l & t[u].r) + ((t[u].l ^ t[u].r) >> 1);pushdown(u);if(l <= mid){update(lc, l, r, k);}if(r > mid){update(rc, l, r, k);}pushup(u);
}long long query(int u, int l, int r){if(l <= t[u].l && t[u].r <= r){return t[u].sumq;}int mid = (t[u].l & t[u].r) + ((t[u].l ^ t[u].r) >> 1);pushdown(u);long long ans = 0;if(l <= mid){ans += query(lc, l, r);}if(r > mid){ans += query(rc, l, r);}return ans;
}int n, m;int main(){ios::sync_with_stdio(0);cin.tie(0);cin >> n >> m;build(1, 1, n);for(int i = 1;i <= m;i ++){string op;int l, r, k;cin >> op;if(op == "Update"){cin >> l >> r >> k;update(1, l, r, k);}else{cin >> l >> r;cout << query(1, l, r) << '\n';}}return 0;
}
http://www.jsqmd.com/news/78909/

相关文章:

  • 基于web的二手书交易平台设计与实现
  • YashanDB数据库的多维度安全防护体系
  • GBase 8a数据库集群硬件部署安装建议
  • RAD Studio 13 Florence:C++、Delphi现代化与AI驱动的跨平台开发新范式
  • 在Replicate上部署与微调大型语言模型
  • 基于web的二手书交易平台设计与实现开题报告
  • YashanDB数据库的多维度安全审计体系解析
  • 基于Web的房屋租赁信息平台的设计与实现开题报告
  • GBase 8a数据库多实例部署流程简介
  • 智能视频生成新纪元:双帧驱动下的创意革命
  • YashanDB数据库的多维扩展能力与性能提升路径
  • 如何快速上手GLM-4-9B:智谱AI最新开源大语言模型完整指南
  • 如何快速掌握ISO20000标准:信息技术服务管理体系终极指南
  • GBase 8a数据库NUMA绑定建议
  • COMSOL模拟:单场耦合下的注二氧化碳驱替甲烷模型研究
  • GBase数据库护航国家管网SCADA系统四年无中断平稳运行
  • FunASR语音识别模型部署实战:从训练到生产的完整指南
  • RulersGuides.js:网页上的Photoshop式辅助线和标尺工具
  • 一文搞定 AI 智能体架构设计的9大核心技术
  • 3分钟搞定!FlashAI通义千问大模型本地部署完整指南
  • IDEA(2020版)实现HttpServletResponse对象
  • DAY 37 GPU训练及类的call方法
  • YYEVA动态MP4播放器:让视频资源真正“动“起来
  • Activiti流程引擎终极指南:从零开始掌握企业级工作流开发
  • GBase 8a数据库统一平台(UP)引擎介绍
  • MATLAB环境下一维时间序列信号的欠定盲源分离方法(基于L1范数最小化算法)
  • Vuetify终极指南:从零构建企业级Vue应用的完整教程
  • Draco 3D压缩技术:如何让你的3D模型体积缩小90%?
  • BLDC直流无刷电机FOC控制:多层次架构的电机驱动与精确控制的探索实践
  • 如何快速掌握YOLOv12:实时目标检测的完整实践指南