【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 ...
随机推荐
- 关于 jsp java servlet 中文汉字乱码的解决方法
在servlet类中的get,post最前面加上 req.setCharacterEncoding("UTF-8"); resp.setCharacterEncoding(&quo ...
- ArrayList的使用方法
1.什么是ArrayList ArrayList就是传说中的动态数组,用MSDN中的说法,就是Array的复杂版本,它提供了如下一些好处: 动态的增加和减少元素 实现了ICollection和I ...
- 当relative遇上z-index,阻断事件捕获
今天在调试前端页面的时候,发现addflowrank这个元素的click事件不能触发了.下图是它的元素结构. 用开发者工具试图定位这个元素,看看它到底怎么了.发现:无论我怎么用光标定位这个元素都定位不 ...
- 模块 –SYS
模块 –SYS os模块是跟操作系统的交互 sys是跟python解释器的交互 sys.argv 命令行参数List,第一个元素是程序本身路径 返回一个列表 In [218]: sys.argv Ou ...
- iOS开发者中心重置设备列表
苹果开发者账号允许的测试设备为100台,如果你注册了,这台机器就算是一个名额,禁用也算一个名额,仍被计入机器总数,每年可以重置一次,那我们怎么重置机器数量呢? 我们需要给苹果发送申请: https:/ ...
- Linux创建用户和随机密码
#!/bin/bash#批量创建10个系统帐号并设置密码rm -f user.logfor name in `seq 10`do #非交互式的输入随机密码 password=`echo $RANDOM ...
- python3爬取全民K歌
Python3爬取全民k歌 环境 python3.5 + requests 1.通过歌曲主页链接爬取 首先打开歌曲主页,打开开发者工具(F12). 选择Network,点击播放,会发现有一个请求返回的 ...
- ElementUi rules表单验证
ElementUi 表单验证 工作中常用到的JS验证 可以在pattern中书写正则,并且配合elementUI进行表单验证. pattern 属性规定用于验证输入字段的模式.模式指的是正则表达式. ...
- Linux 磁盘坏道检测和修复
今天在实验室碰到一台机器,根分区和/upgrade分区变成了read-only system.当碰到这个问题的时候,我的第一反应很可能硬件出现了故障,我使用了如下的方法来检测和排除故障: 使用dmes ...
- 走进Java(一)J2SE
一.Java是什么 Java是Java语言和Java平台的总称.Java语言和C#一样.核心都是oo.并且比較而言,Java做的更好. Java由四方面组成: • Java编程语言,即 ...