试题编号: 201709-5
试题名称: 除法
时间限制: 10.0s
内存限制: 256.0MB
问题描述:

问题描述
  小葱喜欢除法,所以他给了你N个数a1, a2, ⋯, aN,并且希望你执行M次操作,每次操作可能有以下两种:
  给你三个数l, r, v,你需要将al, al+1, ⋯, ar之间所有v的倍数除以v。
  给你两个数l, r,你需要回答al + al+1 + ⋯ + ar的值是多少。
输入格式
  第一行两个整数N, M,代表数的个数和操作的次数。
  接下来一行N个整数,代表N个数一开始的值。
  接下来M行,每行代表依次操作。每行开始有一个整数opt。如果opt=1,那么接下来有三个数l, r, v,代表这次操作需要将第l个数到第r个数中v的倍数除以v;如果opt = 2,那么接下来有两个数l, r,代表你需要回答第l个数到第r个数的和。
输出格式
  对于每一次的第二种操作,输出一行代表这次操作所询问的值。
样例输入
5 3
1 2 3 4 5
2 1 5
1 1 3 2
2 1 5
样例输出
15
14
评测用例规模与约定
  对于30%的评测用例,1 ≤ N, M ≤ 1000;
  对于另外20%的评测用例,第一种操作中一定有l = r;
  对于另外20%的评测用例,第一种操作中一定有l = 1 , r = N;
  对于100%的评测用例,1 ≤ N, M ≤ 105,0 ≤ a1, a2, ⋯, aN ≤ 106, 1 ≤ v ≤ 106, 1 ≤ l ≤ r ≤ N。

问题链接:CCF201709-5 除法
问题简述:(略)
问题分析:这道题可以用树状数组解决,也可以用线段树来解决。
程序说明:需要注意数组tree[]要用long long类型,否则会出问题。
参考链接:(略)
题记:(略)

100分的C++语言程序(线段树)如下:

/* CCF201709-5 除法 */#include <bits/stdc++.h>using namespace std;typedef long long LL;/* 线段树 */
const int N = 100000 + 1;
int n, a[N];
LL tree[N << 2];void buildTree(int root, int l, int r)
{if (l == r) tree[root] = a[l];else {int mid = (l + r) >> 1;buildTree(root << 1, l, mid);buildTree(root << 1 | 1, mid + 1, r);tree[root] = tree[root << 1] + tree[root << 1 | 1];}
}void update(int root, int l, int r, int m)
{if (l == r) tree[root] = a[m];else {int mid = (l + r) >> 1;if (m <= mid) update(root << 1, l, mid, m);else update(root << 1 | 1, mid + 1, r, m);tree[root] = tree[root << 1] + tree[root << 1 | 1];}
}LL query(int root, int left, int right, int l, int r)
{if(left <= l && right >= r) return tree[root];int mid = (l + r) >> 1;LL ret = 0;if (left <= mid) ret += query(root << 1, left, right, l, mid);if (right > mid) ret += query(root << 1 | 1, left, right, mid+1, r);return ret;
}int main()
{std::ios::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);int m, opt, l, r, v;cin >> n >> m;for (int i = 1; i <= n; i++) cin >> a[i];buildTree(1, 1, n);while (m--) {cin >> opt;if (opt == 1) {cin >> l >> r >> v;if (v != 1) {for (int i = l; i <= r; i++)if (a[i] >= v && a[i] % v == 0) {a[i] /= v;update(1, 1, n, i);}}} else if (opt == 2) {cin >> l >> r;cout << query(1, l, r, 1, n) << endl;}}return 0;
}

100分的C++语言程序(树状数组)如下:

/* CCF201709-5 除法 */#include <bits/stdc++.h>using namespace std;typedef long long LL;/* 树状数组 */
const int N = 100000 + 1;
int n, a[N];
LL tree[N];
inline int lowbit(int x) {return x & -x;}
void add(int x, int d) {while(x <= n) tree[x] += d, x += lowbit(x);}
LL sum(int x) {LL ret = 0; while(x > 0) ret += tree[x], x -= lowbit(x); return ret;}int main()
{std::ios::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);int m, opt, l, r, v;cin >> n >> m;memset(tree, 0, sizeof tree);for (int i = 1; i <= n; i++) {cin >> a[i];add(i, a[i]);}for (int i = 1; i <= m; i++) {cin >> opt >> l >> r;if (opt == 1) {cin >> v;if (v != 1) {for (int j = l; j <= r; j++)if (a[j] >= v && a[j] % v == 0) {add(j, a[j] / v - a[j]);a[j] /= v;}}} else if (opt == 2)cout << sum(r) - sum(l - 1) << endl;}return 0;
}

