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 ...
随机推荐
- Makefile教程
Makefile学习教程: 跟我一起写 Makefile 0 Makefile概述 0.1 关于程序的编译和链接 1 Makefile 介绍 1.1 Makefile的规则 1.2 一个示例 1.3 ...
- 【形式化方法:VDM++系列】3.基于VDM++的图书管理系统需求定义
接前文:http://www.cnblogs.com/Kassadin/p/4091040.html 1.Before We Start: 在开始图书管理系统需求定义之前,需要先进行一些说明. 1.1 ...
- 【转】win7如何设置共享目录,并且访问不需要输入用户名和密码。
1.打开guest帐号,guest帐号默认情况下是不启用的 进入控制面板->用户帐户->管理其他帐户->激活Gust用户 2,右击共享目录,属性->共享->共享-> ...
- 102. Binary Tree Level Order Traversal
题目: Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to ri ...
- Tableau
http://tableau.analyticservice.net/desktop.html
- 再分析 返回值加引用&,const
本文主要分析,返回&,和返回值加const的作用. 返回& 定义一个数组模板: template<class T>class Array{ enum{size = 100} ...
- String.IndexOf String.IndexOf String.Substring
String.IndexOf String.IndexOf 方法 (Char, Int32, Int32)报告指定字符在此实例中的第一个匹配项的索引.搜索从指定字符位置开始,并检查指定数量的字符位置. ...
- 【HDOJ】4317 Unfair Nim
基本的状态压缩,想明白怎么dp还是挺简单的.显然对n个数字进行状态压缩,dp[i][j]表示第i位状态j表示的位向高位产生了进位. /* 4317 */ #include <iostream&g ...
- Java面试题-锁
1. 什么是可重入锁(ReentrantLock)? 答: java.util.concurrent.lock 中的 Lock 框架是锁定的一个抽象,它允许把锁定的实现作为 Java 类,而不是作 ...
- C++ volatile的作用
volatile的作用 2006-10-23 13:44:21 大 中 小 关键在于两个地方: 1. 编译器的优化 (请高手帮我看看下面的理解) 在本次线程内, 当读取一个变量时,为提 ...