【Educational Codeforces Round 37 F】SUM and REPLACE
【链接】 我是链接,点我呀:)
【题意】
在这里输入题意
【题解】
那个D函数它的下降速度是很快的。
也就是说到最后他会很快的变成2或者1
而D(2)==2,D(1)=1
也就是说,几次操作过后很多数字实际上就不会发生变化了。
我们可以以这个为切入点。
可以用树状数组写,也可以用线段树写。
如果用树状数组写的话。
你需要额外用一个set来维护哪些值是还能变化的。
然后在读入l,r这个范围的时候。
直接用lower_bound查找离它最近的且大于等于它的能改变的值。
将它改变。
然后在树状数组中改变对应位置的值。
如果发现改变之后这个数字变成小于等于2了。
那么就在set中删掉这个值。
这样的话.下次在遍历的时候就不会再找到这个值了。
求和的话,还是用树状数组的求和就好了。
如果用线段树的话。
在改变的时候。
直到l==r的时候再改变。
然后维护一个区间的最大值和区间和。
如果区间的最大值<=2那么直接返回这个区间的和就好了。
【代码】
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 1e6;
const int NN = 3e5;
struct BI {
ll a[NN + 10];
int lowbit(int x) {
return x&(-x);
}
void add(int x,int y) {
while (x <= NN) {
a[x] += y;
x += lowbit(x);
}
}
ll sum(int x) {
ll now = 0;
while (x > 0) {
now += a[x];
x -= lowbit(x);
}
return now;
}
ll get_sum(int l, int r) {
return sum(r) - sum(l - 1);
}
}b;
int f[N+10],n,m,a[NN+10];
set<int> myset;
vector<int> V;
int main(){
#ifdef LOCAL_DEFINE
freopen("rush_in.txt", "r", stdin);
#endif
ios::sync_with_stdio(0),cin.tie(0);
for (int i = 1;i <= N;i++)
for (int j = i;j <= N;j+=i)
f[j]++;
cin >> n >> m;
for (int i = 1;i <= n;i++) {
cin >> a[i];
myset.insert(i);
b.add(i,a[i]);
}
for (int i = 1;i <= m;i++){
int ope,l,r;
cin >> ope >> l >> r;
if (ope==1){
V.clear();
while (1){
auto t = myset.lower_bound(l);
if (t==myset.end()||(*t)>r) break;
V.push_back(*t);
myset.erase(t);
}
for (int x:V){
b.add(x,f[a[x]]-a[x]);
a[x] = f[a[x]];
if (a[x]<=2) continue;
myset.insert(x);
}
}else{
cout<<b.get_sum(l,r)<<endl;
}
}
return 0;
}
【Educational Codeforces Round 37 F】SUM and REPLACE的更多相关文章
- 【Educational Codeforces Round 37 E】Connected Components?
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] bfs. 用一个链表来记录哪些点已经确定在某一个联通快里了. 一开始每个点都能用. 然后从第一个点开始进行bfs. 然后对于它的所有 ...
- 【Educational Codeforces Round 37 C】 Swap Adjacent Elements
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 显然l..r这一段连续的1可以把l..r+1变成有序的. 那么就把所有的连续1段变成有序的就好. 看看最后是不是升序即可. [代码] ...
- 【Educational Codeforces Round 37 B】 Tea Queue
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 用一个队列来模拟排队就好. 队列放三元组(x,y,z) x表示人的下标,y和z分别表示进入和退出时间. 然后枚举时间从1到5000 ...
- 【Educational Codeforces Round 37 A】 Water The Garden
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 记录下水龙头在哪些位置. 然后每秒钟把index-i和index+i改变状态一下就好(置1 [代码] #include <bi ...
- Educational Codeforces Round 7 F. The Sum of the k-th Powers 拉格朗日插值法
F. The Sum of the k-th Powers 题目连接: http://www.codeforces.com/contest/622/problem/F Description Ther ...
- 【Educational Codeforces Round 37】F. SUM and REPLACE 线段树+线性筛
题意 给定序列$a_n$,每次将$[L,R]$区间内的数$a_i$替换为$d(a_i)$,或者询问区间和 这题和区间开方有相同的操作 对于$a_i \in (1,10^6)$,$10$次$d(a_i) ...
- 【Educational Codeforces Round 33 D】Credit Card
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 每次遇到0的时候,看看当前累计的delta是多少. 如果大于0,则temp = d-delta; 小于0,取temp2 = min( ...
- 【Educational Codeforces Round 33 C】 Rumor
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 显然最后会形成多个集合,每个集合里面的人能够可以互相到达. 则维护并查集的时候,顺便维护一下每个集合里面的最小值就好. 最后答案就为 ...
- 【Educational Codeforces Round 33 B】Beautiful Divisors
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 把所有的那些数字打表出来. 逆序枚举就好 [代码] /* 1.Shoud it use long long ? 2.Have you ...
随机推荐
- 《剑指offer》数组中出现次数超过一半的数字
一.题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出 ...
- CF 287(div 2) B Amr and Pins
解题思路:一开始自己想的是找出每一次旋转所得到的圆心轨迹,将想要旋转到的点代入该圆心轨迹的方程,如果相等,则跳出循环,如果不相等,则接着进行下一次旋转.后来看了题解,发现,它的旋转可以是任意角度的,所 ...
- js常见语法错误
“Missing semicolon.” : “缺少分号.”, “Use the function form of \”use strict\”.” : “使用标准化定义function.”, “Un ...
- 微信小程序微信支付的一些坑
使用的是Node.js作为后端 统一下单: appid:这里的appid是调起微信支付的appid mch_id:商户号,需要注意的是商户号要与appid对应 nonce_str:Math.rando ...
- 【python爬虫和正则表达式】爬取表格中的的二级链接
开始进公司实习的一个任务是整理一个网页页面上二级链接的内容整理到EXCEL中,这项工作把我头都搞大了,整理了好几天,实习生就是端茶送水的.前段时间学了爬虫,于是我想能不能用python写一个爬虫一个个 ...
- C指针思考-(1)
首先记录下时间吧,@2016-08-18 23:26:22,这段时间看了同事的3本经典的书,<c缺陷和陷阱>,<c和指针>和<c专家编程>,感觉指针说的最多,多多少 ...
- OpenJDK源码研究笔记(四)-编写和组织可复用的工具类和方法
本篇主要讲解java.util.Arrays这个针对数组的工具类. 1.可复用的工具类和方法. 这个工具类里,包含很多针对数组的工具方法,如 排序.交换.二分查找.比较.填充.复制.hashcode ...
- 题解 洛谷 P3376 【【模板】网络最大流】
本人很弱,只会Dinic.EK与Ford-Fulkerson...(正在学习ISAP...) 这里讲Dinic... Dinic:与Ford-Fulkerson和的思路相似(话说好像最大流求解都差不多 ...
- 关于bom ef+bb+bf的问题
今天在商品详细页头部出现了一行空白,各种尝试无果,最后怀疑是不是bom头的问题,经过断点跟踪调试逐步缩小范围,果然最后发现是一个语言包文件的开头有 ef bb bf样式的字节,用ultraedit另存 ...
- Ruby创建命令
Ruby创建命令