题目大意:

给定n个数

m个询问 询问l r区间内的孤独数的个数

孤独数的定义为在该区间内与其他所有数互质的数

看注释

#include <bits/stdc++.h>
using namespace std;
const int N=1e5+;
struct NODE {
int l,r,id;
bool operator <(const NODE& p)const {
return id>p.id;
}
}a[N], q[N];
bool cmp(NODE& p,NODE& q) {
return p.l<q.l;
}
int T[N];
void addT(int i,int x) {
while(i<=N) {
T[i]+=x;
i+=-i&i;
}
}
int sum(int i) {
int res=;
while(i) {
res+=T[i];
i-=-i&i;
} return res;
}
int n,m,cur[N],ans[N];
vector <int> vec[N];
bool isprime[N];
void prime() {
memset(isprime,,sizeof(isprime));
for(int i=;i<N;i++)
if(isprime[i]){
for(int j=i;j<N;j+=i)
isprime[j]=, vec[j].push_back(i);
}
}// 筛出质数表 vec[j]内为j的所有质因子
int main()
{
prime();
while(~scanf("%d%d",&n,&m)) {
memset(T,,sizeof(T));
memset(cur,,sizeof(cur));
for(int i=;i<=n;i++) {
int x; scanf("%d",&x);
a[i].l=, a[i].r=n+, a[i].id=i;
// 第i个数的最大互质区间为开区间(l,r)
for(int j=;j<vec[x].size();j++){
int t=vec[x][j];
if(cur[t]) {// cur[t]为上一个以t为质因子的数的位置
a[i].l=max(a[i].l,cur[t]);
a[cur[t]].r=min(a[cur[t]].r,a[i].id);
} // 处理第i个数x的最大互质区间
cur[t]=a[i].id; // 更新cur[t]
}
}
for(int i=;i<=m;i++)
scanf("%d%d",&q[i].l,&q[i].r), q[i].id=i;
sort(a+,a++n,cmp);
sort(q+,q++m,cmp);
priority_queue <NODE> que; // 保存树状数组维护的数 并按位置从小到大排
for(int i=,j=;i<=m;i++) {
// 若树状数组维护的区间中
// 有位置不包含在当前查询区间内部的 应该先清除
while(!que.empty() && que.top().id<q[i].l) {
addT(que.top().id,-);
addT(que.top().r,);
que.pop();
}
// 若有互质区间左端超过查询区间的左端
// 则有可能是查询区间内的孤独数 加入树状数组
while(j<=n && a[j].l<q[i].l) {
addT(a[j].id,);
addT(a[j].r,-); // 将该数所在的位置到其互质区间的右端加1
que.push((NODE){a[j].l,a[j].r,a[j].id});
j++;
}
ans[q[i].id]=sum(q[i].r);
// 第一个while()已经排除了位置在查询区间左端外的那些数
// 即此时sum(q[i].l-1)必等于0 所以不需要减去它
// 直接取查询区间右端的前缀和就可以了
}
for(int i=;i<=m;i++)
printf("%d\n",ans[i]);
} return ;
}

