hdu5726-GCD-ST表+二分
先用st表处理出所有l-r的GCD值,然后二分求得这些值一共出现了多少次。
#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
const int maxn=;
using namespace std;
typedef pair<int,int> P;
int l,r;
int icase;
int t,n,q;
int a[maxn+];
int dp[maxn+][];
map<int,long long> m;
int gcd(int a,int b){
return b==?a:gcd(b,a%b);
}
void RMQ(){
for(int i=;i<=n;i++){
dp[i][]=a[i];
}
for(int j=;j<;j++){
for(int i=;i<=n;i++){
if(i+((<<(j-))-)<=n)
dp[i][j]=gcd(dp[i][j-],dp[i+(<<(j-))][j-]);
//printf("%d\n",dp[i][j]);
}
}
}
int query(int l,int r){
int k=(int)log2(double(r-l+));
return gcd(dp[l][k],dp[r-(<<k)+][k]);
}
void Cal(){
for(int i=;i<=n;i++){
int GCD=a[i],tail=i;
while(tail<=n){
int lb=tail,ub=n,mid=(lb+ub)>>;
while(ub-lb>){
mid=(lb+ub)>>;
if(query(i,mid)==GCD) lb=mid;
else ub=mid;
}
if(query(i,ub)==GCD){
m[GCD]+=(ub-tail+);
tail=ub+;
GCD=query(i,tail);
} else if(query(i,mid)==GCD){
m[GCD]+=(mid-tail+);
tail=mid+;
GCD=query(i,tail);
}
else{
m[GCD]+=(lb-tail+);
tail=lb+;
GCD=query(i,tail);
}
}
}
}
void solve(){
scanf("%d",&n);
for(int i=;i<=n;i++){
scanf("%d",&a[i]);
}
RMQ();
Cal();
scanf("%d",&q);
printf("Case #%d:\n",++icase);
while(q--){
scanf("%d%d",&l,&r);
int res=query(l,r);
printf("%d %I64d\n",res,m[res]);
}
}
void init(){
m.clear();
memset(dp,,sizeof(dp));
}
int main()
{
scanf("%d",&t);
while(t--){
init();
solve();
}
return ;
}
hdu5726-GCD-ST表+二分的更多相关文章
- 2016多校联合训练1 D题GCD (ST表+二分)
暑假颓废了好久啊...重新开始写博客 题目大意:给定10w个数,10w个询问.每次询问一个区间[l,r],求出gcd(a[l],a[l+1],...,a[r])以及有多少个区间[l',r']满足gcd ...
- GCD(st表+二分)
GCD Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submis ...
- 「ZJOI2018」胖(ST表+二分)
「ZJOI2018」胖(ST表+二分) 不开 \(O_2\) 又没卡过去是种怎么体验... 这可能是 \(ZJOI2018\) 最简单的一题了...我都能 \(A\)... 首先我们发现这个奇怪的图每 ...
- 【BZOJ-4310】跳蚤 后缀数组 + ST表 + 二分
4310: 跳蚤 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 180 Solved: 83[Submit][Status][Discuss] De ...
- BZOJ4556 [Tjoi2016&Heoi2016]字符串 SA ST表 二分答案 主席树
原文链接https://www.cnblogs.com/zhouzhendong/p/BZOJ4556.html 题目传送门 - BZOJ4556 题意 给定一个长度为 $n$ 的字符串 $s$ . ...
- hdu5289 ST表+二分
用裸的St表+暴力枚举查询时稳TLE的,可以枚举每个区间的起点+二分满足条件的区间右端,这样复杂度是O(nlogn) #include<iostream> #include<cstr ...
- luoguP5108 仰望半月的夜空 [官方?]题解 后缀数组 / 后缀树 / 后缀自动机 + 线段树 / st表 + 二分
仰望半月的夜空 题解 可以的话,支持一下原作吧... 这道题数据很弱..... 因此各种乱搞估计都是能过的.... 算法一 暴力长度然后判断判断,复杂度\(O(n^3)\) 期望得分15分 算法二 通 ...
- 洛谷P4501/loj#2529 [ZJOI2018]胖(ST表+二分)
题面 传送门(loj) 传送门(洛谷) 题解 我们对于每一个与宫殿相连的点,分别计算它会作为多少个点的最短路的起点 若该点为\(u\),对于某个点\(p\)来说,如果\(d=|p-u|\),且在\([ ...
- ZSTU 4241 圣杯战争(ST表+二分)
题目链接 ZSTU 4241 问题转化为有很多区间,现在每次给定一个区间求这个区间和之前所有区间中的某一个的交集的最大长度. 强制在线. 首先我们把所有的区间预处理出来. 然后去重(那些被包含的小区 ...
- Codeforces 713D Animals and Puzzle(二维ST表+二分答案)
题目链接 Animals and Puzzle 题意 给出一个1e3 * 1e3的01矩阵,给出t个询问,每个询问形如x1,y1,x2,y2 你需要回答在以$(x1, y1)$为左上角,$(x1, ...
随机推荐
- BZOJ 1579 [Usaco2009 Feb]Revamping Trails 道路升级:dijkstra 分层图【将k条边改为0】
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1579 题意: 给你一个无向图,n个点,m条边,每条边有边权w[i]. 你可以将其中的k(k ...
- RQNOJ 514 字串距离:dp & 字符串
题目链接:https://www.rqnoj.cn/problem/514 题意: 设有字符串X,我们称在X的头尾及中间插入任意多个空格后构成的新字符串为X的扩展串,如字符串X为”abcbcd”,则字 ...
- dynamic 作为参数传入另一个程序集,获取值
dynamicOBJ.GetType().GetProperty("key").GetValue(dynamicOBJ, null)
- linux 进程学习笔记-暂停进程
<!--[if !supportLists]-->Ÿ <!--[endif]-->暂停进程 int pause() 其会挂起当前进程直到有信号来唤醒或者进程被结束. 随便提一下 ...
- Thread,Service和AsyncTask
Thread,Service和AsyncTask这三种东西,似乎都是用来执行后台耗时操作的: 印象里Service是「超过5s的耗时操作就应该放进去」,但是Service实际上仍然是主线程,所以,在S ...
- robotium 测试APK<一> 建立测试工程
1.准备Android开发环境 2.准备签名工具http://www.troido.de/re-sign.jar 1.建立测试工程 打开Eclipse,点击File->New一个Android ...
- Tensorflow知识点学习
1.TensorFlow中Tensor维度理解: (1)对于2维Tensor 0维对应列 1维对应行 (2)维度操作举例: 对于k维的,tf.reduce_sum(x, axis=k-1)的结果是对最 ...
- mysql5.1的编译安装 ----针对第一次安装mysql的
由于是第一次安装,不能确定你是否有安装编译和mysql所要依赖的插件,使用我是当做你最原始的安装环境. 1.安装mysql5.1的依赖包 yum install -y gcc gcc-c++ aut ...
- 关于Android的HAL的一些理解
之前一直在学习基于Linux内核的一些字符型驱动的编程,对Linux内核驱动也算有了一些基本的了解吧,后来也做过一些基于Linux内核的驱动开发,像基于Android的CC1101高频模块的驱动开发, ...
- UDK游戏打包详解
转自:http://blog.sina.com.cn/s/blog_944177030100ycki.html 安装完的udk目录下有4个主要的文件夹 Binaries -这个文件夹包含游戏的exe程 ...