Rabbit Kingdom

Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 40    Accepted Submission(s): 20

Problem Description
  Long long ago, there was an ancient rabbit kingdom in the forest. Every rabbit in this kingdom was not cute but totally pugnacious, so the kingdom was in chaos in season and out of season.
  n rabbits were numbered form 1 to n. All rabbits' weight is an integer. For some unknown reason, two rabbits would fight each other if and only if their weight is NOT co-prime.
  Now the king had arranged the n rabbits in a line ordered by their numbers. The king planned to send some rabbits into prison. He wanted to know that, if he sent all rabbits between the i-th one and the j-th one(including the i-th one and the j-th one) into prison, how many rabbits in the prison would not fight with others.
  Please note that a rabbit would not fight with himself.
 
Input
  The input consists of several test cases.
  The first line of each test case contains two integer n, m, indicating the number of rabbits and the queries.
  The following line contains n integers, and the i-th integer Wi indicates the weight of the i-th rabbit.
  Then m lines follow. Each line represents a query. It contains two integers L and R, meaning the king wanted to ask about the situation that if he sent all rabbits from the L-th one to the R-th one into prison.
  (1 <= n, m, Wi <= 200000, 1 <= L <= R <= n)
  The input ends with n = 0 and m = 0.
 
Output
  For every query, output one line indicating the answer.
 
Sample Input
3 2
2 1 4
1 2
1 3
6 4
3 6 1 2 5 3
1 3
4 6
4 4
2 6
0 0
 
Sample Output
2
1
1
3
1
2

Hint

  In the second case, the answer of the 4-th query is 2, because only 1 and 5 is co-prime with other numbers in the interval [2,6] .

 
Source
 

关键是在预处理,每个数预处理出L,R区间,表示左右和这个数不互质的位置。

这个只要从左到右和从右到左扫描一遍,分解质因素,找下一个质因素的位置。

然后对于每个查询进行离线处理,按照右端点排序。

遇到i,在L处+1, 遇到R,在i处+1,在L处-1.

 /* ***********************************************
Author :kuangbin
Created Time :2013-11-9 14:38:41
File Name :E:\2013ACM\专题强化训练\区域赛\2013杭州\1008.cpp
************************************************ */ #include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <time.h>
using namespace std; const int MAXN = ;
int prime[MAXN+];
void getPrime()
{
memset(prime,,sizeof(prime));
for(int i = ;i <= MAXN;i++)
{
if(!prime[i])prime[++prime[]] = i;
for(int j = ;j <= prime[] && prime[j] <= MAXN/i;j++)
{
prime[prime[j]*i] = ;
if(i % prime[j] == )break;
}
}
}
long long factor[][];
int fatCnt;
int getFactors(long long x)
{
fatCnt = ;
long long tmp = x;
for(int i = ;prime[i] <= tmp/prime[i];i++)
{
factor[fatCnt][] = ;
if(tmp % prime[i] == )
{
factor[fatCnt][] = prime[i];
while(tmp % prime[i] == )
{
factor[fatCnt][]++;
tmp /= prime[i];
}
fatCnt++;
}
}
if(tmp != )
{
factor[fatCnt][] = tmp;
factor[fatCnt++][] = ;
}
return fatCnt;
}
int L[MAXN],R[MAXN];
int a[MAXN];
int b[MAXN];
int n,m;
int lowbit(int x)
{
return x & (-x);
}
int c[MAXN];
void add(int i,int val)
{
if(i == )return;
while(i <= n)
{
c[i] += val;
i += lowbit(i);
}
}
int sum(int i)
{
int s = ;
while(i > )
{
s += c[i];
i -= lowbit(i);
}
return s;
}
vector<int>vec[MAXN];
struct Node
{
int l,r;
int index;
void input()
{
scanf("%d%d",&l,&r);
}
};
bool cmp(Node p1,Node p2)
{
return p1.r < p2.r;
}
Node node[MAXN];
int ans[MAXN];
int pp[MAXN][];
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
getPrime();
while(scanf("%d%d",&n,&m) == )
{
if(n == && m == )break;
for(int i = ;i <= n;i++)
scanf("%d",&a[i]);
for(int i = ;i < m;i++)
{
node[i].input();
node[i].index = i;
}
for(int i = ;i < MAXN;i++)b[i] = n+;
for(int i = n;i >= ;i--)
{
getFactors(a[i]);
R[i] = n+;
pp[i][] = fatCnt;
for(int j = ;j < fatCnt;j++)
{
R[i] = min(R[i],b[factor[j][]]);
b[factor[j][]] = i;
pp[i][j+] = factor[j][];
}
}
for(int i = ;i < MAXN;i++)b[i] = ;
for(int i = ;i <= n;i++)
{
//getFactors(a[i]);
L[i] = ;
fatCnt = pp[i][];
for(int j = ;j < fatCnt;j++)
{
factor[j][] = pp[i][j+];
L[i] = max(L[i],b[factor[j][]]);
b[factor[j][]] = i;
}
}
sort(node,node+m,cmp);
memset(c,,sizeof(c));
for(int i = ; i <= n+;i++)
{
c[i] = ;
vec[i].clear();
}
for(int i = ;i <= n;i++)vec[R[i]].push_back(i);
int id = ;
for(int i = ;i < m;i++)
{
while(id <= n && id <= node[i].r)
{
add(L[id],);
int sz = vec[id].size();
for(int j = ;j < sz;j++)
{
int v = vec[id][j];
add(L[v],-);
add(v,);
}
id++;
}
ans[node[i].index] = sum(node[i].r) - sum(node[i].l-);
ans[node[i].index] = node[i].r - node[i].l + - ans[node[i].index];
}
for(int i = ;i < m;i++)printf("%d\n",ans[i]); }
return ;
}

