题意:给了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. python3 写一个简单的websocket程序(转)

    原贴:https://segmentfault.com/q/1010000009284816?_ea=1883181 也是找了好久 #! /usr/bin/env python # -*- codin ...

  2. C#.net mysql There is already an open datareader associated with this command引发的问题

    [参考]There is already an open datareader associated with this command引发的问题 我在语句中并未使用 DataReader,未何也提示 ...

  3. 【问题】Can't load AMD 64-bit .dll on a IA 32-bit platform

    文件下载地址:http://archive.apache.org/dist/tomcat/tomcat-connectors/native/1.2.14/binaries/ 按自己的提示找到32位或者 ...

  4. node 把文件封装一层文件夹

    把 pages 下面的单个js文件,封装上一个文件夹 var glob = require("glob"); const fs = require("fs-extra&q ...

  5. Linux上配置http上网代理

    有些局域网环境上网需要使用代理上网,图形界面的很好解决就设置一下浏览器的代理就好了,但是Linux纯命令行的界面就需要手动配置了. 如果要全局用户使用应用于所有的Shell,就需要修改 /etc/pr ...

  6. java学习(一)--- 基础语法

    学习内容来 自菜鸟教程 http://www.runoob.com/java/java-object-classes.html   Java基础 Java:一个Java程序可以认为是一系列的对象组合, ...

  7. linux命令sync,shutdown

    1.数据同步写入磁盘: sync 输入sync,那举在内存中尚未被更新的数据,就会被写入硬盘中 hling@hling:~$ sync   2.惯用的关机指令:shutdown 实例:

  8. 编写函数求整形数组a中存储的m个不重复的整数的第k大的整数(其中m>=1,1<=k<=m)很简单的一个思路是酱紫的:管他辣么多干啥,上来一把排序然后直接得答案

    /** * @author:(LiberHome) * @date:Created in 2019/2/28 20:38 * @description: * @version:$ *//*编写函数求整 ...

  9. python文件派生

    import time class Foo: x = 1 def __init__(self, y): self.y = y def __getattr__(self, item): # 没有的情况下 ...

  10. Golang go get第三方库的坑

    在树莓派上go get fail的问题记录及解决方案 go get github.com/terrancewong/serial # 错误为GOPATH路径的问题 cannot find packag ...