题目链接

题目

题目描述

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

给定一个长度为 \(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. Windows10安装UR_RTDE

    ------------恢复内容开始------------ 要使用UR_RTDE必须先配置电脑环境,目前使用的环境是电脑win10,配置环境需要VS2019+boost1_66_0+cmake2.3 ...

  2. python 引用传递,简单例子

    from threading import Threaddef test1(a): while 1: print adef test2(a): a["a"] = 2if __nam ...

  3. 如何自动化测试你的接口?—— Rest Assured

    前言 不知道大家的项目是否都有对接口API进行自动化测试,反正像我们这种小公司是没有的.由于最近一直被吐槽项目质量糟糕,只能研发自己看看有什么接口测试方案.那么在本文中,我将探索如何使用 Rest A ...

  4. SHA-256 简介及 C# 和 js 实现【加密知多少系列】

    〇.简介 SHA-256 是 SHA-2 下细分出的一种算法.截止目前(2023-03)未出现"碰撞"案例,被视为是绝对安全的加密算法之一. SHA-2(安全散列算法 2:Secu ...

  5. 有执行语句:console.log(fn2(2)[3]),补充函数,使执行结果为"hello"

    function fn2(a){ return [1,2,3,"hello"];}console.log(fn2(2)[3])//hello 这个2是混淆视线的,即使没有这个2.函 ...

  6. 在ArcGIS Pro中对Revit的bim数据进行地理配准(平移、旋转等)

    在ArcGIS Pro中,打开Revit的rvt格式数据,默认是没有坐标系,且位置会放置在原点位置(0,0),在实际使用过程中,需要对rvt数据进行地理配准,包括平移.旋转等操作将bim数据放置在正确 ...

  7. 存储系统模拟—R实现

    存储系统 存储问题是人们最熟悉又最需要研究的问题之一.例如企业储存的原材料.在制品等,存储太少,不足以满足生产的需要,将使生产过程中断; 存储太多,超过了生产的需要,将造成资金及资源的积压浪费.商店储 ...

  8. flask-wtfwkfom使用

    我们在使用flask框架来搭建自己的博客,只要是设涉及到表单相关,必然会想起Flask-WTF与WTForms.对于flask初学者来说,比较容易混淆两者.今天想来一一解释两者的用法. Flask-W ...

  9. 运行项目报错Cannot read property 'styles' of undefined

    原因是安装依赖版本不对,以下是我的解决办法: 1.先删除项目中package-lock.json 文件 及node_modules文件(可使用rimraf指令删除node_modules,直接删文件很 ...

  10. 使用CURL调用接口[*示例*]

    <?php header("content-type:text/html;charset=utf-8"); /* 这是 使用CURL调用接口 */ $ch = curl_in ...