Codefroces 920F SUM and REPLACE(线段树)
2024-09-01 08:11:21
题意:给你n个数,进行m次操作,分别是将区间[l,r]内的所有数替换成自己的因子数 和 对区间[l,r]进行求和。
题解:可以发现2的因子个数还是2,1的因子个数还是1,所以如果某个数被更新成1或者2之后就不需要再进行更新了。
#include<bits/stdc++.h>
#define ll long long
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
using namespace std;
const int N = 3e5+;
const int M = 1e6+;
ll tree[N<<];
bool ok[N<<];
int num[M], a[N];
int n, m;
void PushUp(int rt)
{
tree[rt] = tree[rt<<] + tree[rt<<|];
ok[rt] = ok[rt<<] && ok[rt<<|];
}
void Build(int l, int r, int rt)
{
if(l == r)
{
tree[rt] = a[l];
if(tree[rt] == || tree[rt] == ) ok[rt] = ;
else ok[rt] = ;
return ;
}
int m = l+r >> ;
Build(lson);
Build(rson);
PushUp(rt);
}
ll Query(int L, int R, int l, int r, int rt)
{
if(L <= l && r <= R)
return tree[rt];
int m = l+r >> ;
ll ans = ;
if(L <= m) ans += Query(L,R,lson);
if(m < R) ans += Query(L,R,rson);
return ans;
} void Revise(int L, int R, int l, int r, int rt)
{
if(ok[rt]) return ;
if(l == r)
{
tree[rt] = num[tree[rt]];
if(tree[rt] == || tree[rt] == ) ok[rt] = ;
return ;
}
int m = l+r >> ;
if(L <= m) Revise(L,R,lson);
if(m < R) Revise(L,R,rson);
PushUp(rt);
}
int main()
{
ios::sync_with_stdio(false);
cin.tie();
cout.tie();
memset(num, , sizeof(num));
for(int i = ; i < M; i++)
for(int j = i; j < M; j+=i)
num[j]++;
cin >> n >> m;
for(int i = ; i <= n; i++)
cin >> a[i];
Build(,n,);
int q, l, r;
while(m--)
{
cin >> q >> l >> r;
if(q == )
cout << Query(l,r,,n,) << endl;
else
Revise(l,r,,n,);
}
return ;
}
最新文章
- dedecms 文章页图片改为绝对路径
- 了解学习JS中this的指向
- [转]:Delphi中Format的字符串格式化使用说明
- python获取路径
- Swift开发第二篇——extension及fatalError
- 简单粗暴下载Spring
- SDK Build Tools revision (19.0.3) is too low for project Min
- UEditor文档
- STL中heap算法(堆算法)
- IOS开发之表视图(UITableView)
- win8.1中如何获得管理员权限步骤
- Socket 相关的知识
- 打工心态废掉了很多人,包括你吗?(你把现在这家公司的业务都弄清楚、弄懂了吗?君子报仇十年不晚!不离不弃!)good
- Java集合概述、Set集合(HashSet类、LinkedHashSet类、TreeSet类、EnumSet类)
- Cowrie蜜罐部署教程【转载】
- cent os 直接访问谷歌的脚本实现
- Lua语言的介绍和编程语言的归类
- 前端笔记之NodeJS(一)初识NodeJS&;内置模块&;特点
- [转] Torch中实现mini-batch RNN
- Introducing XAML Standard and .NET Standard 2.0