HDU 4777 Rabbit Kingdom
素因子分解,树状数组。$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的更多相关文章
- HDU 4777 Rabbit Kingdom(树状数组)
HDU 4777 Rabbit Kingdom 题目链接 题意:给定一些序列.每次询问一个区间,求出这个区间和其它数字都互质的数的个数 #include <cstdio> #include ...
- HDU 4777 Rabbit Kingdom (2013杭州赛区1008题,预处理,树状数组)
Rabbit Kingdom Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- HDU 4777 Rabbit Kingdom --容斥原理+树状数组
题意: 给一个数的序列,询问一些区间,问区间内与区间其他所有的数都互质的数有多少个. 解法: 直接搞有点难, 所谓正难则反,我们求区间内与其他随便某个数不互质的数有多少个,然后区间长度减去它就是答案了 ...
- HDU 4777 Rabbit Kingdom 树状数组
分析:找到每一个点的左边离他最近的不互质数,记录下标(L数组),右边一样如此(R数组),预处理 这个过程需要分解质因数O(n*sqrt(n)) 然后离线,按照区间右端点排序 然后扫一遍,对于当前拍好顺 ...
- hdu 4778 Rabbit Kingdom(减少国家)
题目链接:hdu 4778 Rabbit Kingdom 题目大意:Alice和Bob玩游戏,有一个炉子.能够将S个同样颜色的宝石换成一个魔法石.如今有B个包,每一个包里有若干个宝石,给出宝石的颜色. ...
- hdu 4777 树状数组+合数分解
Rabbit Kingdom Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...
- P - 区间与其他数互质数的个数 HDU - 4777
Rabbit Kingdom Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- hdu 5030 Rabbit's String(后缀数组&二分法)
Rabbit's String Time Limit: 40000/20000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others ...
- HDU 5030 Rabbit's String
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5030 题意:给出一个长度为n的串S,将S分成最多K个子串S1,S2,……Sk(k<=K).选出每 ...
随机推荐
- Android-异步图像装载机
在ListView加载图像是非常常见的场景,图像加载几个要求满足以下的: (1)是否画面位于网络或本地上,装载不应同步.但应该异步加载,例如,使用AsyncTask. (2)为了避免重复下载图片和网页 ...
- VMWare 11安装操作系统 - 初学者系列 - 学习者系列文章
在2010年的时候,我写过一篇关于VMWare的安装操作系统的博文.但是今天在QQ群里有人问起VMWare安装操作系统的问题,虽然回答了,但是回头看了下当时那篇博文,决定重新写一文. 首先要获取VMW ...
- sql2005还原超长sql脚本,还原超大脚本文件
原文:sql2005还原超长sql脚本,还原超大脚本文件 从外网把数据库用导出脚本的方式导出来了,280M的样子,导是导出来了,但是在本机执行sql脚本的时候,直接就是out of memory,之前 ...
- 我的Android 4 学习系列之Intent 和 Broadcast Reciever
目录 Intent 简介 使用隐式和显式Intent启动Activity.子Acitivity和Service 使用Linkify 使用Broadcast Intent 广播事件 使用 Pending ...
- 用HTML和javascript(JS)计算触屏手机手指滑动方向的演示
移动终端的流行,程序员希望通过HTML+JS完成触屏动作的识别.下面给出具体实现的例子,供大家参考. 将下面的代码复制并保存,用手机访问,现在的手机浏览器一般都支持触屏,针对本演示来讲就是支持三个js ...
- Linux环境下搭建php开发环境的操作步骤
本文主要记载了通过编译方式进行软件/开发环境的安装过程,其他安装方式忽略! 文章背景: 因为php和Apache等采用编译安装方式进行安装,然而编译安装方式,需要c,c++编译环境, 通过apt方式安 ...
- 青铜器RDM全面支持CMMI、GJB5000A L2~L5认证评估
青铜器RDM全面实现对CMMI L4.GJB5000A L4的100%支持,并且已经成为众多组织CMMI.GJB5000A落地执行的有效手段,避免认证与执行2张皮,有利于体系的贯彻执行,以下是青铜器R ...
- MS SQL优化
数据库优化实践[MS SQL优化开篇] 数据库定义: 数据库是依照某种数据模型组织起来并存在二级存储器中的数据集合,此集合具有尽可能不重复,以最优方式为特定组织提供多种应用服务,其数据结构独立于应 ...
- iOS Web开发激活css的active伪类
最近在做一个资讯客户端,用到UIWebview展示一些网页内容,本来想做一个简单的按压效果,发现在css中设置active属性一直不管用. 查阅了一下资料,今天发现,要让css active伪类生效, ...
- 图解Javascript之Function
好东西分享给大家,但要尊重事实!!!因此特别说明:本图非我本人亲自所作,乃我大天朝网友所绘制.个人感觉此图,覆盖全面,细节考虑甚周全,因此分享给大家,同时在此特别感谢网友的无私分享!