hdu4777-Rabbit Kingdom
题意:求区间内与其他任何数都互质的数的个数。
题解:求出每个数左右互质的边界。然后对询问排序,通过树状数组求解。
讲道理真的好难啊= =
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的更多相关文章
- HDU-4777 Rabbit Kingdom(区间更新求和)
题目大意:给一个n个整数的数列,q次询问,每次询问区间[l,r]中与区间中其它数互质的数的个数.. 题目分析:离线处理,这里以询问区间的左端点从小到大的顺序为例.为了叙述方便,用f(l,r)表示区间[ ...
- HDU 4777 Rabbit Kingdom (2013杭州赛区1008题,预处理,树状数组)
Rabbit Kingdom Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- hdu 4778 Rabbit Kingdom(减少国家)
题目链接:hdu 4778 Rabbit Kingdom 题目大意:Alice和Bob玩游戏,有一个炉子.能够将S个同样颜色的宝石换成一个魔法石.如今有B个包,每一个包里有若干个宝石,给出宝石的颜色. ...
- HDU 4777 Rabbit Kingdom(树状数组)
HDU 4777 Rabbit Kingdom 题目链接 题意:给定一些序列.每次询问一个区间,求出这个区间和其它数字都互质的数的个数 #include <cstdio> #include ...
- HDU 4777 Rabbit Kingdom --容斥原理+树状数组
题意: 给一个数的序列,询问一些区间,问区间内与区间其他所有的数都互质的数有多少个. 解法: 直接搞有点难, 所谓正难则反,我们求区间内与其他随便某个数不互质的数有多少个,然后区间长度减去它就是答案了 ...
- 2013杭州现场赛B题-Rabbit Kingdom
杭州现场赛的题.BFS+DFS #include <iostream> #include<cstdio> #include<cstring> #define inf ...
- HDU 4777 Rabbit Kingdom 树状数组
分析:找到每一个点的左边离他最近的不互质数,记录下标(L数组),右边一样如此(R数组),预处理 这个过程需要分解质因数O(n*sqrt(n)) 然后离线,按照区间右端点排序 然后扫一遍,对于当前拍好顺 ...
- HDU 4777 Rabbit Kingdom
素因子分解,树状数组.$ACM/ICPC$ $2013$杭州区域赛$H$题. 首先需要处理出数字$a[i]$左边最远到$L[i]$,右边最远到$R[i]$区间内所有数字都与$a[i]$互质. 那么对于 ...
- 【一坨理论AC的题】Orz sxy大佬
1.UVA10891 Game of Sum 2.LA4254 Processor . 3.UVA10905 Children's Game 4.UVA11389 The Bus Driver Pro ...
- 【HDU 5030】Rabbit's String (二分+后缀数组)
Rabbit's String Problem Description Long long ago, there lived a lot of rabbits in the forest. One d ...
随机推荐
- 从零开始运维之旅:如何监控你的 Windows?
小弟乃刚刚踏入运维圈的资深小白一枚,正所谓完事开头难,公司里怕我把生产系统搞坏就让我先在测试环境上先练练手.巧的是测试环境又是我熟悉的 Windows 环境,心中窃喜啊.但问题随之而来,运维从何下手呢 ...
- ***php 数组添加关联元素的方法小结(关联数组添加元素)
我们这里介绍的是在数组中再增加关联数组了,这个就合成了多维数组,下面我来给大家举几个实例,希望对各位同学会有所帮助哈. 在"php 数组添加元素方法总结这篇文章中介绍了如何给数组添加元素,那 ...
- POJ 1797 Heavy Transportation(Dijkstra)
http://poj.org/problem?id=1797 题意 :给出N个城市M条边,每条边都有容量值,求一条运输路线使城市1到N的运输量最大. 思路 :用dijkstra对松弛条件进行变形.解释 ...
- Android ViewPager的每个页面的显示与销毁的时机
大家在用viewPager的时候要创建一个pagerAdapter对象,用于给viewPager设置页面的. viewPager里面有一个container容器. viewPager的容器缓存3个显示 ...
- Shell中调用、引用、包含另一个脚本文件的三种方法
脚本 first (测试示例1) first#!/bin/bashecho 'your are in first file' 方法一:使用source #!/bin/bashecho 'your ar ...
- SPRING IN ACTION 第4版笔记-第八章Advanced Spring MVC-006-Pizza例子的支付流程
一. 1. 2.payment-flow.xml <?xml version="1.0" encoding="UTF-8"?> <flow x ...
- Oracl 动态执行表不可访问,本会话的自动统计被禁止
oracle ---建立SQL窗体 写入 select * from tableA; 弹出错误窗口 : 动态执行表不可访问,本会话的自动统计被禁止.在执行菜单里你可以禁止统计,或在v$session, ...
- 函数重载二义性:error C2668: 'pow' : ambiguous call to overloaded function
2013-07-08 14:42:45 当使用的函数时重载函数时,若编译器不能判断出是哪个函数,就会出现二义性,并给出报错信息. 问题描述: 在.cpp代码中用到pow函数,如下: long int ...
- Android开发经验记录
一. 代码规范 定一个规范的主要目的,是为了让不同的开发人员写的代码能保持一致性,方便别人看自己的代码.另外,对个人来说,也能起到让自己看着舒服的作用. 1. 基本 * 使用UTF-8 ...
- OneNote快捷键
转载自:http://onenoter.com/2013/04/5792 记录笔记和设置笔记格式 键入和编辑笔记 若要执行此操作 按 打开一个新的 OneNote 窗口. Ctrl+M 打开一个小的 ...