题目链接

题目

题目描述

因为上次在月月面前丢人了,所以华华决定开始学信息学。十分钟后,他就开始学树状数组了。这是一道树状数组的入门题:

给定一个长度为 \(N\) 的序列 \(A\) ,所有元素初值为 \(0\) 。接下来有 \(M\) 次操作或询问:

操作:输入格式:1 D K,将 \(A_D\) 加上 \(K\) 。

询问:输入格式:2 L R,询问区间和,即 \(\sum_{i=L}^{R}A_i\) 。

华华很快就学会了树状数组并通过了这道题。月月也很喜欢树状数组,于是给华华出了一道进阶题:

给定一个长度为 \(N\) 的序列 \(A\) ,所有元素初值为 \(0\) 。接下来有 \(M\) 次操作或询问:

操作:输入格式:1 D K,对于所有满足 \(1\le i\le N\) 且 $i\equiv0 \pmod D $ 的 \(i\) ,将 \(A_i\) ​加上 \(K\) 。

询问:输入格式:2 L R,询问区间和,即 \(\sum_{i=L}^{R}A_i\) 。

华华是个newbie,怎么可能会这样的题?不过你应该会吧。

输入描述

第一行两个正整数 \(N\) 、\(M\) 表示序列的长度和操作询问的总次数。

接下来M行每行三个正整数,表示一个操作或询问。

输出描述

对于每个询问,输出一个非负整数表示答案。

示例1

输入

10 6
1 1 1
2 4 6
1 3 2
2 5 7
1 6 10
2 1 10

输出

3
5
26

备注

\(1\le N,M\le10^5\) , \(1\le D\le N\) , \(1\le L\le R\le N\) , \(1\le K \le 10^8\)

题解

知识点:树状数组,根号分治。

显然,这道题的修改并不能转化为可懒标记的区间修改,也没有很好的方法转化为单点修改。

我们可以考虑暴力优化的一种,根号分治。将修改操作的 \(D\) 分为两部分,按阈值 \(B\) 划分:

  1. \(D \leq B\) 时,采用标记法, 用 \(add\) 数组表示某个 \(D\) 加了多少,复杂度 \(O(1)\) 。
  2. \(D > B\) 时,采用暴力修改法,倍增修改树状数组 \(x \equiv 0 \pmod D\) 的点,复杂度 \(O\left( \dfrac{n}{B} \log n \right)\) 。

修改总体复杂度为 \(O\left( \dfrac{n}{B} \log n \right)\) 。

同时,查询操作也要随之改变:

  1. \(D \leq B\) 部分,暴力累和每个 \(D\) 的贡献,即 \(\displaystyle \sum_{i=1}^B add_i \cdot \left( \left \lfloor \frac{r}{i} \right \rfloor - \left \lfloor \frac{l-1}{i} \right \rfloor \right)\) ,复杂度 \(O(B)\)。
  2. \(D>B\) 部分,直接查询树状数组即可,复杂度 \(O(\log n)\) 。

查询总体复杂度为 \(O(B + \log n)\) 。

我们尝试平衡查询和修改的复杂度。假设 \(B\) 能使 \(\log n\) 被忽略,则需要满足 $ \dfrac{n}{B} \log n = B$ ,解得 \(B = \sqrt{n \log n}\) 。因此, \(B = \sqrt{n \log n}\) 是我们所需要的阈值,其能使总体复杂度为 \(O(\sqrt{n \log n})\) 。

实际上,这道题用理论最优阈值时间不是最优的,用 \(B = \sqrt n\) 快将近一倍,可能由于数据的 \(D\) 普遍较小,使得查询代价上升较明显。

这里采用 \(B = \sqrt n\) 阈值。

时间复杂度 \(O(m\sqrt{n} \log n)\)

空间复杂度 \(O(n)\)

代码

#include <bits/stdc++.h>
using namespace std;
using ll = long long; template<class T>
class Fenwick {
int n;
vector<T> node;
public:
Fenwick(int _n = 0) { init(_n); } void init(int _n) {
n = _n;
node.assign(n + 1, T::e());
} void update(int x, T val) { for (int i = x;i <= n;i += i & -i) node[i] += val; } T query(int x) {
T ans = T::e();
for (int i = x;i >= 1;i -= i & -i) ans += node[i];
return ans;
} T query(int l, int r) { return query(r) - query(l - 1); }
}; struct T {
ll sum;
static T e() { return { 0 }; }
T &operator+=(const T &x) { return sum += x.sum, *this; }
friend T operator-(const T &a, const T &b) { return { a.sum - b.sum }; }
}; ll add[100007]; int main() {
std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int n, m;
cin >> n >> m;
Fenwick<T> fw(n);
for (int i = 1;i <= m;i++) {
int op;
cin >> op;
if (op == 1) {
int d, k;
cin >> d >> k;
if (d * d <= n) add[d] += k;
else for (int i = d;i <= n;i += d) fw.update(i, { k });
}
else {
int l, r;
cin >> l >> r;
ll ans = fw.query(l, r).sum;
for (int i = 1;i * i <= n;i++) ans += add[i] * (r / i - (l - 1) / i);
cout << ans << '\n';
}
}
return 0;
}

