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

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

讲道理真的好难啊= =

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. fiddler 插件开发二

    本篇主要讲解Fildder插件开发中的涉及到的主要接口与类. 1.IFiddlerExtension 接口 如果要开发的自定义插件有UI界面,则需要实现IFiddlerExtension 接口.你程序 ...

  2. express中ejs模板引擎

    1.在 app.js 中通过以下两个语句设置了 引擎类型 和页面模板的位置: app.set('views', __dirname + '/views'); app.set('view engine' ...

  3. linux后台执行命令&

    当在前台运行某个作业时,终端被该作业占据:而在后台运行作业时,它不会占据终端.可以使用&命令把作业放到后台执行. 如:30 2 * * * /data/app/scripts/hotbacku ...

  4. linux jps 命令

    参考: http://blog.csdn.net/gtuu0123/article/details/6025520 http://blog.csdn.net/alivetime/article/det ...

  5. mac 用 brew

    mac 下用   brew 安装插件, 有重复的不会再次安装,比xmap模式好

  6. SaaS系列介绍之九: SaaS营销模式分析

    1 配置模式 中国企业很多是人治,管理弹性非常大,公司的政策经常变化,管理流程.业务变化也非常大,发展也非常快;一个公司今年是10个人,明年是100个人,后年可能是1000人.管理机制.方法处于经常变 ...

  7. matlab 中保存某几个变量

    save  AOA.mat dingjiao RMSE%保存变量dingjiao,RMSE于AOA.mat clear all;%当删除所有数据之后 load AOA.mat%还可以读出这两个变量的数 ...

  8. CCS使用TIPS

    2013-06-20 09:37:49 CCS使用TIPS: 代码编写: CCS中通过Using CodeSense方便写代码,跟VC助手类似,具体使用方法在ccs的help中搜索using visu ...

  9. 各开源协议BSD,GPL,LGPL,Apache 2.0,mit等简介*

    快速阅读 分类 子分类 开源约定 BSD original BSD license.FreeBSD license.Original BSD license 为所欲为 Apache Licence 2 ...

  10. C#.Net 如何动态加载与卸载程序集(.dll或者.exe)4-----Net下的AppDomain编程 [摘录]

    最近在对AppDomain编程时遇到了一个问题,卸载AppDomain后,在内存中还保留它加载的DLL的数据,所以即使卸载掉AppDomain,还是无法更新它加载的DLL.看来只有关闭整个进程来更新D ...