哈理工赛 H-小乐乐学数学 /// 筛法得素数表+树状数组的更多相关文章

  1. E - 卿学姐与城堡的墙(树状数组求逆序数)

    卿学姐与城堡的墙 Time Limit: 2000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit  ...

  2. 2017年中国大学生程序设计竞赛-中南地区赛暨第八届湘潭市大学生计算机程序设计大赛题解&源码(A.高斯消元,D,模拟,E,前缀和,F,LCS,H,Prim算法,I,胡搞,J,树状数组)

    A------------------------------------------------------------------------------------ 题目链接:http://20 ...

  3. 2019南京网赛 The beautiful values of the palace(思维,树状数组

    https://nanti.jisuanke.com/t/41298 题意:给一个n * n的螺旋矩阵,n保证是奇数,取一些点使其.获得价值,价值为数位和,然后再给q次查询,求矩阵中的价值总和 思路: ...

  4. [BZOJ5125]小Q的书架(决策单调性+分治DP+树状数组)

    显然有决策单调性,但由于逆序对不容易计算,考虑分治DP. solve(k,x,y,l,r)表示当前需要选k段,待更新的位置为[l,r],这些位置的可能决策点区间为[x,y].暴力计算出(l+r)/2的 ...

  5. 求序列A中每个数的左边比它小的数的个数(树状数组)

    给定一个有N个正整数的序列A(N<=10^5,A[i]<=10^5),对序列中的每一个数,求出序列中它左边比它小的数的个数. 思路:树状数组的经典应用(裸题) #include <i ...

  6. 2018牛客网暑假ACM多校训练赛(第五场)H subseq 树状数组

    原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round5-H.html 题目传送门 - https://www.no ...

  7. 19市赛 树状数组 第k个小的糖果

    int find_kth(int k) { , cnt = , i; ; i >= ; i--)/ { ans += ( << i); if (ans >= maxn|| cn ...

  8. 牛客小白月赛12 F 华华开始学信息学 (分块+树状数组)

    链接:https://ac.nowcoder.com/acm/contest/392/F来源:牛客网 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 32768K,其他语言65536K ...

  9. 计蒜客 41391.query-二维偏序+树状数组(预处理出来满足情况的gcd) (The Preliminary Contest for ICPC Asia Xuzhou 2019 I.) 2019年徐州网络赛)

    query Given a permutation pp of length nn, you are asked to answer mm queries, each query can be rep ...

随机推荐

  1. QtConcurrent::run() 的使用

    QFuture<T>run(constClass *object,T(Class::*fn)(Param1,Param2,Param3,Param4,Param5)const,constA ...

  2. Shell基本正则表达式和扩展正则表达式

    BRE和ERE的区别 基本正则表达式(BRE)和扩展正则表达式(ERE)的区别仅仅是元字符(meta charactor)的区别而已. BRE: 只有^$.*[]是元字符 ERE: ^$.[]*+() ...

  3. Maven 打包jar清单

    <project> ... <build> <plugins> <plugin> <groupId>org.apache.maven.plu ...

  4. Java方法中形参能否改变实参

    前几天学习了java中的参数传递机制,总结了一些知识点: 1·参数类型为基本数据类型:整型:byte,short,int,long ,浮点型:float,double ,字符型:char ,布尔型:b ...

  5. pair的用法

    如何定义?(初始化) 1. pair<int,int>p; 2.定义即初始化,也可以这个样子 pair<,); 里面的类型还可以是string,double等. 3.还可以这样子初始 ...

  6. 重大利好,Dubbo 3.0要来了。

    关于Dubbo的好消息,2018年1月8日,Dubbo创始人之一梁飞在Dubbo交流群里透露了Dubbo 3.0正在开工的重大消息. Dubbo是阿里开源的分布式框架,已经多年停止更新处于半死不活状态 ...

  7. python xlwt设置单元格的自定义背景颜色

    我使用python 2.7和xlwt模块进行excel导出 我想设置我知道可以使用的单元格的背景颜色 style1 = xlwt.easyxf('pattern: pattern solid, for ...

  8. 关于windows和linux系统更换JDK版本后,修改环境变量也无法生效的原因和解决办法

    今天遇到了一个问题: 我linux系统之前安装JDK12,今天将其改成了JDK1.8,并修改了环境变量,但是通过java -version命令显示的依旧是JDK12的版本. 这是因为,当使用安装版本的 ...

  9. 在windows server 2012中安装完oracle 11 client如何使用

    1.首先要添加监听配置,这样才可以没有报错的连接上服务器,至于如何添加,请自行搜索. 2.打开SQL  Plus连接oracle server端,这里因为是小白,看到命令行界面上来就需要输入用户名密码 ...

  10. Linux/CentOS 7 timezone 修改

    1.su - 登录root用户 2.timedatectl set-timezone {timezone} (set后面加想要设置的时区) 举例:timedatectl set-timezone As ...