题意:给了n个数,然后又m次查询,询问[L,R] 内有多少个数与其他的数不互质。

解:

我们首先可以通过处理得出每个数的有效区间,LR 就是 左边L位置上的数 和他不互质, 右边R位置上的数和不互质,

我们对于询问排序,R小的排前面,枚举每个R,在loc位置就将第loc个点在loc的位置加上一个1在loc的L(左不互质点)减一个1,再将枚举到该位的时候对于有在这个位置上R的点 在loc位置减1

在loc的L位置加1

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <string.h>
#include <vector>
#include <cmath>
using namespace std;
const int maxn=;
typedef long long LL;
bool vis[maxn];
int yinzi[maxn][],numofYZ[maxn];
void sieve()
{ memset(vis,false,sizeof(vis));
memset(numofYZ,false,sizeof(numofYZ));
for(LL i=; i<=; i++)
{
if(vis[i])continue;
yinzi[i][numofYZ[i]++]=i;
for(LL j=i+i; j<=; j+=i)
{
vis[j]=true;
yinzi[j][numofYZ[j]++]=i;
}
}
}
struct point{
int L,R,id;
bool operator <(const point &rhs)const {
return R<rhs.R||( R == rhs.R && L<rhs.L);
}
}wLR[maxn],Q[maxn];
int Loc[maxn];
int w[maxn];
vector<int>G[maxn];
void init(int n)
{
for(int i=; i<=n+; i++)
G[i].clear();
}
int n,m;
int C[maxn];
int lowbit(int x)
{
return x&(-x);
}
void add(int x,int v)
{
if(x<=)return ;
while(x<=n)
{
C[x]+=v;
x+=lowbit(x);
}
}
int sum(int x)
{
int ans=;
while(x>)
{
ans+=C[x];
x-=lowbit(x);
}
return ans;
}
int ans[maxn];
int main()
{
sieve();
while(scanf("%d%d",&n,&m)==&&n)
{
int maW=;
for(int i=; i<=n; i++)
{
scanf("%d",&w[i]);
maW=max(maW,w[i]);
}
memset(Loc,,sizeof(Loc));
for(int i=; i<=n; i++)
{
int ww=w[i];
int L=;
for(int j=; j<numofYZ[ ww ]; j++)
L=max(L,Loc[ yinzi[ ww ][ j ] ]);
wLR[i].L=L;
for(int j=; j<numofYZ[ ww ]; j++)
Loc[ yinzi[ ww ][ j ] ] = i;
}
for(int i=; i<=maW; i++)Loc[i]=n+;
for(int i=n; i>; i--)
{
int ww=w[i];
int R=n+;
for(int j=; j<numofYZ[ ww ]; j++)
R=min(R,Loc[ yinzi[ ww ][ j ] ]);
wLR[i].R=R;
G[R].push_back(i);
for(int j=; j < numofYZ[ ww ]; j++)
Loc[ yinzi[ww][ j ] ]=i;
}
for(int i=; i<m; i++)
{
Q[i].id=i;
scanf("%d%d",&Q[i].L,&Q[i].R);
}
sort(Q,Q+m);
int now=;
memset(C,,sizeof(C));
for(int i=; i<m; i++)
{
while(now<=Q[i].R)
{
for(int j=; j<G[now].size(); j++)
{
int to=G[now][j];
add(to,-);
add(wLR[to].L,);
}
add(now,);
add(wLR[now].L,-); now++;
}
ans[Q[i].id]=sum(Q[i].R)-sum(Q[i].L-);
}
for(int i=; i<m; i++)
printf("%d\n",ans[i]);
init(n);
}
return ;
}

