题意:
1:将a[id]a[id]a[id]的值改为xxx。
2:令t=a[l]×a[l+1]×...×a[r−1]×a[r]t=a[l]×a[l+1]×...×a[r−1]×a[r]t=a[l]×a[l+1]×...×a[r−1]×a[r],求t能被多少个不同的素数整除。

题解:
本题有两种解法,带修莫队和线段树,带修莫队的话需要开个O3提提速,不然会T一个点。

1.带修莫队
题目不是5e4的范围吗,带修莫队会卡时间?
因为莫队移动的操作时间复杂度为O(1),但是这个移动的时间复杂度却不是O(1),应该是一个10左右的常数的大小,再加上vector本身就有点慢,所以会有点卡时间。

带修莫队的话,其实就可以当场是一个比较模板的题目了,只不过一个位置上的数字变成了好几个而已。

代码:

#pragma GCC optimize(3)
//#pragma GCC optimize(3,"Ofast","inline")
#include<bits/stdc++.h>#define endl '\n'using namespace std;
const int maxn=1e5+10;bool vis[maxn];
int prime[maxn], tot;void get_prime(int n) {vis[1] = true;for(int i = 2; i <= n; ++ i) {if (!vis[i]) prime[++tot] = i;for(int j = 1; prime[j] <= n/i; ++ j) {vis[prime[j] * i] = true;if (i % prime[j] == 0) break;}}
}
vector<int> pri[maxn];
struct node{int l,r,id,t;
}q[maxn];
pair<int,vector<int> > c[maxn];
int be[maxn];
int cntq,cntc,sz;
int cnt[maxn];struct rule{bool operator ()(const node & x,const node & y)const{if(be[x.l]!=be[y.l])return x.l<y.l;if(be[x.r]!=be[y.r])return x.r<y.r;return x.t<y.t;}
};
int sum;
int l=0,r,t;
void add(int x){for(auto i:pri[x]){if(++cnt[i]==1) sum++;}
}
void sub(int x){for(auto i:pri[x]){if(--cnt[i]==0) sum--;}
}
void upt(int x){if(c[x].first>=l&&c[x].first<=r){for(auto i:pri[c[x].first]){if(--cnt[i]==0) sum--;}for(auto i:c[x].second){if(++cnt[i]==1) sum++;}}swap(pri[c[x].first],c[x].second);
}
int ans[maxn];
int main(){get_prime(100000);int n,m;ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);cin>>n>>m;sz=pow(n,2.0/3.0);for(int i=1;i<=n;i++){int x;cin>>x;be[i]=i/sz+1;for(int k=1;k<=tot;k++){if(x==1) break;if(vis[x]==false){pri[i].push_back(x);break;}bool flag=false;while(x%prime[k]==0){x/=prime[k];flag=true;}if(flag){pri[i].push_back(prime[k]);}}}for(int i=1;i<=m;i++){int opt,x,y;cin>>opt>>x>>y;if(opt==1){c[++cntc].first=x;//c[cntc].second=y;for(int k=1;k<=tot;k++){if(y==1) break;if(vis[y]==false){c[cntc].second.push_back(y);break;}bool flag=false;while(y%prime[k]==0){y/=prime[k];flag=true;}if(flag){c[cntc].second.push_back(prime[k]);}}}else{q[++cntq].l=x;q[cntq].r=y;q[cntq].t=cntc;q[cntq].id=cntq;}}sort(q+1,q+cntq+1,rule());for(int i=1;i<=cntq;i++){while(r<q[i].r) add(++r);while(l>q[i].l) add(--l);while(r>q[i].r) sub(r--);while(l<q[i].l) sub(l++);while(t<q[i].t) upt(++t);while(t>q[i].t) upt(t--);ans[q[i].id]=sum;}for(int i=1;i<=cntq;i++) cout<<ans[i]<<endl;}

2.线段树

线段树上每个点维护一个bitset即可。
最原始的线段树是求得和,这里的话把求和改成求或即可。
注意要压缩一下bitset的使用空间,1e5大约有1e4个素数,我们不能开1e5的bitset,我们只需要开1e4的bitset即可,把1e4的素数按照大小安排在每个位置,类似于离散化。

#pragma GCC optimize(2)
#include<bits/stdc++.h>#define endl '\n'
//#define ll long longusing namespace std;
const int maxn=1e5+10;bitset<10000> s[maxn*2];bool vis[maxn];
int prime[maxn], tot;void get_prime(int n) {vis[1] = true;for(int i = 2; i <= n; ++ i) {if (!vis[i]) prime[++tot] = i;for(int j = 1; prime[j] <= n/i; ++ j) {vis[prime[j] * i] = true;if (i % prime[j] == 0) break;}}
}
vector<int> pri[maxn];
int mp[maxn];void build(int node,int start,int ends){if(start==ends){for(auto i:pri[start]){s[node][mp[i]]=1;//cout<<" debug "<<mp[i]<<endl;}return ;}int mid=(start+ends)/2;build(node*2,start,mid);build(node*2+1,mid+1,ends);s[node]=s[node*2+1]|s[node*2];
}void update(int node,int start,int ends,int pos){if(start==pos&&ends==pos){s[node].reset();for(auto i:pri[start]){s[node][mp[i]]=1;}return ;}int mid=(start+ends)/2;if(pos<=mid) update(node*2,start,mid,pos);else update(node*2+1,mid+1,ends,pos);s[node]=s[node*2+1]|s[node*2];}
bitset<10000> query(int node,int start,int ends,int l,int r){if(l<=start&&ends<=r){return s[node];}int mid=(start+ends)/2;bitset<10000> res;if(l<=mid) res|=query(node*2,start,mid,l,r);if(mid<r) res|=query(node*2+1,mid+1,ends,l,r);return res;
}int main(){get_prime(100000);int n,m;cin>>n>>m;for(int i=1;i<=tot;i++){mp[prime[i]]=i;}for(int i=1;i<=n;i++){int x;cin>>x;for(int k=1;k<=tot;k++){if(x==1) break;if(vis[x]==false){pri[i].push_back(x);break;}bool flag=false;while(x%prime[k]==0){x/=prime[k];flag=true;}if(flag){pri[i].push_back(prime[k]);}}}build(1,1,n);for(int i=0;i<m;i++){int opt,x,y;cin>>opt>>x>>y;if(opt==1){pri[x].clear();for(int k=1;k<=tot;k++){if(y==1) break;if(vis[y]==false){pri[x].push_back(y);break;}bool flag=false;while(y%prime[k]==0){y/=prime[k];flag=true;}if(flag){pri[x].push_back(prime[k]);}}update(1,1,n,x);}else{bitset<10000> ans=query(1,1,n,x,y);int cnt=ans.count();cout<<cnt<<endl;}}
}

牛客练习赛85 数学家的迷题 (带修莫队/线段树)相关推荐

  1. 牛客挑战赛48E-速度即转发【带修莫队,分块】

    正题 题目链接:https://ac.nowcoder.com/acm/contest/11161/E 题目大意 给出nnn个数字的一个序列,mmm个操作. 给出l,r,kl,r,kl,r,k,求一个 ...

  2. 牛客练习赛85 A~D题题解

    比赛链接:https://ac.nowcoder.com/acm/contest/11175 目录 A 科学家的模型 B 音乐家的曲调 C 哲学家的沉思 D 数学家的迷题 A 科学家的模型 模拟题,对 ...

  3. 2021牛客暑期多校训练营1 J-Journey among Railway Stations(线段树+思维转化)

    J-Journey among Railway Stations 注意区间合并时是否可行信息的合并. 假设线段树当前左节点lll维护的区间是[L,mid][L,\text{mid}][L,mid],右 ...

  4. 2021牛客多校1——J:Journey of Railway Stations(线段树)

    题面 题意: 一段路上有 N N N​​​​ 个火车站,每个火车站有一个合法时间段 [ u i , v i ] [u_i, v_i] [ui​,vi​]​​​​​,相邻两个火车站有一个长度 c o s ...

  5. 牛客OI周赛10-提高组:B-Taeyeon的困惑(值域线段树)

    做法 单点加单点删,在值域线段树上直接二分就能求值前\(K\)小的和 Code #include<bits/stdc++.h> typedef long long LL; const LL ...

  6. 牛客小白月赛16 F-小石的妹子(二维偏序+线段树)

    传送门 题意:是中文,自己看. 定义rkirk_irki​是第iii个人的编号 每次找到一些人iii满足不存在一个jjj使得aj>aia_j>a_iaj​>ai​且bj>aib ...

  7. [国家集训队]数颜色 / 维护队列 (带修莫队模板题)

    题意: 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔. 2. ...

  8. 牛客练习赛29 题解

    牛客练习赛29 A. 可持久化动态图上树状数组维护01背包 题解 这题跟标题没有任何关系- 贪心的使得负数删除的时候下标尽可能大,然后正数的时候下标尽可能小. 观察到每个数下标最大的时候就是它的初始下 ...

  9. 解题报告(一)C、(牛客练习赛41 F)简单数学题(数论 + FWT)(3.5)

    繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量题解和代码,题目难度不一定按照题号排序,我会在每道题后面加上题目难度指数(1∼51 \sim 51∼5),以模板题难度 11 ...

最新文章

  1. 图灵奖得主Judea Pearl :从“贝叶斯网络之父”到“AI社区的叛徒”
  2. 采购部管理--餐饮原料的验收管理
  3. 引用js或css后加?v= 版本号的用法
  4. 首次披露!阿里线下智能方案进化史
  5. 校招面试经验小分享,阿里腾讯美团字节实习offer
  6. 《spring-boot学习》-14-spring boot整合freeMarker模板
  7. Google 视频编码格式 VP9 究竟厉害在哪里
  8. tomcat8开启远程debug
  9. [转]Arrays.sort()你应该知道的事
  10. Anacond win10安装与介绍
  11. micro hdmi引脚定义义_系,意、义、意义,有理数的几何解释,合理存在的数(有理数)...
  12. Cookie与Session的区别-总结很好的文章
  13. 采用高通CRS8635的一款蓝牙耳机低功耗评测数据,供交流讨论!
  14. 巨头特斯拉的进击之路
  15. 随机过程之平稳过程与各态历经过程
  16. 为何要开办《微积分阅览室》?
  17. 打上花火(打ち上げ花火) --罗马音歌词中文谐音歌词
  18. Pb数字变成英文字母金额
  19. 自动滑动背景图片html,html背景图片滚动属性bgproperties
  20. DZ主题模板 Discuz迪恩淘宝客购物风格商业版模板

热门文章

  1. Django站点管理、视图和URL(管理界面本地化、创建管理员、注册模型类、发布内容到数据库、定义视图、配置URLconf)
  2. 数据挖掘·数据变换与离散化·概念分层与离散化·3-4-5规则
  3. ACMNO.31 C语言-宏求余 输入两个整数,求他们相除的余数。用带参的宏来实现,编程序。
  4. 彩色图像到灰度转换 常见方法汇总与对比
  5. 经验 | 机器学习要避开十大雷区
  6. 干货|对比理解不同概率估计和模型损失函数
  7. oracle收购Mysql后,Mysql的安装配置方法
  8. ActiveMQ持久化消息的三种方式
  9. 【转】文件恢复神器extundelete
  10. has been modified since the precompiled header