hdu4777 树状数组
题意:给了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 树状数组的更多相关文章
- BZOJ 1103: [POI2007]大都市meg [DFS序 树状数组]
1103: [POI2007]大都市meg Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2221 Solved: 1179[Submit][Sta ...
- bzoj1878--离线+树状数组
这题在线做很麻烦,所以我们选择离线. 首先预处理出数组next[i]表示i这个位置的颜色下一次出现的位置. 然后对与每种颜色第一次出现的位置x,将a[x]++. 将每个询问按左端点排序,再从左往右扫, ...
- codeforces 597C C. Subsequences(dp+树状数组)
题目链接: C. Subsequences time limit per test 1 second memory limit per test 256 megabytes input standar ...
- BZOJ 2434: [Noi2011]阿狸的打字机 [AC自动机 Fail树 树状数组 DFS序]
2434: [Noi2011]阿狸的打字机 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 2545 Solved: 1419[Submit][Sta ...
- BZOJ 3529: [Sdoi2014]数表 [莫比乌斯反演 树状数组]
3529: [Sdoi2014]数表 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1399 Solved: 694[Submit][Status] ...
- BZOJ 3289: Mato的文件管理[莫队算法 树状数组]
3289: Mato的文件管理 Time Limit: 40 Sec Memory Limit: 128 MBSubmit: 2399 Solved: 988[Submit][Status][Di ...
- 【Codeforces163E】e-Government AC自动机fail树 + DFS序 + 树状数组
E. e-Government time limit per test:1 second memory limit per test:256 megabytes input:standard inpu ...
- 【BZOJ-3881】Divljak AC自动机fail树 + 树链剖分+ 树状数组 + DFS序
3881: [Coci2015]Divljak Time Limit: 20 Sec Memory Limit: 768 MBSubmit: 508 Solved: 158[Submit][Sta ...
- 树形DP+DFS序+树状数组 HDOJ 5293 Tree chain problem(树链问题)
题目链接 题意: 有n个点的一棵树.其中树上有m条已知的链,每条链有一个权值.从中选出任意个不相交的链使得链的权值和最大. 思路: 树形DP.设dp[i]表示i的子树下的最优权值和,sum[i]表示不 ...
随机推荐
- 使用git创建与合并分支
一.概述 学会使用git命令对项目进行创建分支,并在创建结束后合并到主分支上. 问:为什么要创建分支? 答:在原来的分支上创建一个自己的分支进行开发,在开发完毕后一次性合并到原先的分支,这样既保证安全 ...
- LiDAR、LAS、LAS Dataset与点云
LiDAR Light Detection And Ranging,激光探测及测距,是一种光学遥感技术,使用激光对地球表面的密集采样,产生高精度X.Y.Z测量值. 激光雷达系统的主要硬件组成部分包括一 ...
- TCP是如何保证可靠传输的
TCP 协议如何保证可靠传输 一.综述 1.确认和重传:接收方收到报文就会确认,发送方发送一段时间后没有收到确认就重传. 2.数据校验 3.数据合理分片和排序: UDP:IP数据报大于1500字节 ...
- MXPlayer ac3音轨支持问题
下载的MXPlayer 在播放kvm视频的时候没有声音, 说是不支持ac3的音频 到官网下载单独的解码包: https://mxplayerdownloads.com/mx-player-ac3-dt ...
- Python sqlite3操作笔记
创建数据库 def create_tables(dbname): conn = sqlite3.connect(dbname) print "Opened database successf ...
- hbase region still in transition
1,删除hbase中的 hbase:meta表中相应的region的row 如; get 'hbase:meta','kylin_metadata,,1481101316881.f3b4c7c1148 ...
- IE8下动态生成option无法设置文本内容
问题: 1.在IE8下,JS动态添加 option 的时候,value 有值,但是文本内容添加不上 例:<option value="北京"></option&g ...
- python基础类型—字符串
字符串str 用引号引起开的就是字符串(单引号,双引号,多引号) 1.字符串的索引与切片. 索引即下标,就是字符串组成的元素从第一个开始,初始索引为0以此类推. a = 'ABCDEFGHIJK' p ...
- eclipse安装反编译decompiler方式一
(转发位置:https://www.cnblogs.com/zs-notes/p/8991503.html) eclipse安装JD-eclipse反编译插件 1.在eclipse的help中选择In ...
- js的小知识7
1.函数都有返回值...... 而方法的本质也是函数,所有也有返回值. Document.getElementById()返回的是获取的标签 getElementByClassName()和getEl ...