Description

Link.

区间查 \(x\) 的倍数并除掉,区间查和。

Solution

平衡树。

首先有个基本的想法就是按 \(a_{i}\) 开平衡树,即对于每个 \(a_{i}\) 都开一棵平衡树,共5e5棵,第 \(i\) 棵平衡树维护的值是所有 \(a_{i}\) 的倍数在原数组中的下标,用处后面讲。

注意到一个小性质,一个正整数 \(A\) 最多被整除 \(\log_{2}A\) 次,这个很好想,每次都至少减少一半。可以当成一个 trick 记下来。

整个区间的数最多被除 \(\sum_{i=1}^{n}\log_{2}a_{i}\) 次,区间和的操作可以用树状数组操作实现,则整体的操作复杂度为 \(\Theta(\sum_{i=1}^{n}\log_{2}a_{i}+\log_{2}a_{i})\)。

开头提到了对于每个 \(a_{i}\) 我们都开一棵平衡树,作用就体现在这里。因为如果要保证正确的时间复杂度,我们需要快速的找到需要执行操作的数。

这里我采用的是 FHQ-Treap。

我们可以用两次 split 操作在 \(x\) 的平衡树中提取出当前的询问区间,由于我们是以下标为平衡树维护的权值,所以我们用按值分裂即可提取出区间。

然后我们就在提取出的子树中 DFS 遍历,然后暴力操作,把操作后依然是 \(x\) 的倍数的数记录下来,操作完后用这个数组再建一棵临时树然后和之前 split 出来的子树一起合并回去。

操作之前记得预处理每个数的所有约数,这个简单,直接用 vector 即可。

#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <ctime>
#include <queue> using namespace std;
typedef long long t_t; const int Maxn = 1e5 + 5;
const int Maxa = 5e5 + 5;
int n, m, xxx, zip, tot, isa[Maxn], bin[Maxa], root[Maxa];
struct Treap
{
int l, r, key, val;
} t[Maxa * 230];
struct Fenwick_Tree
{
t_t bit[Maxn]; void ins(int x, t_t v)
{
for (; x <= n; x += x & -x) bit[x] += v;
} t_t sum(int x)
{
t_t ret = 0;
for (; x; x -= x & -x) ret += bit[x];
return ret;
}
} fwt;
vector < int > vec[Maxa]; int newnode(int val)
{
t[++tot].val = val;
t[tot].key = rand();
return tot;
} void split(int now, int val, int &x, int &y)
{
if (now == 0) x = y = 0;
else
{
if (t[now].val <= val)
{
x = now;
split(t[now].r, val, t[now].r, y);
}
else
{
y = now;
split(t[now].l, val, x, t[now].l);
}
}
} int merge(int x, int y)
{
if (x == 0 || y == 0) return x | y;
if (t[x].key > t[y].key)
{
t[x].r = merge(t[x].r, y);
return x;
}
else
{
t[y].l = merge(x, t[y].l);
return y;
}
} int build(int l, int r)
{
if (l > r) return 0;
int mid = (l + r) >> 1;
int now = newnode(bin[mid]);
t[now].l = build(l, mid - 1);
t[now].r = build(mid + 1, r);
return now;
} void dfs(int now, int val)
{
if (now == 0) return ;
dfs(t[now].l, val);
if (isa[t[now].val] % val == 0)
{
fwt.ins(t[now].val, -isa[t[now].val]);
isa[t[now].val] /= val;
fwt.ins(t[now].val, isa[t[now].val]);
}
if (isa[t[now].val] % val == 0) bin[++zip] = t[now].val;
dfs(t[now].r, val);
} int tx, ty, tp;
void change(int l, int r, int x)
{
if (x == 1) return ;
split(root[x], r, tx, tp);
split(tx, l - 1, tx, ty);
zip = 0;
dfs(ty, x);
root[x] = merge(tx, merge(build(1, zip), tp));
} signed main()
{
srand((114514 - 1) / 3 - 4);
scanf("%d %d", &n, &m);
for (int i = 1; i <= n; ++i)
{
scanf("%d", &isa[i]);
fwt.ins(i, isa[i]);
xxx = max(xxx, isa[i]);
}
for (int i = 1; i <= n; ++i)
{
for (int j = 1; j * j <= isa[i]; ++j)
{
if (isa[i] % j == 0)
{
vec[j].push_back(i);
if (j * j != isa[i]) vec[isa[i] / j].push_back(i);
}
}
}
for (int i = 1; i <= xxx; ++i)
{
zip = 0;
for (unsigned j = 0; j < vec[i].size(); ++j) bin[++zip] = vec[i][j];
root[i] = build(1, zip);
}
for (int i = 0; i < m; ++i)
{
int t, l, r, x;
scanf("%d %d %d", &t, &l, &r);
if (t == 1)
{
scanf("%d", &x);
change(l, r, x);
}
else printf("%lld\n", fwt.sum(r) - fwt.sum(l - 1));
}
return 0;
}

