题目


分析

设最大值为 \(mx\),考虑每个数最多被除以 \(\log{mx}\) 次,那么加上树状数组的维护为 \(O(n\log{n}\log{mx})\)

问题就是如何快速找到这些位置,可以对于每一个约数单独把合法的数抽出来作为连续的一段用并查集维护。

那么一共需要抽出 \(O(mx\log{mx})\) 个位置,再加上并查集的维护也就是加上一个 \(\log\)。

总时间复杂度为 \(O(mx\log{mx}\log{n}+n\sqrt{mx}+n\log{n}\log{mx})\)。


代码

#include <cstdio>
#include <cctype>
#include <algorithm>
#define rr register
using namespace std;
const int N=500011; typedef long long lll; lll C[N],lans;
int l[N],r[N],c[N],b[N*40],f[N*40],n,m,mx,a[N];
inline lll iut(){
rr lll ans=0; rr char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
return ans;
}
inline void print(lll ans){
if (ans>9) print(ans/10);
putchar(ans%10+48);
}
inline void update(int x,int y){
for (;x<=n;x+=-x&x) C[x]+=y;
}
inline lll query(int l,int r){
rr lll ans=0; --l;
for (;r>l;r-=-r&r) ans+=C[r];
for (;l>r;l-=-l&l) ans-=C[l];
return ans;
}
inline signed getf(int u){return f[u]==u?u:f[u]=getf(f[u]);}
signed main(){
n=iut(); m=iut(),mx=1;
for (rr int i=1;i<=n;++i) a[i]=iut(),C[i]=C[i-1]+a[i];
for (rr int i=1;i<=n;++i)
if (a[i]>1) mx=mx>a[i]?mx:a[i],++c[a[i]];
for (rr int i=n;i;--i) C[i]-=C[i&(i-1)];
for (rr int i=2;i<=mx;++i)
for (rr int j=i+i;j<=mx;j+=i)
c[i]+=c[j];
for (rr int i=2,lst=0;i<=mx;++i) if (c[i]){
l[i]=lst+1,r[i]=l[i]+c[i]-1,lst=r[i],c[i]=0;
for (rr int j=l[i];j<=r[i];++j) f[j]=j;
}
for (rr int i=1;i<=n;++i)
if (a[i]>1){
b[l[a[i]]+c[a[i]]]=i,++c[a[i]];
for (rr int j=2;j*j<=a[i];++j)
if (a[i]%j==0){
b[l[j]+c[j]]=i,++c[j];
if (j*j<a[i]) b[l[a[i]/j]+c[a[i]/j]]=i,++c[a[i]/j];
}
}
for (rr int i=1;i<=m;++i){
rr int opt=iut();
rr int L=iut()^lans,R=iut()^lans;
if (opt==2) print(lans=query(L,R)),putchar(10);
else{
rr int x=iut()^lans;
if (x<2||x>mx||!c[x]) continue;
L=lower_bound(b+l[x],b+1+r[x],L)-b;
R=upper_bound(b+l[x],b+1+r[x],R)-b-1;
if (L>r[x]||L>R) continue;
for (rr int now=getf(L);now<=R;now=getf(now+1)){
if (a[b[now]]%x==0) update(b[now],a[b[now]]/x-a[b[now]]),a[b[now]]/=x;
if (now==R) break;
if (a[b[now]]%x) f[now]=getf(now+1);
}
}
}
return 0;
}

