区间gcd问题 HDU 5869 离线+树状数组
题目大意:长度n的序列, m个询问区间[L, R], 问区间内的所有子段的不同GCD值有多少种. 子段就是表示是要连续的a[]
思路:固定右端点,预处理出所有的gcd,每次都和i-1的gcd比较,然后不断放入gcd即可。
然后就是树状数组的更新,枚举右端点即可。然后我们知道,大区间不如小区间来的实惠,所以我们每次有重复gcd出现的时候,都要把大区间更换成小区间即可
下午脑子有点不清楚。。。2333看别人的博客蒙了好久
//看看会不会爆int!数组会不会少了一维!
//取物问题一定要小心先手胜利的条件
#include <bits/stdc++.h>
using namespace std;
#define LL long long
#define ALL(a) a.begin(), a.end()
#define pb push_back
#define mk make_pair
#define fi first
#define se second
/*
先总体说一下思路:求出区间的gcd,再对右进行排序,再枚举右端即可
*/
const int maxn = 1e5 + ;
int tree[maxn], a[maxn], pre[maxn * ], ans[maxn];
int n, q;
vector<pair<int, int> >qq[maxn], v[maxn]; int lowbit(int x) {return x & -x;}
int gcd(int a, int b){
return b == ? a : gcd(b, a % b);
} void update(int x, int val){
for (int i = x; i <= n; i += lowbit(i)){
tree[i] += val;
}
} int sum(int x){
int ans = ;
for (int i = x; i > ; i -= lowbit(i)) ans += tree[i];
return ans;
} void solve(){
memset(pre, , sizeof(pre));
memset(tree, , sizeof(tree)); for (int i = ; i <= n; i++){
int len = v[i].size();
for (int j = ; j < len; j++){
pair<int, int> g = v[i][j];
if (pre[g.first]) update(pre[g.first], -);
pre[g.first] = g.second;
update(g.second, );
}
len = qq[i].size();
for (int j = ; j < len; j++){
pair<int, int> p = qq[i][j];
ans[p.second] = sum(i) - sum(p.first - );
}
}
for (int i = ; i <= q; i++){
printf("%d\n", ans[i]);
}
} int main(){
while (scanf("%d%d", &n, &q) == ){
for (int i = ; i <= n; i++){
scanf("%d", a + i);
v[i].clear();
qq[i].clear();
}
for (int i = ; i <= n; i++){
int len = v[i - ].size();
int val = a[i], pos = i;
for (int j = ; j < len; j++){
pair<int, int> p = v[i - ][j];
int g = gcd(p.first, val);
if (g != val) {
v[i].pb(mk(val, pos));///要优先知道那一个区间里面的gcd
val = g;
pos = p.second;
}
}
v[i].pb(mk(val, pos));
}
/*
for (int i = 1; i <= n; i++){
int len = v[i].size();
for (int j = 0; j < len; j++){
printf("%d&%d ", v[i][j].first, v[i][j].second);
}
printf("\n");
}
*/
for (int i = ; i <= q; i++){
int l, r; scanf("%d%d", &l, &r);
qq[r].pb(mk(l, i));
}
solve();
}
return ;
}
区间gcd问题 HDU 5869 离线+树状数组的更多相关文章
- HDU 5869 (离线+树状数组)
Problem Different GCD Subarray Query 题目大意 给定n个数的序列,有q个询问,每次询问一个区间中所有子区间所形成不同的gcd的数量. 解题分析 由于固定一个数为右端 ...
- 区间的关系的计数 HDU 4638 离线+树状数组
题目大意:给你n个人,每个人都有一个id,有m个询问,每次询问一个区间[l,r],问该区间内部有多少的id是连续的(单独的也算是一个) 思路:做了那么多离线+树状数组的题目,感觉这种东西就是一个模板了 ...
- HDU 4417 离线+树状数组
Super Mario Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- HDU - 4777 离线树状数组
离线树状数组搞一搞. #include<bits/stdc++.h> #define LL long long #define fi first #define se second #de ...
- 利用id来进行树状数组,而不是离散化以后的val HDU 4417 离线+树状数组
题目大意:给你一个长度为n的数组,问[L,R]之间<=val的个数 思路:就像标题说的那样就行了.树状数组不一定是离散化以后的区间,而可以是id //看看会不会爆int!数组会不会少了一维! / ...
- HDU 5249 离线树状数组求第k大+离散化
KPI Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- HDU 5869 Different GCD Subarray Query rmq+离线+数状数组
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5869 Different GCD Subarray Query Time Limit: 6000/3 ...
- hdu 4605 Magic Ball Game (在线主席树/离线树状数组)
版权声明:本文为博主原创文章,未经博主允许不得转载. hdu 4605 题意: 有一颗树,根节点为1,每一个节点要么有两个子节点,要么没有,每个节点都有一个权值wi .然后,有一个球,附带值x . 球 ...
- HDU 2852 KiKi's K-Number(离线+树状数组)
题目链接 省赛训练赛上一题,貌似不难啊.当初,没做出.离线+树状数组+二分. #include <cstdio> #include <cstring> #include < ...
随机推荐
- 多线程synchronized用例解析
当用synchronized来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码.即使在执行过程中,CPU切换到别的线程了,因为有锁的缘故,其他线程也不会进来执行代码,而 ...
- HDU 5898 odd-even number(2016沈阳网络选拔赛 数位DP)
定义DP[pos][pre][odd][even],pos代表当前数位,pre代表前一位的数值,odd代表到前一位连续的奇数个数,even代表到前一位连续偶数个数. odd和even肯定至少有一个为0 ...
- storage size of 'xxx' isn't known问题出现的可能原因之一
storage size of 'value' isn't known问题出现的可能原因之一 有可能是头文件没有包含起来,所以会出现这种问题可以从以下几个方面来查找原因:1.若是结构体类型,类型是否写 ...
- VBS调用keybd_event事件
----------------发送alt+v组合按键----------------------Set Wrap = CreateObject("DynamicWrapper") ...
- hdu_2608_0 or 1_数论
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=2608 反正我是没找出这个规律的,规律参考的别人的! /* 分析:假设数n=2^k*p1^s1*p2^s ...
- 无论url请求什么.都可以拼接class类名.实例化.传递get参数-->给当前控制器-->传递给抽象父类-->都交给抽象父类.这个方法去处理call_user_func_array()
<?phpdefine('DS','/');define('A_PATH',str_replace('\\','/',dirname(__FILE__)).DS); //01获取到主程序目录cl ...
- [Lua]Lua高级教程Metatables
什么是Metatable metatable是Lua中的重要概念,每一个table都可以加上metatable,以改变相应的table的行为. Metatables举例 -- 声明一个正常的关系变量 ...
- java 集合中将元素倒序排列
方法一:实现Comparable接口排序package collsort.comparable; package com.cvicse.sort.comparable; public class Ca ...
- 解读QML之三
QML语法 1.QML基本语法 1.1导入声明 导入声明允许客户端告诉QML引擎可以在QML文档中使用哪些模块,JavaScript资源以及组件目录.文档中可以使用的类型依赖于在文档中导入的模块.资源 ...
- C++设计模式-Singleton单例模式
template <typename T> class Singleton { public: template <typename... Args> static T* In ...