Solution -「洛谷 P5610」「YunoOI 2013」大学的更多相关文章

  1. 「区间DP」「洛谷P1043」数字游戏

    「洛谷P1043」数字游戏 日后再写 代码 /*#!/bin/sh dir=$GEDIT_CURRENT_DOCUMENT_DIR name=$GEDIT_CURRENT_DOCUMENT_NAME ...

  2. 「 洛谷 」P2768 珍珠项链

    珍珠项链 题目限制 内存限制:125.00MB 时间限制:1.00s 标准输入输出 题目知识点 动态规划 \(dp\) 矩阵 矩阵乘法 矩阵加速 矩阵快速幂 题目来源 「 洛谷 」P2768 珍珠项链 ...

  3. 「 洛谷 」P4539 [SCOI2006]zh_tree

    小兔的话 推荐 小兔的CSDN [SCOI2006]zh_tree 题目限制 内存限制:250.00MB 时间限制:1.00s 标准输入输出 题目知识点 思维 动态规划 \(dp\) 区间\(dp\) ...

  4. 「 洛谷 」P2151 [SDOI2009]HH去散步

    小兔的话 欢迎大家在评论区留言哦~ HH去散步 题目限制 内存限制:125.00MB 时间限制:1.00s 标准输入 标准输出 题目知识点 动态规划 \(dp\) 矩阵 矩阵乘法 矩阵加速 矩阵快速幂 ...

  5. Solution -「JSOI 2019」「洛谷 P5334」节日庆典

    \(\mathscr{Description}\)   Link.   给定字符串 \(S\),求 \(S\) 的每个前缀的最小表示法起始下标(若有多个,取最小的).   \(|S|\le3\time ...

  6. Solution -「洛谷 P4372」Out of Sorts P

    \(\mathcal{Description}\)   OurOJ & 洛谷 P4372(几乎一致)   设计一个排序算法,设现在对 \(\{a_n\}\) 中 \([l,r]\) 内的元素排 ...

  7. Solution -「POI 2010」「洛谷 P3511」MOS-Bridges

    \(\mathcal{Description}\)   Link.(洛谷上这翻译真的一言难尽呐.   给定一个 \(n\) 个点 \(m\) 条边的无向图,一条边 \((u,v,a,b)\) 表示从 ...

  8. Solution -「APIO 2016」「洛谷 P3643」划艇

    \(\mathcal{Description}\)   Link & 双倍经验.   给定 \(n\) 个区间 \([a_i,b_i)\)(注意原题是闭区间,这里只为方便后文描述),求 \(\ ...

  9. 「P4994」「洛谷11月月赛」 终于结束的起点(枚举

    题目背景 终于结束的起点终于写下句点终于我们告别终于我们又回到原点…… 一个个 OIer 的竞赛生涯总是从一场 NOIp 开始,大多也在一场 NOIp 中结束,好似一次次轮回在不断上演.如果这次 NO ...

  10. 「洛谷4197」「BZOJ3545」peak【线段树合并】

    题目链接 [洛谷] [BZOJ]没有权限号嘤嘤嘤.题号:3545 题解 窝不会克鲁斯卡尔重构树怎么办??? 可以离线乱搞. 我们将所有的操作全都存下来. 为了解决小于等于\(x\)的操作,那么我们按照 ...

随机推荐

  1. Terraform 改善基础架构的十个最佳实践

    Terraform 是一种非常流行的开源 IaC(基础设施即代码)工具,用于定义和提供完整的基础设施.Terraform 于 2014 年推出,其采用率已在全球范围内快速增长,越来越多的开发人员正在学 ...

  2. Nanoframework 操作单片机蓝牙配置WIFI的案例

    Nanoframework 操作单片机蓝牙配置WIFI的案例 通过Nanoframework的蓝牙配置Wifi的名称和密码 下面是基本需要的工具 ESP32设备一个 需要支持蓝牙和wifi,一般情况的 ...

  3. malloc/free 与 new/delete

    malloc/free与new/delete表达式的区别?相同点: 都是用来申请堆空间不同点: 1. malloc/free是库函数; new/delete是表达式 2. malloc开空间时,并不会 ...

  4. Java输入三个班每班三个人,输入成绩,分别计算每个班级的总分和平均分

    代码如下: public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int score; ...

  5. 根据模板动态生成word(三)使用poi-tl生成word

    @ 目录 一.前言 1.什么是poi-tl 2.官方信息 2.1 源码仓库 2.2 中文文档 2.3 开源协议 3.poi-tl的优势 3.1 poi-tl和其他模板引擎的对比 3.2 poi-tl ...

  6. Hexo博客Next主题配置加载优化性能提升

    主题源加载优化 把在NexT主题的_config.yml里面的: # Uri of fonts host. E.g. //fonts.googleapis.com (Default) host: 改为 ...

  7. MyBatis(log4j)

    log4j介绍 Log4j是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台.文件.GUI组件,甚至是套接口服务器.NT的事件记录器.UNIX Syslog守护 ...

  8. MAUI Blazor Android 输入框软键盘遮挡问题2.0

    前言 关于MAUI Blazor Android 输入框软键盘遮挡问题,之前的文章已经有了答案,MAUI Blazor Android 输入框软键盘遮挡问题 但是这个方案一直存在一点小的瑕疵 在小窗模 ...

  9. Blazor阻止冒泡传播

    在你的组件的外面套上一个div,并添加@onclick:stopPropagation="true" <div @onclick:stopPropagation=" ...

  10. 王道oj/problem15(用c++的引用精简代码)

    网址:http://oj.lgwenda.com/problem/15 思路:子函数的形参是指针的时候格式为 int*&p,且原函数实参为p 主函数使用fgets(字符串的指针,最大容量,st ...