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).选出每 ...
随机推荐
- Java集合之LinkedHashSet源码分析
1.简介 我们知道Set不允许包含相同的元素,如果试图把两个相同元素加入同一个集合中,add方法返回false.根据源码实现中的注释我们可以知道LinkedHashSet是具有可预知迭代顺序的Set接 ...
- 通过Transaction Log(fn_dblog)取回被删除的数据
最近跟 James 讨论为何「ApexSQL Log」这个工具可以读到被删除的数据呢? 原来它是透过 Transaction Log 来读取数据的! 于是透过 Transaction Log 到网络上 ...
- c#生成word文档
参考:http://blog.163.com/zhouchunping_99/blog/static/7837998820085114394716/ 生成word文档 生成word文档 view pl ...
- Remoting接口测试工具
动手写一个Remoting接口测试工具 基于.NET开发分布式系统,经常用到Remoting技术.在测试驱动开发流行的今天,如果针对分布式系统中的每个Remoting接口的每个方法都要写详细的测试脚本 ...
- 订单处理(c#实现)
State模式的经典应用场景:订单处理(c#实现) State模式在对象内部状态发生变化的时候,改变自身的行为,这通常是通过切换内部状态对象实现的,对象将自身在各个状态的行为推给了状态对象,从而解开了 ...
- Bootstrap 网格系统
自版本 2.3.2 起,Bootstrap 提供了两种类型的网格,默认网格系统和流动网格系统.默认的网格系统是 940px 宽和 12 列.本文主要讲解第一种. 首先让我们看,怎么来应用默认网格系统 ...
- DesignMode的状态处理
自定义控件开发的调试及DesignMode的状态处理 在开发Winform程序的时候,我们往往需要根据需要做一些自定义的控件模块,这样可以给系统模块重复利用,或者实现更好的效果等功能.但在使用的时候, ...
- IOS开发小功能2:二维码扫描界面的设计(横线上下移动)
效果图如上,实现的是一个二维码扫描界面. 下面我贴出线条上下移动的代码,至于二维码的代码是用的第三方库. 首先是整体的结构: 注意下面的库文件一个都不能少,否则会报错. TLTiltHighlight ...
- Leetcode:Minimus Depth of Binary Tree
The problem description: Given a binary tree, find its minimum depth. The minimum depth is the numbe ...
- “git push”后返回“Error 403”解决方法
问题描述: 1,mac ox系统,terminal上运行命令git push出现403错误: 2,代码是在别人的github(暂且叫origin branch吧)上克隆的,修改和添加了部分代码后欲提交 ...