HDU 4777 Rabbit Kingdom (2013杭州赛区1008题,预处理,树状数组)的更多相关文章

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

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

  2. HDU 4777 Rabbit Kingdom

    素因子分解,树状数组.$ACM/ICPC$ $2013$杭州区域赛$H$题. 首先需要处理出数字$a[i]$左边最远到$L[i]$,右边最远到$R[i]$区间内所有数字都与$a[i]$互质. 那么对于 ...

  3. HDU 5458 Stability(双连通分量+LCA+并查集+树状数组)(2015 ACM/ICPC Asia Regional Shenyang Online)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5458 Problem Description Given an undirected connecte ...

  4. HDU 5869 Different GCD Subarray Query (GCD种类预处理+树状数组维护)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5869 问你l~r之间的连续序列的gcd种类. 首先固定右端点,预处理gcd不同尽量靠右的位置(此时gc ...

  5. HDU 4778 Gems Fight! (2013杭州赛区1009题,状态压缩,博弈)

    Gems Fight! Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 327680/327680 K (Java/Others)T ...

  6. HDU 4771 Stealing Harry Potter's Precious (2013杭州赛区1002题,bfs,状态压缩)

    Stealing Harry Potter's Precious Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 ...

  7. HDU 4770 Lights Against Dudely (2013杭州赛区1001题,暴力枚举)

    Lights Against Dudely Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...

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

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

  9. HDU 4777 Rabbit Kingdom 树状数组

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

随机推荐

  1. 我的android学习经历40

    为listview设置背景,并且不随拖动改变 <ListView android:id="@+id/list_view" android:layout_width=" ...

  2. How can I view currently running MySQL queries?( 查看正在运行的MySQL语句/脚本命令)

    show processlist;show processlist\G;SHOW FULL PROCESSLIST;SHOW FULL PROCESSLIST\G; REF:http://dev.my ...

  3. docker图形界面工具

    好久不打开docker运行环境,执行命令出现下面的情况 bgddeMBP:~ bgd$ sudo docker info Cannot connect to the Docker daemon. Is ...

  4. Oracle数据备份bat

    @echo on setlocal rem 设置数据库和备份文件参数... set sid=testorcl set username=testname set password=testpwd se ...

  5. Python编程练习题

    1 求可用被17整除的所有三位数 for num in range(99,1000): if num % 17 == 0: print num ps:下面的写法和上面的写法性能的差距,上面好吧? fo ...

  6. windows下MySQL 5.7+ 解压缩版安装配置方法

    方法来自伟大的互联网. 1.去官网下载.zip格式的MySQL Server的压缩包,根据需要选择x86或x64版.注意:下载是需要注册账户并登录的. 2.解压缩至你想要的位置. 3.复制解压目录下m ...

  7. android DevicePolicyManager实现一键锁屏

    本文章一部分资料来源于网上 1.实现一键锁屏关键是DevicePolicyManager这个类,然后使用lockNow():方法. 2.DevicePolicyManager类,可以让你的做软件获得系 ...

  8. Linux_导出函数

    1.linux 下查看 .so 导出函数列表(http://blog.csdn.net/wangweixaut061/article/details/7164809) nm -D 7z.so objd ...

  9. SCCM 2007日志

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://ycrsjxy.blog.51cto.com/618627/203174      ...

  10. CentOS PPTP配置FreeRADIUS+DaloRADIUS实现高级用户控制+流量控制

    前提条件 阅读本文前,您需要搭建好PPTP,如果仍未搭建,可以参考:http://www.xj123.info/2301.html 如果您需要配置DaloRADIUS,那么您还需要安装LAMP,可以参 ...