素因子分解,树状数组。$ACM/ICPC$ $2013$杭州区域赛$H$题。

首先需要处理出数字$a[i]$左边最远到$L[i]$,右边最远到$R[i]$区间内所有数字都与$a[i]$互质。

那么对于左端点在$[L[i],i]$并且右端点在$[i,R[i]]$的询问,$a[i]$就可以作出一个贡献。

接下来的问题就可以转化为二维平面上有很多矩形,每次询问一个点被多少矩形覆盖。可以离线操作,类似于扫描线的思想做就可以了。

素因子分解需要一开始把$20$万个数字都处理好,避免每组测试数据内重复处理。

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<iostream> #include<queue>
using namespace std; const int maxn=2e5+;
int w[maxn],n,q;
struct X
{
int x,y,ans,id;
} s[maxn]; struct OP
{
int x,y1,y2;
} add[maxn],del[maxn]; bool com[maxn];
int primes, prime[maxn],L[maxn],R[maxn];
int pre[maxn];
int c[maxn],hh; vector<int>Prime[maxn]; int lowbit(int x) { return x&(-x); }
void ADD(int p, int val) { while (p <= n) c[p] = c[p] + val, p = p + lowbit(p); }
int sum(int p) { int r = ; while (p > ) r = r + c[p], p = p - lowbit(p); return r; }
void update(int L, int R, int val) { ADD(L, val); ADD(R + , -val); } void solve()
{
primes = ;
memset(com,false,sizeof(com));
com[] = com[] = true;
for (int i = ; i < maxn; ++i)
{
if (!com[i])
{
prime[++primes] = i;
}
for (int j = ; j <= primes && i*prime[j] < maxn; ++j)
{
com[i*prime[j]] = true;
if (!(i % prime[j]))
break;
}
} for(int i=;i<=;i++)
{
int tp = i;
for(int j=;j<=primes&&tp!=;j++)
{
if(tp%prime[j]) continue; Prime[i].push_back(prime[j]); while(!(tp%prime[j])) tp /= prime[j]; if(!com[tp]&&tp>)
{
Prime[i].push_back(tp);
break;
}
}
}
} bool cmp1(X a,X b) { return a.x<b.x; }
bool cmp2(OP a,OP b) { return a.x<b.x; }
bool cmp3(X a,X b) { return a.id<b.id; } int main()
{
solve(); while(~scanf("%d%d",&n,&q))
{
if(n==&&q==) break;
for(int i=; i<=n; i++) scanf("%d",&w[i]); for(int i=; i<=q; i++) scanf("%d%d",&s[i].x,&s[i].y), s[i].id=i;
sort(s+,s++q,cmp1); for(int i=;i<=;i++) pre[i]=;
for(int i=;i<=n;i++)
{
if(w[i]==) L[i]=;
else
{
L[i]=;
for(int j=;j<Prime[w[i]].size();j++)
{
L[i]=max(L[i],pre[Prime[w[i]][j]]+);
pre[Prime[w[i]][j]]=i;
}
}
} for(int i=;i<=;i++) pre[i]=n+;
for(int i=n;i>=;i--)
{
if(w[i]==) R[i]=n;
else
{
R[i]=n+;
for(int j=;j<Prime[w[i]].size();j++)
{
R[i]=min(R[i],pre[Prime[w[i]][j]]-);
pre[Prime[w[i]][j]]=i;
}
}
} int sz1=,sz2=;
for(int i=;i<=n;i++)
{
add[sz1].x=L[i]; add[sz1].y1=i; add[sz1].y2=R[i]; sz1++;
del[sz2].x=i; del[sz2].y1=i; del[sz2].y2=R[i]; sz2++;
} sort(add,add+sz1,cmp2);
sort(del,del+sz2,cmp2); int idq=,idadd=,iddel=; memset(c,,sizeof c); for(int i=;i<=n;i++)
{
while(idadd<sz1&&add[idadd].x==i)
{
update(add[idadd].y1,add[idadd].y2,);
idadd++;
}
while(idq<=q&&s[idq].x==i)
{
s[idq].ans=sum(s[idq].y);
idq++;
}
while(iddel<sz2&&del[iddel].x==i)
{
update(del[iddel].y1,del[iddel].y2,-);
iddel++;
}
} sort(s+,s++q,cmp3); for(int i=;i<=q;i++) printf("%d\n",s[i].ans); }
return ;
}