hdu4777 树状数组的更多相关文章

  1. BZOJ 1103: [POI2007]大都市meg [DFS序 树状数组]

    1103: [POI2007]大都市meg Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2221  Solved: 1179[Submit][Sta ...

  2. bzoj1878--离线+树状数组

    这题在线做很麻烦,所以我们选择离线. 首先预处理出数组next[i]表示i这个位置的颜色下一次出现的位置. 然后对与每种颜色第一次出现的位置x,将a[x]++. 将每个询问按左端点排序,再从左往右扫, ...

  3. codeforces 597C C. Subsequences(dp+树状数组)

    题目链接: C. Subsequences time limit per test 1 second memory limit per test 256 megabytes input standar ...

  4. BZOJ 2434: [Noi2011]阿狸的打字机 [AC自动机 Fail树 树状数组 DFS序]

    2434: [Noi2011]阿狸的打字机 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 2545  Solved: 1419[Submit][Sta ...

  5. BZOJ 3529: [Sdoi2014]数表 [莫比乌斯反演 树状数组]

    3529: [Sdoi2014]数表 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1399  Solved: 694[Submit][Status] ...

  6. BZOJ 3289: Mato的文件管理[莫队算法 树状数组]

    3289: Mato的文件管理 Time Limit: 40 Sec  Memory Limit: 128 MBSubmit: 2399  Solved: 988[Submit][Status][Di ...

  7. 【Codeforces163E】e-Government AC自动机fail树 + DFS序 + 树状数组

    E. e-Government time limit per test:1 second memory limit per test:256 megabytes input:standard inpu ...

  8. 【BZOJ-3881】Divljak AC自动机fail树 + 树链剖分+ 树状数组 + DFS序

    3881: [Coci2015]Divljak Time Limit: 20 Sec  Memory Limit: 768 MBSubmit: 508  Solved: 158[Submit][Sta ...

  9. 树形DP+DFS序+树状数组 HDOJ 5293 Tree chain problem(树链问题)

    题目链接 题意: 有n个点的一棵树.其中树上有m条已知的链,每条链有一个权值.从中选出任意个不相交的链使得链的权值和最大. 思路: 树形DP.设dp[i]表示i的子树下的最优权值和,sum[i]表示不 ...

随机推荐

  1. laravel5.8笔记八:数据库(单库和多库)

    数据库配置:根目录下/.env, 单个数据库 .env配置 DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT= DB_DATABASE=shop DB_USE ...

  2. Java开发面试题整理(2019春招)

    一.Java基础部分 1. HashMap和Hashtable各有什么特点,它们有什么区别?(必背题,超级重要) HashMap和Hashtable都实现了Map接口,但决定用哪一个之前先要弄清楚它们 ...

  3. windows环境下命令打到服务中

    1.正常redis在本地命令行中启动,现在直接在服务中启动(tomcat同理) cmd下命令如下: sc create redis binPath= D:\redis\redis-server.exe ...

  4. monit配置文件

    监控模式:(MONITRING MODE) Monit支持三种监控模式, active--Monitj监控一个服务,为了防止一系列问题,Monit会执行以及发送警报,停止,启动,重启,这是一个缺省的模 ...

  5. Spark Distributed matrix 分布式矩阵

    RowMatrix行矩阵 import org.apache.spark.rdd.RDD import org.apache.spark.mllib.linalg.Vectors import org ...

  6. POJ - 3279(枚举+暴力)

    Fliptile Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 14297   Accepted: 5257 Descrip ...

  7. 设置头像、商品、轮播图为背景图时需要的css

    background-repeat: no-repeat;background-size: cover;background-position: center center;

  8. vue的插槽slot

    插槽是写在子组件上,用啦留给父级添加内容的位置接口: 1. 父级里的 <template :is='子标签名'>父插入内容</template>标签,里的内容       sl ...

  9. elk-Kibana设置登录认证-通过nginx转发(六)

    一.kibana的登录认证问题 kibana是nodejs开发的,本身并没有任何安全限制,直接浏览url就能访问,如果公网环境非常不安全,可以通过nginx请求转发增加认证,方法如下: tips:ki ...

  10. 二、JavaScript基础(1)

    1.JavaScript 基于对象和事件驱动的脚步语言,主要应用在客户端 特点:交互性(信息的动态交互).安全性(不可直接访问本地硬盘).跨平台性(只要可以解析js的浏览器 都可以执行,与平台无关) ...