CodeForces - 920F SUM and REPLACE (线段树)
题意:给N个数M次操作,(1<=N,M<=3e5, 1<=ai<=1e6),1是使[L,R]中的每个元素变成其因子的个数之和;2是求[L,R]区间之和
分析:看上去就很线段树的一题,但是却思考了很久。发现1和2即使对其,也不会改变二者的值。而且一个大于2的数进行多次1操作,也最终会退化到2。
先预处理筛出1e6以内各数的质因子个数和。在线段树的节点中维护两个值:区间和以及区间最大值。在update函数中,如果该区间的最大值不超过2,那么该区间没有更新的必要;若超过2,则递归向下找到那个位置,并更新它。
听起来像是退化成了单点更新线段树,其实打个表能发现每个数的因子个数和不会很大,退化几次就成为2了,所以在更新次数很多的情况下,复杂度并不会很高。
#include<bits/stdc++.h>
using namespace std;
const int maxn=3e5+;
const int INF =0x3f3f3f3f;
const int maxv = 1e6+;
typedef long long LL;
struct SGndoe{
LL sum;
LL mx;
}tree[maxn<<];
LL a[maxn];
LL ans[maxv]; void pre()
{
for(int i=;i<=1e6;++i){
for(int j=;j<=1e6;j+=i){
ans[j]++;
}
}
} void pushup(int root)
{
tree[root].sum =tree[root<<].sum+tree[root<<|].sum;
tree[root].mx = max(tree[root<<].mx,tree[root<<|].mx);
} void build(int root,int L,int R){
if(L==R){
tree[root].sum = tree[root].mx=a[L];
return;
}
int mid =(L+R)>>;
build(root<<,L,mid);
build(root<<|,mid+,R);
pushup(root);
} void update(int root,int l,int r,int L,int R)
{
if(L<=l && R>=r && tree[root].mx<=) return;
else if(l==r){
tree[root].sum = ans[tree[root].sum];
tree[root].mx = tree[root].sum;
return;
}
int mid=(l+r)>>;
if(L<=mid)update(root<<,l,mid,L,R);
if(R>mid) update(root<<|,mid+,r,L,R);
pushup(root);
} LL query(int root,int l,int r,int L,int R)
{
if(L<=l&&r<=R) return tree[root].sum;
int mid=(l+r)>>;
LL res=;
if(L<=mid) res+=query(root<<,l,mid,L,R);
if(mid<R) res+=query(root<<|,mid+,r,L,R);
return res;
} int main(){
int T,N,M,num,t,x;
int L,R;
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
#endif
pre();
int cas=;
while(scanf("%d%d",&N,&M)==){
for(int i=;i<=N;++i) scanf("%lld",&a[i]);
build(,,N);
int op;
for(int i=;i<=M;++i){
scanf("%d%d%d",&op,&L,&R);
if(op==) update(,,N,L,R);
else printf("%lld\n",query(,,N,L,R));
}
}
return ;
}
CodeForces - 920F SUM and REPLACE (线段树)的更多相关文章
- Codeforces 920F - SUM and REPLACE
920F - SUM and REPLACE 思路1: 线段树(982 ms) 每个点最多更新6次 代码: #include<bits/stdc++.h> using namespace ...
- 2018.12.15 codeforces 920F. SUM and REPLACE(线段树)
传送门 线段树入门题. 给你一个序列:支持区间修改成自己的约数个数,区间求和. 实际上跟区间开方一个道理. 2的约数个数为2,1的约数个数为1,因此只要区间的最大值小于3就不用修改否则就暴力修改. 因 ...
- 【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) ...
- Codeforces 85D Sum of Medians(线段树)
题目链接:Codeforces 85D - Sum of Medians 题目大意:N个操作,add x:向集合中加入x:del x:删除集合中的x:sum:将集合排序后,将集合中全部下标i % 5 ...
- Codeforces 920F. SUM and REPLACE / bzoj 3211 花神游历各国
题目大意: 一个数列 支持两种操作 1 把区间内的数变成他们自己的约数个数 2 求区间和 思路: 可以想到每个数最终都会变成2或1 然后我们可以线段树 修改的时候记录一下每段有没有全被修改成1或2 是 ...
- Codeforces 920F - SUM and REPLACE 【线段树】
<题目链接> 题目大意: 给你一个序列,有两个操作,一个是求区间 l - r 的和,另一个是对区间l-r的元素修改值,x=d(x),d(x)为x的因子个数. 解题分析: 因为可能有多次修改 ...
- CF920F SUM and REPLACE 线段树
给你一个数组a_i,D(x)为x的约数个数 两种操作: 1.将[l,r]的a_i替换为D(a_i) 2.输出∑a_i ( l <= i <= r ) 当区间最大值<=2时,就不 ...
- codeforces 1217E E. Sum Queries? (线段树
codeforces 1217E E. Sum Queries? (线段树 传送门:https://codeforces.com/contest/1217/problem/E 题意: n个数,m次询问 ...
- codeforces Good bye 2016 E 线段树维护dp区间合并
codeforces Good bye 2016 E 线段树维护dp区间合并 题目大意:给你一个字符串,范围为‘0’~'9',定义一个ugly的串,即串中的子串不能有2016,但是一定要有2017,问 ...
随机推荐
- vmware复制虚拟机出现Error:No suitable device found:no device found for connection 'System eth0'
vmware复制虚拟机出现Error:No suitable device found:no device found for connection 'System eth0' 废话不多说,直接给出解 ...
- 怎样看K线图(实图详解)
K线图由开盘价.收盘价.最高价和最低价组成. 上面两种图叫作实体红K线和实体黑K线,实体红K线意味买力强劲,市场有强烈的做多欲望,此时可持股待涨.实体黑K线则代表市场完全进入恐惧状态,如果 ...
- mac 干掉Dashboard
打开终端,输入下面的命令: defaults write com.apple.dashboard mcx-disabled -boolean YES 然后再重启一下 Dock,在终端输入 kill ...
- 开发新手教程【三】Arduino开发工具
Arduino开发环境搭建 获取Arduino IDE开发工具 下载地址 :http://arduino.cc/en/Main/Software 能够下载release 版.Beta版和前期版本号 A ...
- Android之怎样强制横竖屏显示
2 强制横屏竖屏显示(不依据手机传感器调整) 在清单文件AndroidManifest.xml中 在<activity 里面增加: android:screenOrientation=&quo ...
- 一起talk C栗子吧(第二十五回:C语言实例--二分查找)
各位看官们,大家好,上一回中咱们说的是顺序查找的样例,这一回咱们说的样例是:二分查找.闲话休 提,言归正转. 让我们一起talk C栗子吧. 看官们,我们在上一回中说了查找的相关内容,而且介绍了一种查 ...
- 《Sqlserver》通过端口 8080 连接到主机 localhost 的 TCP/IP 连接失败。错误:“驱动程序收到意外的登录前响应。请验证连接属性,并检查 SQL Server 的实例正在主机上运行,且在此端口接受
1. 点击 开始 --> 所有程序 --> Microsoft SQL Server2005 --> 配置工具-->SQL Server configuration Manag ...
- npm and node 的一些问题
1. node 安装 n 模块 用来管理 node的版本 2. 初始化项目出现这个问题 Error: Attempt to unlock XXX, which hasn't been locked ...
- angularJS中的ng-show、ng-if指令
angularJS中的ng-show.ng-hide.ng-if指令都可以用来控制dom元素的显示或隐藏. 1. ng-show和ng-hide 根据所给表达式的值来显示或隐藏HTML元素.元素会渲染 ...
- Pycharm如何取消自动换行
1.只对当前文件有效的操作是: 菜单栏->View -> Active Editor -> Use Soft Wraps (不选中) 2.要是想对所有文件都起到效果,就要在setti ...