题意:求区间内与其他任何数都互质的数的个数。

题解:求出每个数左右互质的边界。然后对询问排序,通过树状数组求解。

讲道理真的好难啊= =

http://blog.csdn.net/dyx404514/article/details/15507209 这个博客讲的最清楚(竟然是戴神的博客=。= 听过戴神讲splay,现在还不会……

#include <bits/stdc++.h>

using namespace std;

const int N = ;

/***素数打表***/
int p[N];
int is_p[N+];
int cnt_p;
void get_p() {
for (int i = ; i <= N; ++i) is_p[i] = ;
cnt_p = is_p[] = is_p[] = ;
for (int i = ; i <= N; ++i) {
if (is_p[i]) {
p[cnt_p++] = i;
for (int j = i * ; j <= N; j += i) is_p[j] = ;
}
}
}
/***因数分解***/
int fac[N]; // 记录出现的因数
int cal_fac(int x) {
int tmp = x;
int idx = ;
int i;
for (i = ; p[i] <= tmp/p[i]; ++i) {
if (tmp%p[i]) continue;
while (tmp%p[i] == ) tmp /= p[i];
fac[idx++] = p[i];
}
if (tmp != ) fac[idx++] = tmp;
return idx;
}
/***计算每个数互质的最左最右区间***/
int l[N], r[N];
int adj[N];
int a[N];
void cal_inv(int n) {
for (int i = ; i < N; ++i) adj[i] = ;
for (int i = ; i <= n; ++i) {
int cnt = cal_fac(a[i]);
l[i] = ;
for (int j = ; j < cnt; ++j) {
l[i] = max(l[i], adj[fac[j]]);
adj[fac[j]] = i;
}
}
for (int i = ; i < N; ++i) adj[i] = n+;
for (int i = n; i >= ; --i) {
r[i] = n+;
int cnt = cal_fac(a[i]);
for (int j = ; j < cnt; ++j) {
r[i] = min(r[i], adj[fac[j]]);
adj[fac[j]] = i;
}
}
} struct node {
int l, r, id;
bool operator<(const node x) const { return l < x.l; }
} qry[N]; int bit[N];
int lowbit(int x) { return x&-x; }
void add(int x, int v, int n) { while(x<=n) bit[x]+=v,x+=lowbit(x); }
int sum(int x) { int ans=; while(x) ans+=bit[x],x-=lowbit(x); return ans; } vector<int> lb[N]; // lb[i] 以i为左边界的数
int ans[N];
int main() {
//freopen("in.txt", "r", stdin);
get_p();
int n, k;
while (~scanf("%d%d", &n, &k)) {
if (n == ) break;
for (int i = ; i <= n; ++i) {
scanf("%d", a+i);
}
cal_inv(n); for (int i = ; i < k; ++i) {
scanf("%d%d", &qry[i].l, &qry[i].r);
qry[i].id = i;
}
sort(qry, qry+k);
for (int i = ; i <= n; ++i) lb[i].clear();
memset(bit, , sizeof bit);
for (int i = ; i <= n; ++i) {
if (!l[i]) { add(i, , n); add(r[i], -, n); }
else lb[l[i]].push_back(i);
}
int pos = ;
for (int i = ; i < k; ++i) {
while (qry[i].l > pos) {
add(pos, -, n);
add(r[pos], , n);
for (unsigned j = ; j < lb[pos].size(); ++j) {
int x = lb[pos][j];
add(x, , n);
add(r[x], -, n);
}
pos++;
}
ans[qry[i].id] = sum(qry[i].r)-sum(qry[i].l-);
}
for (int i = ; i < k; ++i) {
printf("%d\n", ans[i]);
}
} return ;
}

hdu4777-Rabbit Kingdom的更多相关文章

  1. HDU-4777 Rabbit Kingdom(区间更新求和)

    题目大意:给一个n个整数的数列,q次询问,每次询问区间[l,r]中与区间中其它数互质的数的个数.. 题目分析:离线处理,这里以询问区间的左端点从小到大的顺序为例.为了叙述方便,用f(l,r)表示区间[ ...

  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 4778 Rabbit Kingdom(减少国家)

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

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

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

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

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

  6. 2013杭州现场赛B题-Rabbit Kingdom

    杭州现场赛的题.BFS+DFS #include <iostream> #include<cstdio> #include<cstring> #define inf ...

  7. HDU 4777 Rabbit Kingdom 树状数组

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

  8. HDU 4777 Rabbit Kingdom

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

  9. 【一坨理论AC的题】Orz sxy大佬

    1.UVA10891 Game of Sum 2.LA4254 Processor . 3.UVA10905 Children's Game 4.UVA11389 The Bus Driver Pro ...

  10. 【HDU 5030】Rabbit's String (二分+后缀数组)

    Rabbit's String Problem Description Long long ago, there lived a lot of rabbits in the forest. One d ...

随机推荐

  1. stl map高效遍历删除的方法

    for(:iter!=mapStudent.end():) {      if((iter->second)>=aa)      {          //满足删除条件,删除当前结点,并指 ...

  2. 压缩/解压 zip 时遇到 java.lang.IllegalArgumentException: MALFORMED

    因为zip文件名为中文,或者压缩内容有中文 解决方法: 错误详情: SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinde ...

  3. 缺少编译器要求的成员“System.Runtime.CompilerServices.ExtensionAttribute..ctor” 解决方案

    静态类中添加如下.此方法本人测试有效. //缺少编译器要求的成员“ystem.Runtime.CompilerServices.ExtensionAttribute..ctor” namespace  ...

  4. NEERC 2014, Eastern subregional contest

    最近做的一场比赛,把自己负责过的题目记一下好了. Problem B URAL 2013 Neither shaken nor stirred 题意:一个有向图,每个结点一个非负值,可以转移到其他结点 ...

  5. (转)Android系统自带样式(@android:style/)

    在AndroidManifest.xml文件的activity中配置 1.android:theme="@android:style/Theme" 默认状态,即如果theme这里不 ...

  6. ajax返回son数据

    JSON 只是一种文本字符串.它被存储在 responseText 属性中 为了读取存储在 responseText 属性中的 JSON 数据,需要根据 JavaScript 的 eval 语句. 函 ...

  7. jquery的smartWizard插件使用方法

    jquery 的smartWizard插件常用在一些向导式的,按步骤的功能中,是的用户按照我们设定的步骤进行操作,这样一方面有较好的用户体验,可以将庞大的表格 数据分解成多个步骤,是的每个步骤的数据量 ...

  8. Flex 选项卡加载方式简介

    Flex中选项卡默认只加载选中的选项,所以在初始化的时候给其他的选项卡中的对象赋值或是其他操作,都会出现空对象错误. 解决办法:给选项卡设置属性 creationPolicy=”all” 如:< ...

  9. 基于Android Studio搭建Android应用开发环境

    备注:电脑是windows xp系统 1.     安装JDK和环境变量设置 JDK是java development kit,Java JDK下载地址 http://www.oracle.com/t ...

  10. 配置oschina for pc 开发环境

    oschina for pc 是一款用python + pyqt + html + css +js开发的桌面程序,感觉十分强大.python开发快捷, 网页技术绚丽,正是桌面程序需要的. 感谢铂金小鸟 ...