#并查集,树状数组#洛谷 5610 [Ynoi2013] 大学的更多相关文章

  1. BZOJ-3211花神游历各国 并查集+树状数组

    一开始想写线段树区间开方,简单暴力下,但觉得变成复杂度稍高,懒惰了,编了个复杂度简单的 3211: 花神游历各国 Time Limit: 5 Sec Memory Limit: 128 MB Subm ...

  2. BZOJ3211 花神游历各国 并查集 树状数组

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ3211 题意概括 有n个数形成一个序列. m次操作. 有两种,分别是: 1. 区间开根(取整) 2. ...

  3. hdu 6200 mustedge mustedge(并查集+树状数组 或者 LCT 缩点)

    hdu 6200 mustedge mustedge(并查集+树状数组 或者 LCT 缩点) 题意: 给一张无向连通图,有两种操作 1 u v 加一条边(u,v) 2 u v 计算u到v路径上桥的个数 ...

  4. 【bzoj4869】[Shoi2017]相逢是问候 扩展欧拉定理+并查集+树状数组

    题目描述 Informatik verbindet dich und mich. 信息将你我连结. B君希望以维护一个长度为n的数组,这个数组的下标为从1到n的正整数.一共有m个操作,可以分为两种:0 ...

  5. HDU 5458 Stability(双连通分量+LCA+并查集+树状数组)(2015 ACM/ICPC Asia Regional Shenyang Online)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5458 Problem Description Given an undirected connecte ...

  6. la4730(并查集+树状数组)

    https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&category=30& ...

  7. 【BZOJ3211】花神游历各国 并查集+树状数组

    [BZOJ3211]花神游历各国 Description Input Output 每次x=1时,每行一个整数,表示这次旅行的开心度 Sample Input 41 100 5 551 1 22 1 ...

  8. HDU 4750 Count The Pairs ★(图+并查集+树状数组)

    题意 给定一个无向图(N<=10000, E<=500000),定义f[s,t]表示从s到t经过的每条路径中最长的边的最小值.Q个询问,每个询问一个t,问有多少对(s, t)使得f[s, ...

  9. 【BZOJ4382】[POI2015]Podział naszyjnika 堆+并查集+树状数组

    [BZOJ4382][POI2015]Podział naszyjnika Description 长度为n的一串项链,每颗珠子是k种颜色之一. 第i颗与第i-1,i+1颗珠子相邻,第n颗与第1颗也相 ...

  10. Hdu 5458 Stability (LCA + 并查集 + 树状数组 + 缩点)

    题目链接: Hdu 5458 Stability 题目描述: 给出一个还有环和重边的图G,对图G有两种操作: 1 u v, 删除u与v之间的一天边 (保证这个边一定存在) 2 u v, 查询u到v的路 ...

随机推荐

  1. 【Android 逆向】【攻防世界】android2.0

    这是一道纯算法还原题 1. apk安装到手机,提示输入flag,看来输入就是flag 2. jadx 打开apk查看 this.button.setOnClickListener(new View.O ...

  2. 【Azure 环境】使用 az ad group create 时候遇见 Insufficient privileges to complete the operation

    问题描述 使用China Azure,通过Azure CLI 创建AAD组报错,提示权限不足 Insufficient privileges to complete the operation # 使 ...

  3. 【Azure 事件中心】Event Hub 消费端出现 Timeout Exception,errorContext中 LINK_CREDIT为0的解释

    问题描述 在使用Event Hub SDK消费数据过程中,出现大量的Timeout Exception,详细消息为: com.microsoft.azure.eventhubs.TimeoutExce ...

  4. 【Azure 事件中心】Spring Boot 集成 Event Hub(azure-spring-cloud-stream-binder-eventhubs)指定Partition Key有异常消息

    问题描述 在Spring Boot应用中集成Event Hub,发送消息时指定Partition Key,日志中发现异常: 应用使用Event Hub版本为 <dependency> &l ...

  5. gitlab推送代码触发jenkins构建

    预期:推送devloop或者master分支的代码, 自动执行jenkins 发布测试环境 首先,jenkins中需要安装如下插件 打开一个任务配置,构建触发器中勾选"Build when ...

  6. k8s实战之MySQL单实例部署

    前面我们学习了k8s入门系列文章,了解了k8s的一些基础概念以及怎么使用.本篇文章将进行一个小小的实战,使用k8s来部署单机版的mysql数据库,基本涵盖到前面讲到的Namespace.Pod.Dep ...

  7. 《Relation of the Relations A New Paradigm of the Relation Extraction Problem》论文阅读笔记

    原文 代码 摘要 为了解决传统的关系抽取(RE)方法只能识别两个实体之间的关系,而忽略了同一上下文中多个关系之间的相互依赖性,即关系的关系(relation of relations,RoR)的问题, ...

  8. 使用 Docker 部署 Next Terminal 轻量级堡垒机

    1)Next Terminal 介绍 官网:https://next-terminal.typesafe.cn/ GitHub:https://github.com/dushixiang/next-t ...

  9. Rsync 备份服务搭建

    Rsync 备份服务搭建 目录 Rsync 备份服务搭建 一. 前言 二. rsync 和 sersync 2.1 rsync 基本语法 2.2 本地文件传输 2.3 ssh 远程文件传输 2.4 基 ...

  10. 适用mybatis和jpa的全数据库类型主键生成插件,分布式高并发有序id生成器

    适用mybatis和jpa的全数据库类型主键生成插件,分布式高并发有序id生成器