“美登杯”上海市高校大学生程序设计邀请赛 (华东理工大学) E 小花梨的数组 线段树
题意

分析
预处理出每个数的最小素因子,首先可以知道\(minprime(x*minprime(x))=minprime(x)\),我们用线段树维护区间最大值\(mx[p]\),注意这里的最大值并不是实际的最大值,同时维护区间\(a[i]\)乘\(minprime(a[i])\)的次数的最小值\(mnt[p]\)
对于操作1,直接区间更新\(mnt[p]\)加1。
对于操作2,有两种情况:
当\(mnt[p]=0\)时,表示当前区间内至少有一个数乘最小素因子的次数为0,一个数除以它的最小素因子后它的最小素因子可能会变化,当一个数为1时,无论怎么操作它都不会再变了,而一个数除它的最小素因子最多\(log\)次就会变成1,所以此时我们直接暴力更新\(mx[p]=mx[p]/minprime(mx[p])\);
当\(mnt[p]\not= 0时\),直接区间更新\(mnt[p]\)减1。
对于操作3,单点查询\(mx[p]\)和\(mnt[p]\),答案为\(mx[p]\times minprime(mx[p])^{mnt[p]}\),用快速幂算一下就行了。
为什么维护区间最大值\(mx[p]\)呢,因为当\(mx[p]=1\)时可以直接剪枝。
时间复杂度\(O(n*log(max(a[i]))*log(n))\)
Code
#include<bits/stdc++.h>
#define fi first
#define se second
#define pb push_back
#define lson l,mid,p<<1
#define rson mid+1,r,p<<1|1
#define ll long long
using namespace std;
const int inf=1e9;
const int mod=1e9+7;
const int maxn=1e5+10;
typedef pair<int,int> pii;
int n,m;
int a[maxn];
int mp[10*maxn];
int mx[maxn<<2],mnt[maxn<<2],tag[maxn<<2];
void pp(int p){
mx[p]=max(mx[p<<1],mx[p<<1|1]);
mnt[p]=min(mnt[p<<1],mnt[p<<1|1]);
}
void pd(int p,int k){
mnt[p]+=k;
tag[p]+=k;
}
void bd(int l,int r,int p){
if(l==r){
mx[p]=a[l];
return;
}int mid=l+r>>1;
bd(lson);bd(rson);pp(p);
}
void up(int dl,int dr,int l,int r,int p,int k){
if(mx[p]==1) return;
if(l>=dl&&r<=dr){
if(mnt[p]==0&&k==-1){
if(l==r){
mx[p]/=mp[mx[p]];
return;
}
}else{
mnt[p]+=k;
tag[p]+=k;
return;
}
}int mid=l+r>>1;
pd(p<<1,tag[p]);pd(p<<1|1,tag[p]);tag[p]=0;
if(dl<=mid) up(dl,dr,lson,k);
if(dr>mid) up(dl,dr,rson,k);
pp(p);
}
pii qy(int x,int l,int r,int p){
if(l==r){
return pii(mx[p],mnt[p]);
}int mid=l+r>>1;
pd(p<<1,tag[p]);pd(p<<1|1,tag[p]);tag[p]=0;
if(x<=mid) return qy(x,lson);
else return qy(x,rson);
}
int getmp(int x){
for(int i=2;i*i<=x;i++){
if(x%i==0) return i;
}
return x;
}
ll ksm(ll a,ll b){
ll ret=1;
while(b){
if(b&1) ret=ret*a%mod;
b>>=1;
a=a*a%mod;
}
return ret;
}
int main(){
//ios::sync_with_stdio(false);
//freopen("in","r",stdin);
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}mp[1]=1;
for(int i=2;i<=1000000;i++){
mp[i]=getmp(i);
}bd(1,n,1);
while(m--){
int op,l,r,x;
scanf("%d",&op);
if(op==1){
scanf("%d%d",&l,&r);
up(l,r,1,n,1,1);
}else if(op==2){
scanf("%d%d",&l,&r);
up(l,r,1,n,1,-1);
}else{
scanf("%d",&x);
pii ret=qy(x,1,n,1);
ll ans=1ll*ret.fi*ksm(mp[ret.fi],ret.se)%mod;
printf("%lld\n",ans);
}
}
return 0;
}
“美登杯”上海市高校大学生程序设计邀请赛 (华东理工大学) E 小花梨的数组 线段树的更多相关文章
- “美登杯”上海市高校大学生程序设计邀请赛 **D. 小花梨的取石子游戏**
"美登杯"上海市高校大学生程序设计邀请赛 (华东理工大学) D. 小花梨的取石子游戏 Description 小花梨有
- 美登杯”上海市高校大学生程序设计邀请赛 Problem E 、 小 花梨 的数组 (线段树)
Problem E E . 小 花梨 的数组 时间限制:1000ms 空间限制:512MB Description 小花梨得到了一个长度为
- “美登杯”上海市高校大学生程序设计 C. 小花梨判连通 (并查集+map)
Problem C C . 小 花梨 判连通 时间限制:2000ms 空间限制:512MB Description 小花梨给出
- “美登杯”上海市高校大学生程序设计赛B. 小花梨的三角形(模拟,实现)
题目链接:https://acm.ecnu.edu.cn/contest/173/problem/B/#report9 Problem B B . 小 花梨 的 三角形 时间限制:1000ms 空间限 ...
- “美登杯”上海市高校大学生程序设计 E. 小花梨的数组 (线段树)
https://acm.ecnu.edu.cn/contest/173/problem/E/ 分析: 考虑这样一种情况,如果对一个点连续地做几次乘操作,那么之后紧跟着的除操作只需要将乘操作的次数减少即 ...
- 2014嘉杰信息杯ACM/ICPC湖南程序设计邀请赛暨第六届湘潭市程序设计竞赛
比赛链接: http://202.197.224.59/OnlineJudge2/index.php/Contest/problems/contest_id/36 题目来源: 2014嘉杰信息杯ACM ...
- FZU - 2039 Pets (二分图匹配 2011年全国大学生程序设计邀请赛(福州))
Description Are you interested in pets? There is a very famous pets shop in the center of the ACM ci ...
- 2018中国大学生程序设计竞赛 - 网络选拔赛 1010 YJJ's Salesman 【离散化+树状数组维护区间最大值】
题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6447 YJJ's Salesman Time Limit: 4000/2000 MS (Java/O ...
- XTU OJ 1209 Alice and Bob 2014(嘉杰信息杯ACM/ICPC湖南程序设计邀请赛暨第六届湘潭市程序设计竞赛)
Problem Description The famous "Alice and Bob" are playing a game again. So now comes the ...
随机推荐
- 作业7:常用java命令(一)
一.Javac(java compiler) 1.功能:javac是一种前端编译器,负责将源代码转换为字节码. 2.例子 (1)代码 public class TestJavac { static c ...
- opencv 一些函数的耗时计算
Release 模式 -------------------------------------------------- smooth gaussian : 2 cvtColor CV_BGR2La ...
- 【大数据】初识Hadoop
因为项目日志体量较大,每天有4-7T的日志量,传统的sqlserver已经不能满足,所以现在需要使用到大数据的相关工具进行记录和使用. 虽然公共项目提供了组件和解决方案,但是对于一些名词.概念还是有必 ...
- 由于MTU设置不当导致的访问超时
现象 工作中遇到一件怪事:搭建好服务器后(VPN服务器,创建了虚拟网卡),服务器和客户端之间响应正常且很稳定,客户端也能正常通过服务器访问外网.但是访问个别网站时可以打开文字,但是部分图片打不开(也不 ...
- kubernetes资源配置之ReplicaSets
什么是ReplicaSets? ReplicaSet的目的是维护在任何给定时间运行的稳定的副本Pod集. 因此,它通常用于保证指定数量的相同Pod的可用性 ReplicaSets怎么样工作? Repl ...
- 【转】make menuconfig/.config/Kconfig解析
当执行#make menuconfig时会出现内核的配置界面,所有配置工具都是通过读取"arch/$(ARCH)/Kconfig"文件来生成配置界面,这个文件就是所有配置的总入口, ...
- LeetCode NO477.汉明距离总和
两个整数的 汉明距离 指的是这两个数字的二进制数对应位不同的数量. 计算一个数组中,任意两个数之间汉明距离的总和. 示例: 输入: 4, 14, 2 输出: 6 解释: 在二进制表示中,4表示为010 ...
- linux基础—课堂随笔08_进程(转)
进程优先级 命令 pstree -p 显示各个子线程 ps 进程状态(process state) UNIX风格:ps -ef BSD风格:ps aux 还有用到o参数,选项显示定制的信息: pid. ...
- Beta冲刺版本第一天
该作业所属课程:https://edu.cnblogs.com/campus/xnsy/SoftwareEngineeringClass2 作业要求地址:https://edu.cnblogs.com ...
- ios系统保存校园网密码
相信ios用户每次登陆时无法保存必须要重新输入账号密码的问题困扰了很多同学,特别是苹果5用户(不要问为什么,屏幕本来就小) 现在我们就一起想办法来解决它吧! 首先,我们进入设置->Safari浏 ...