NC23054 华华开始学信息学的更多相关文章

  1. 牛客小白月赛12 F 华华开始学信息学 (分块+树状数组)

    链接:https://ac.nowcoder.com/acm/contest/392/F来源:牛客网 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 32768K,其他语言65536K ...

  2. 牛客小白月赛12 D 月月给华华出题 (欧拉函数,数论,线筛)

    链接:https://ac.nowcoder.com/acm/contest/392/D 来源:牛客网 月月给华华出题 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 131072K, ...

  3. 牛客练习赛46 B 华华送奕奕小礼物 (预处理前缀和,二分)

    链接:https://ac.nowcoder.com/acm/contest/894/B?&headNav=acm 来源:牛客网 华华送奕奕小礼物 时间限制:C/C++ 1秒,其他语言2秒 空 ...

  4. 牛客小白月赛12 J 月月查华华的手机(序列自动机)

    ---恢复内容开始--- 题目来源:https://ac.nowcoder.com/acm/contest/392/J 题意: 题目描述 月月和华华一起去吃饭了.期间华华有事出去了一会儿,没有带手机. ...

  5. Newcoder 华华给月月出题(线筛)题解

    题目描述: 华华刚刚帮月月完成了作业.为了展示自己的学习水平之高超,华华还给月月出了一道类似的题: Ans=⊕Ni=1(iNmod(109+7))Ans=⊕i=1N(iNmod(109+7)) ⊕⊕符 ...

  6. 牛客网 牛客小白月赛12 B.华华教月月做数学-A^B mod P-快速幂+快速乘

    链接:https://ac.nowcoder.com/acm/contest/392/B来源:牛客网 华华教月月做数学 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其 ...

  7. E.华华给月月准备礼物

    链接:https://ac.nowcoder.com/acm/contest/392/E 题意: 二月中旬虐狗节前夕,华华决定给月月准备一份礼物.为了搭建礼物的底座,华华需要若干根同样长的木棍.华华手 ...

  8. B.华华教月月做数学

    链接:https://ac.nowcoder.com/acm/contest/392/B 题意: 找到了心仪的小姐姐月月后,华华很高兴的和她聊着天.然而月月的作业很多,不能继续陪华华聊天了.华华为了尽 ...

  9. A.华华听月月唱歌

    链接:https://ac.nowcoder.com/acm/contest/392/A 题意: 月月唱歌超级好听的说!华华听说月月在某个网站发布了自己唱的歌曲,于是把完整的歌曲下载到了U盘里.然而华 ...

  10. 牛客小白月赛12 C 华华给月月出题 (积性函数,线性筛)

    链接:https://ac.nowcoder.com/acm/contest/392/C 来源:牛客网 华华给月月出题 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K, ...

随机推荐

  1. cesium 3d tileset 问题总结

    Cesium 3d Tileset 中 i3dm 中存储的模型坐标为笛卡尔坐标,占四个字节,因为地球半径比较大,所以只有整数位和小数点后1位有效,因此会损失精度.对于要求精度比较高的模型,会发现位置偏 ...

  2. PCB封装设计建议:

    1,通孔型元器件建议孔直径比元器件管脚直径大0.2-0.3mm左右,焊盘铜皮外沿一般是0.3-1mm(相当于直径应该加0.6-2mm)宽大元件可再大一点,对于设计单面板的,则最小铜皮外沿应大于1mm以 ...

  3. vs调试导入功能时莫名自动结束调试

    新装了vs2022,默认下图所示的地方打勾,导致调试文件导入功能时触发了自动结束调试,真是坑爹~~

  4. CanvasScaler的三种适配模式——缩放模式(Scale with Screen Size)

    一.含义 根据屏幕尺寸进行缩放,随着屏幕尺寸进行放大缩小 二.参数介绍 第一个参数一般是美术人员根据游戏主要面向的手机市场,比如安卓市场,用市场上最常用的分辨率作为制作UI图片的标准.这里填的数就是美 ...

  5. 数制、ip地址及子网

    一.数制 数制:计数的方法,指用一组固定的符号和统一的规则表示数值的方法 数位:指数字符号在一个数中所处的位置 基数:指在某种进制计数中,数位上所能使用的数字符号的个数 位权:指在某种进制计数中,数位 ...

  6. Java笔记第十弹

    网络编程三要素 1.IP地址--设备的标识 2.端口--应用程序的标识 3.协议--常见的协议有UDP协议和TCP协议 IP地址 1.IPv4(二进制数据) 2.IPv6 常用命令: ipconfig ...

  7. 干货来袭!3天0基础Python实战项目快速学会人工智能必学数学基础全套(含源码)(第3天)概率分析篇:条件概率、全概率与贝叶斯公式

    第1天:线性代数篇:矩阵.向量.实战编程 第2天:微积分篇:极限与导数.梯度下降.积分.实战编程 第3天:概率分析篇:条件概率与全概率.贝叶斯公式.实战项目 目录 前言 一.概率与机器学习 1.1 概 ...

  8. EasyRelation发布,简单强大的数据关联框架

    当开发人员需要进行关联查询时,往往需要编写大量的冗余代码来处理数据之间的关系.这不仅浪费时间和精力,还会影响项目的可维护性和可扩展性. EasyRelation 是一个简单.高效的自动关联数据框架,可 ...

  9. vue3 ts 类式写法的mixins

    vue-property-decorator 混入(mixins) // mixins.ts import { Vue } from 'vue-property-decorator' class Mi ...

  10. AWS IAM介绍

    前言 AWS是世界上最大的云服务提供商,它提供了很多组件供消费者使用,其中进行访问控制的组件叫做IAM(Identity and Access Management), 用来进行身份验证和对AWS资源 ...