NC23054 华华开始学信息学

这篇具有很好参考价值的文章主要介绍了NC23054 华华开始学信息学。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

题目链接

题目

题目描述

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

给定一个长度为 \(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)\)文章来源地址https://www.toymoban.com/news/detail-431231.html

代码

#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 华华开始学信息学的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 计算机信息管理毕业论文题目精选合集

    计算机信息管理系统是以计算机为工具,收集、存储、分析和处理数据,得出管理人员需要的信息的系统。下面是搜索整理的计算机信息管理毕业论文题目,欢迎借鉴参考。 计算机信息管理毕业论文题目一: 1、基于RFID技术的固定资产管理软件系统的设计与开发 2、基于RFI

    2024年02月04日
    浏览(38)
  • 功能安全和信息安全学习链接

    1. ISO 26262笔记(12)——如何理解ASIL分解? - 知乎 2. iso21434-TARA分析示例完整.docx-原创力文档 3. 汽车信息安全TARA分析方法实例简介 | 豆荚科技 4.[需求管理-10]:功能规范内容与撰写流程_文火冰糖的硅基工坊的博客-CSDN博客 5.[科普]汽车功能安全是什么_搜狐汽车_搜狐网 6. 

    2024年02月08日
    浏览(29)
  • 【2023】PyCharm专业版安装教程(使用jetbrains toolbox管理;学生认证、学信网验证码申请)

    目录 一、安装 1.直接安装  2.使用jetbrains toolbox(推荐,真的很方便) 二、学生认证免费使用专业版  官网 学信网报告在线验证码申请 等待邮件 三、登录 官网下载:官网链接  安装 默认安装路径在C盘,建议更改到其他盘    全部勾选即可,分别为: 创建桌面快捷方式 添

    2024年02月07日
    浏览(49)
  • 2023网络安全毕业设计选题推荐 - 信息安全毕业设计题目大全

    🔥 毕业季马上就要开始了,不少同学询问学长管理选题开题类的问题。 今天跟大家分享信息安全毕设选题 ~ 最新的信息安全(网络安全)专业毕设选题,难度适中,适合作为毕业设计,大家参考。 学长整理的题目标准: 相对容易 工作量达标 题目新颖 最近非常多的学弟学妹问

    2024年02月13日
    浏览(36)
  • SecureCRT 服务器链接信息密码忘记找回

    在日常工作和学习中,服务器常为 Linux 服务器,而主机电脑一版为 Windows 系统,在主机上如何连接 Linux 服务器,大家用到的工具也是五花八门,很多朋友都喜欢用 XShell,而我习惯用 SecureCRT。 可当有时候,工具中链接服务器的链接信息,忘记了用户对应的密码,而且手头还

    2024年02月07日
    浏览(48)
  • 信息与网络安全 Diffie-Hellman密匙交换算法 题目练习

    1.考虑公共素数 q = 11 本原元 a = 2 的Diffie-Hellman方案 (1)如果用户A有公钥 YA = 9 ,请问A的私钥XA是什么? (2)如果用户B有公钥 YB = 3 ,请问共享的密钥K是什么? 解: (1)根据Diffie-Hellman密钥交换原理——设g是一个质数,n是g的本原元,要求n和g是公开的,则网络中的某一用

    2024年01月16日
    浏览(30)
  • 数据挖掘题目:根据规则模板和信息表找出R中的所有强关联规则,基于信息增益、利用判定树进行归纳分类,计算信息熵的代码

    S∈R,P(S,x )∧ Q(S,y )== Gpa(S,w ) [ s, c ] 其中,P,Q ∈{ Major, Status ,Age }. Major Status Age Gpa Count Arts Graduate Old Good 50 Arts Graduate Old Excellent 150 Arts Undergraduate Young Good 150 Appl_ science Undergraduate Young Excellent Science Undergraduate Young Good 100 解答: 样本总数为500,最小支持数为5

    2024年02月06日
    浏览(42)
  • 点了下链接信息就泄露了,ta们是怎么做到的?

    随着互联网的普及以及一系列可供上网设备的快速发展,截止2022年12月,中国网民规模达10.37亿,较之2021年12月增长3549万,互联网普及率达75.6%;在这么庞大的数据背后又有多少用户的个人信息被泄露呢? 备注:图源网络 在介绍之前,我们首先需要了解什么是cookie,类型为“

    2024年02月01日
    浏览(27)
  • 【Django | 开发】面试招聘信息网站(美化admin站点&添加查看简历详情链接)

    🤵‍♂️ 个人主页: @计算机魔术师 👨‍💻 作者简介:CSDN内容合伙人,全栈领域优质创作者。 🌐 推荐一款找工作神器网站: 宝藏网站 |笔试题库|面试经验|实习招聘内推| 该文章收录专栏 ✨—【Django | 项目开发】从入门到上线 专栏—✨ 由于前文所开发的简历投递,并将简

    2023年04月20日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包