HDU 4777 Rabbit Kingdom的更多相关文章

  1. HDU 4777 Rabbit Kingdom(树状数组)

    HDU 4777 Rabbit Kingdom 题目链接 题意:给定一些序列.每次询问一个区间,求出这个区间和其它数字都互质的数的个数 #include <cstdio> #include ...

  2. HDU 4777 Rabbit Kingdom (2013杭州赛区1008题,预处理,树状数组)

    Rabbit Kingdom Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  3. HDU 4777 Rabbit Kingdom --容斥原理+树状数组

    题意: 给一个数的序列,询问一些区间,问区间内与区间其他所有的数都互质的数有多少个. 解法: 直接搞有点难, 所谓正难则反,我们求区间内与其他随便某个数不互质的数有多少个,然后区间长度减去它就是答案了 ...

  4. HDU 4777 Rabbit Kingdom 树状数组

    分析:找到每一个点的左边离他最近的不互质数,记录下标(L数组),右边一样如此(R数组),预处理 这个过程需要分解质因数O(n*sqrt(n)) 然后离线,按照区间右端点排序 然后扫一遍,对于当前拍好顺 ...

  5. hdu 4778 Rabbit Kingdom(减少国家)

    题目链接:hdu 4778 Rabbit Kingdom 题目大意:Alice和Bob玩游戏,有一个炉子.能够将S个同样颜色的宝石换成一个魔法石.如今有B个包,每一个包里有若干个宝石,给出宝石的颜色. ...

  6. hdu 4777 树状数组+合数分解

    Rabbit Kingdom Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

  7. P - 区间与其他数互质数的个数 HDU - 4777

    Rabbit Kingdom Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  8. hdu 5030 Rabbit&#39;s String(后缀数组&amp;二分法)

    Rabbit's String Time Limit: 40000/20000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others ...

  9. HDU 5030 Rabbit's String

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5030 题意:给出一个长度为n的串S,将S分成最多K个子串S1,S2,……Sk(k<=K).选出每 ...

随机推荐

  1. MVC5模板部署到mono

    VS2013中的MVC5模板部署到mono上的艰辛历程 2014-10-27 09:30 by FuzhePan, 3954 阅读, 46 评论, 收藏, 编辑 部署环境:CentOS7 + Mono ...

  2. 使用Windows2003创建AD服务器 - 进阶者系列 - 学习者系列文章

    Windows 2003的AD功能不是很强,但是还是提供了不错的功能.下面简要介绍下Windows 2003的AD配置说明. 1.  从添加删除Windows组件安装AD功能项 2.  完成安装.这里 ...

  3. Javascript实例技巧精选(8)—计算当月剩余天数

    >>点击这里下载完整html源码<< 截图如下: 利用Javascript在网页上计算当前月份的剩余天数,相应代码如下: <script language="J ...

  4. Dynamics CRM JS的调试的弊端解决办法

    说道CRMJS的调试的博客,之前已经有人写过.很简单,和平常网站JS的调试过程大致相同. 但是Dynamics 中JS调试最麻烦的莫过于出错之后需要修改代码了.因为随着JS代码的修改,伴随着需要保存和 ...

  5. Web API 2

    Asp.Net Web API 2 官网菜鸟学习系列导航[持续更新中]   前言 本来一直参见于微软官网进行学习的, 官网网址http://www.asp.net/web-api.出于自己想锻炼一下学 ...

  6. C#的匿名委托 和 Java的匿名局部内部类

    .NET:C#的匿名委托 和 Java的匿名局部内部类 目录 背景实验备注 背景返回目录 这几天重温Java,发现Java在嵌套类型这里提供的特性比较多,结合自身对C#中匿名委托的理解,我大胆的做了一 ...

  7. float的深入剖析

    float的深入剖析   float是什么? float即为浮动,在html中的作用是使元素脱离正常的文档流并使其移动到其父元素的“最左边”或“最右边”.下面解释下这个定义中的几个名词的概念: 文档流 ...

  8. IOS学习之路十六(UItableView 通过Prepare for segue 页面传值)

    当你点击一个UITableView 的section 或者cell的时候希望把值传到另一个页面(页面是通过segue跳转的),可以通过prepareforsegure 方法传值 (我的UITableV ...

  9. 应用程序入口 WSGIHandler

    Django 源码小剖: 应用程序入口 WSGIHandler WSGI 有三个部分, 分别为服务器(server), 应用程序(application) 和中间件(middleware). 已经知道 ...

  10. easyuidatagrid扩展--玩一下,无实际意义

    直接上代码 $.extend($.fn.datagrid.defaults.editors, { operater: { init: function (container, options) { v ...