HDU_5729_rmq+二分
2024-10-08 07:55:52
http://acm.hdu.edu.cn/showproblem.php?pid=5726
rmq修改成gcd的,关键是找个数,用二分来找,刚开始理解了好久,因为每个区间内gcd是递减的,所以可以优化暴力枚举。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<map>
using namespace std; int a[],n,dp[][];
map<int,long long> mp;
int gcd(int a,int b)
{
return b?gcd(b,a%b):a;
} void rmq_init(int len)
{
for(int i = ;i <= len;i++)
{
dp[i][] = a[i];
} for(int j = ;(<<j) <= len;j++)
{
for(int i = ;i+(<<j)- <= len;i++)
{
dp[i][j] = gcd(dp[i][j-],dp[i+(<<(j-))][j-]);
}
}
} int rmq_query(int l,int r)
{
int k = (int)(log((double)(r-l+))/log(2.0));
return gcd(dp[l][k],dp[r-(<<k)+][k]);
} int main()
{
int T;
scanf("%d",&T);
for(int z = ;z <= T;z++)
{
mp.clear();
printf("Case #%d:\n",z);
scanf("%d",&n);
for(int i = ;i <= n;i++) scanf("%d",&a[i]);
rmq_init(n);
for(int i = ;i <= n;i++)
{
int l = i,r = i;
while(r <= n)
{
int ll = r,rr = n;
int v = rmq_query(l,r);
while(ll <= rr)
{
int mid = (ll+rr)/;
if(rmq_query(l,mid) >= v) ll = mid+;
else rr = mid-;
}
mp[v] += ll-r;
r = ll;
}
}
int t;
scanf("%d",&t);
while(t--)
{
int l,r;
scanf("%d%d",&l,&r);
int ans = rmq_query(l,r);
printf("%d %lld\n",ans,mp[ans]);
}
}
return ;
}
最新文章
- Unity、c#中的拓展方法讲解
- [BZOJ3751][NOIP2014] 解方程
- 操作系统开发系列—11.ELF格式 ●
- windows内核编程之常用数据结构
- BS架构与CS架构的区别(最全)
- PHP开发异步高性能的MySQL代理服务器
- listagg( ) within group ( order by ) 与 wm_concat
- cadence遇到的问题(持续更新)
- Java基础知识强化之IO流笔记07:自定义的异常概述和自定义异常实现
- Tcl语言笔记之二
- 通过Java反射调用方法
- 移动UI
- python多线程爬虫设计及实现示例
- LINUX 笔记-read命令
- SQL 增加列、修改列、删除列
- ES5的完美继承
- Unity Shader Graph(一)初次尝试
- 使用jQuery+huandlebars防止编码注入攻击
- uniGUI试用笔记(九)
- rsync 通过服务的方式同步 linux系统日志 screen工具