Codeforces 920F - SUM and REPLACE 【线段树】
<题目链接>
题目大意:
给你一个序列,有两个操作,一个是求区间 l - r 的和,另一个是对区间l-r的元素修改值,x=d(x),d(x)为x的因子个数。
解题分析:
因为可能有多次修改操作,并且修改的范围可能比较大,所以提前将1~1e6范围内的数的因子个数全部打表进行处理。但是仅仅这样还是不行的,因为如果每次区间更新都暴力更新到叶子节点的话,区间更新 $O(nlog(n))$ ,然后m次询问,时间复杂度就达到了$O(n*mlog(n))$,而本题n给到了3e5,毫无疑问这样暴力更新是会超时的。我们发现1、2的因子数为它们本身,所以在更新的过程中,如果该区间都为1或2,就不用继续向下进行更新。
#include <bits/stdc++.h>
using namespace std; #define N int(3e5+7)
#define Max int(1e6+7)
#define lson rt<<1,l,mid
#define rson rt<<1|1,mid+1,r
#define clr(a,b) memset(a,b,sizeof(a))
#define rep(i,s,t) for(int i=s;i<=t;i++)
typedef long long ll;
int n,q;
int arr[N],facnum[Max+];
ll flag[N<<],tr[N<<]; template<typename T>
inline T read(T&x){
x=;int f=;char ch=getchar();
while(ch<''||ch>'')f|=(ch=='-'),ch=getchar();
while(ch>='' && ch<='')x=x*+ch-'',ch=getchar();
return x=f?-x:x;
}
int Getfac(int x){ //得到该数的所有因子数
int sum=,cnt;
for(int i=;i*i<=x;i++){
cnt=;
while(x%i==)x/=i,cnt++;
sum*=(cnt+);
}
if(x>) sum*=;
return sum;
}
void Pushup(int rt){
tr[rt]=tr[rt<<]+tr[rt<<|];
if(!flag[rt<<]&&!flag[rt<<|])flag[rt]=; //如果两个子区间都不需要修改,说明这个区间不需要再进行修改
}
void build(int rt,int l,int r){
flag[rt]=;
if(l==r){
tr[rt]=arr[l];return;
}
int mid=(l+r)>>;
build(lson);build(rson);
Pushup(rt);
}
void update(int rt,int l,int r,int L,int R){ //区间更新,维护一个区间标记,记录该区间是否需要改变
if(L<=l&&r<=R&&!flag[rt])return; //如果这部分区间不需要修改,直接返回
if(l==r){
tr[rt]=facnum[tr[rt]]; //进行单点修改
if(tr[rt]==||tr[rt]==)flag[rt]=; //如果该点为1或2,那么该点就不用再修改了,因为1、2的因子个数仍然为1、2
return;
}
int mid=(l+r)>>;
if(L<=mid&&flag[rt<<])update(lson,L,R);
if(R>mid&&flag[rt<<|])update(rson,L,R);
Pushup(rt);
}
ll query(int rt,int l,int r,int L,int R){ //区间查询
if(L<=l&&r<=R)return tr[rt];
ll ans=;
int mid=(l+r)>>;
if(L<=mid)ans+=query(lson,L,R);
if(R>mid)ans+=query(rson,L,R);
return ans;
}
int main(){
for(int i=;i<=Max;i++)facnum[i]=Getfac(i); //打表预处理得到1~1e6中所有的数的因子个数
read(n);read(q);
rep(i,,n)read(arr[i]);
build(,,n);
while(q--){
int op,x,y;
read(op);read(x);read(y);
if(op==)update(,,n,x,y);
else printf("%lld\n",query(,,n,x,y));
}
}
2019-02-16
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就不用修改否则就暴力修改. 因 ...
- CodeForces - 920F SUM and REPLACE (线段树)
题意:给N个数M次操作,(1<=N,M<=3e5, 1<=ai<=1e6),1是使[L,R]中的每个元素变成其因子的个数之和:2是求[L,R]区间之和 分析:看上去就很线段树的 ...
- 【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 是 ...
- 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,问 ...
随机推荐
- Android&Java面试题大全—金九银十面试必备
声明本文由作者:Man不经心授权转载,转载请联系原文作者原文链接:https://www.jianshu.com/p/375ad14096b3, 类加载过程 Java 中类加载分为 3 个步骤:加载. ...
- Vmware Workstation _linux yum 仓库搭建
0:检查 vm虚拟机光盘是否已经连接 1. 检测yum 仓库是否已经配置好 [root@oracle ~]# yum list all 如果输入这条指令可以正确显示出rpm 包的列表,则说明yum 仓 ...
- Confluence 6 安装补丁类文件
Atlassian 支持或者 Atlassian 缺陷修复小组可能针对有一些关键问题会提供补丁来解决这些问题,但是这些问题还没有放到下一个更新版本中.这些问题将会使用 Class 类文件同时在官方 J ...
- Flex布局新旧混合写法详解
flex是个非常好用的属性,如果说有什么可以完全代替 float 和 position ,那么肯定是非它莫属了(虽然现在还有很多不支持 flex 的浏览器).然而国内很多浏览器对 Flex 的支持都不 ...
- Client-Side Attacks
1.之前看到中间人攻击方式,要使用ssl服务构架一个劫持会话,使得攻击者和被攻击者客户端连接.ssl 服务(secure Socket Layer安全套接) ,以及后续出现的TSL(Transport ...
- sqlmap实例文档
sqlmap 手册参数整理文档 1.--data sqlmap -u "http://www.target.com/vuln.php" --data="id=1" ...
- jquery----Ajax补充
jquery实现ajax请求 <script> //$.ajax的两种使用方式: //$.ajax(settings); //$.ajax(url,[settings]); $(" ...
- 第八周学习总结-C#、C++
2018年9月2日 今天是小学期开始第三天,本周前几天看了看C#和C++,用C#窗体做了个计算器,然后还用Scratch做了一个贪吃蛇的脚本. 31号小学期开始,到今天我把A类基本做完了.一开始做通讯 ...
- PXE+HTTP+TFTP+Kickstart实现无人值守部署centos6.10
在联网的状态下安装所需软件: Shell> yum install dhcp httpd tftp-server xinetd syslinux system-config-kickstart ...
- MySQL慢查询 - 开启慢查询
一.简介 开启慢查询日志,可以让MySQL记录下查询超过指定时间的语句,通过定位分析性能的瓶颈,才能更好的优化数据库系统的性能. 二.参数说明 slow_query_log 慢查询开启状态 slow_ ...