CCF201709-5 除法(100分)【树状数组+线段树】相关推荐

  1. D-query SPOJ - DQUERY(求区间不同数的个数)(树状数组||线段树+离散)(主席树+在线)

    English Vietnamese Given a sequence of n numbers a1, a2, -, an and a number of d-queries. A d-query ...

  2. [CSP-S模拟测试]:影魔(树状数组+线段树合并)

    题目背景 影魔,奈文摩尔,据说有着一个诗人的灵魂.事实上,他吞噬的诗人灵魂早已成千上万. 千百年来,他收集了各式各样的灵魂,包括诗人.牧师.帝王.乞丐.奴隶.罪人,当然,还有英雄. 每一个灵魂,都有着 ...

  3. 模板三连击:树状数组+线段树+主席树

    没事儿干,复习模板...... 1.树状数组 本来不想写这个的,但是反正就几分钟就打完了,所以就写了,水AC数. 洛谷 P3374 [模板]树状数组 1 1 #include<cstdio> ...

  4. 51nod 1680区间求和 (dp+树状数组/线段树)

    不妨考虑已知一个区间[l,r]的k=1.k=2....k=r-l+1这些数的答案ans(只是这一个区间,不包含子区间) 那么如果加入一个新的数字a[i](i = r+1) 则新区间[l, i]的答案为 ...

  5. P2357 守墓人(树状数组/线段树)

    题目描述 在一个荒凉的墓地上 有一个令人尊敬的守墓人, 他看守的墓地从来 没有被盗过, 所以人们很放心的把自己的先人的墓 安顿在他那 守墓人能看好这片墓地是必然而不是偶然..... 因为....守墓人 ...

  6. NKOJ 2182 (HEOI 2012) 采花(树状数组/线段树)

    P2182[河北OI 2012 DAY1]采花 问题描述 萧芸斓是Z 国的公主,平时的一大爱好是采花. 今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建的花园采花.花园足够大,容纳 了n 朵花,花有c ...

  7. HDU 1556 前缀和 树状数组 线段树

    解法一: a[i]表示以 i作为起点,对 i-n的气球全部上色的次数  对(start,end)区间上色 ++a[start] --a[end+1]抵消掉 end+1-n的部分 问题转换为求 a的前缀 ...

  8. jzoj3854-分组【树状数组,线段树】

    正题 题目链接:https://jzoj.net/senior/#contest/show/2990/2 题目大意 一个小队满足要求 队长的地位最高 所有队员和队长的年龄差不超过kkk 给出nnn个人 ...

  9. POJ2182 HDU2711 Lost Cows【树状数组+线段树】

    Lost Cows Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 17113 Accepted: 10664 Descripti ...

最新文章

  1. 如何理解“跳出率”,它对SEO有什么影响?
  2. CodeForces - 1118F1 Tree Cutting (Easy Version)(树形dp)
  3. SAP BOPF BO draft状态的数据激活原理
  4. php tp框架选择题,thinkPHP框架单元测试库tpunit用法示例
  5. 关于spring mvc时间类型绑定失败解决方法
  6. 20个使用柔和的色调的优秀网站设计示例
  7. 腾讯 QQ 产品已经实现全量上云;中科院计算所发明新编程语言“木兰”;Electron 7.1.9 发布 | 极客头条...
  8. 语音识别首次全平台比拼,讯飞依图BAT各家算法差异巨大
  9. 文件和文件之间的 相对路径 绝对路径的访问(之前总是容易忘记)
  10. 9 9简单的数独游戏python_python实现数独游戏 java简单实现数独游戏
  11. 机器学习_深度学习毕设题目汇总——场景
  12. 腾讯《天天传奇》玩转Unity3D
  13. Android Manifest 权限描述大全
  14. 多行文字显示不完用省略号表示
  15. matplotlib之pyplot模块——绘制误差棒图 errorbar()
  16. php 数组 print_r,PHP中的print_r 与 var_dump 输出数组
  17. Docker 容器部署 SQL Server AlwaysOn AG
  18. ASP.NET CORE 2.0 发布到IIS,IIS如何设置环境变量来区分生产环境和测试环境
  19. 高并发系统架构设计之微服务篇19: 微服务拆分
  20. 完美解决:The specified Gradle installation directory

热门文章

  1. 2022-03-21 转载办公室之常用职位(英汉)
  2. vim搜索设置高亮:set hlsearch
  3. 各种数字显示屏接口:LVDS, DVI, HDMI, DisplayPort, DSI
  4. GeoTools——JTS空间操作
  5. ND2D源码及范例工程(编译通过)
  6. .net socket与完成端口、异步发送相关研究
  7. java暂停脚本_用Rhino解析Java中的JavaScript:暂停/恢复脚本
  8. 上拉加载 php,jquery上拉加载代码及原理
  9. Mysql逻辑架构简介
  10. 服务器重装系统网站打不开怎么办,网页打不开,小编教你网页打不开怎么办