题意:给出一个序列,后q次询问,求给定区间gcd及整个序列有多少个序列的gcd和这个值相同

首先线段树维护区间gcd建树,之后预处理出每个gcd有多少个子序列,这时需要dp,

dp[i][tmp]表示以第i个数a[i]结尾的序列中有dp[i][tmp]个连续子序列的gcd值为tmp,dp[i]是一个map

那么,dp[i][tmp]如何求?显然,tmp是由dp[i-1]中所有gcd值与a[i]求gcd得到的,(因为是连续子序列的gcd值,所以由a[i-1]转移而来)。

这里加个滚动数组优化的思想,只需要两个unordered_map即可,最后用一个map的ans记录每个gcd值有多少个序列即可,复杂度应该位于o(nlogn)到o(n(logn)^2)之间

#include <bits/stdc++.h>
using namespace std;
using ll=long long;
const int maxn=1e5+;
ll gcd[maxn<<];
ll a[maxn];
void build(int l,int r,int rt)
{
if(l==r){
gcd[rt]=a[l];
return;
}
int m=(l+r)>>;
build(l,m,rt<<);
build(m+,r,rt<<|);
gcd[rt]=__gcd(gcd[rt<<],gcd[rt<<|]);
}
ll query(int L,int R,int l,int r,int rt)
{
if(L<=l&&r<=R)return gcd[rt];
int m=(l+r)>>;
ll res=;
if(L<=m)res=query(L,R,l,m,rt<<);
if(R>m)res=__gcd(res,query(L,R,m+,r,rt<<|));
return res;
}
unordered_map<ll,ll>ans;
unordered_map<ll,ll>dp[];
int main()
{
int t,ca=;
cin>>t;
while (t--)
{
int n;
cin>>n;
for(int i=;i<=n;i++)scanf("%lld",&a[i]);
dp[].clear();
dp[].clear();
build(,n,);
dp[][a[]]=;
ans[a[]]=;
for(int i=;i<=n;i++)
{
ans[a[i]]++;
dp[(i&)^][a[i]]=;
for(auto xy=dp[i&].begin();xy!=dp[i&].end();xy++)
{
ll tmp=__gcd(xy->first,a[i]);
dp[(i&)^][tmp]+=xy->second;
ans[tmp]+=xy->second;
}
dp[i&].clear();
}
int q;
cin>>q;
printf("Case #%d:\n",ca++);
while (q--)
{
int l,r;
scanf("%d%d",&l,&r);
ll res=query(l,r,,n,);
printf("%lld %lld\n",res,ans[res]);
}
}
return ;
}

HDU 5726 线段树+dp的更多相关文章

  1. hdu 4747 线段树/DP

    先是线段树 可以知道mex(i,i),mex(i,i+1)到mex(i,n)是递增的. 首先很容易求得mex(1,1),mex(1,2)......mex(1,n) 因为上述n个数是递增的. 然后使用 ...

  2. HDU 3607 线段树+DP+离散化

    题意:从左往右跳箱子,每个箱子有金币数量,只能从矮处向高处跳,求最大可获得金币数,数据规模1<=n<=1e5. 显然是一个dp的问题,不难得出dp[ i ] = max(dp[j] )+v ...

  3. HDU 3016 Man Down (线段树+dp)

    HDU 3016 Man Down (线段树+dp) Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Ja ...

  4. Tsinsen A1219. 采矿(陈许旻) (树链剖分,线段树 + DP)

    [题目链接] http://www.tsinsen.com/A1219 [题意] 给定一棵树,a[u][i]代表u结点分配i人的收益,可以随时改变a[u],查询(u,v)代表在u子树的所有节点,在u- ...

  5. hdu 5877 线段树(2016 ACM/ICPC Asia Regional Dalian Online)

    Weak Pair Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total ...

  6. hdu 3974 线段树 将树弄到区间上

    Assign the task Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  7. hdu 3436 线段树 一顿操作

    Queue-jumpers Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) To ...

  8. hdu 3397 线段树双标记

    Sequence operation Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  9. hdu 4578 线段树(标记处理)

    Transformation Time Limit: 15000/8000 MS (Java/Others)    Memory Limit: 65535/65536 K (Java/Others) ...

随机推荐

  1. error LNK2001: unresolved external symbol "public: __thiscall CWinAppEx::CWinAppEx(int)" (??0CWinApp

    1.这个是网上找的别人的解决办法,本人没试过 解决办法: 网上大多说的这类似问题是解决自定义类的,可是这个连接是系统CWinAppEx,网上查了很久也没找到原因,重装了vs也没解决.后面在google ...

  2. 13、java获取路径

    1.获取WEB-INF文件夹下的文件 /C:/Users/Administrator/Workspaces/MyEclipse%2010/day_38_spring_hibernate/WebRoot ...

  3. Windows 7旗舰版产品密钥

    http://www.xitongcheng.com/jiaocheng/win7_article_45903.html 一.Windows 7旗舰版产品密钥 零售版: Windows 7 Ultim ...

  4. 洛谷 P4173 残缺的字符串 (FFT)

    题目链接:P4173 残缺的字符串 题意 给定长度为 \(m\) 的模式串和长度为 \(n\) 的目标串,两个串都带有通配符,求所有匹配的位置. 思路 FFT 带有通配符的字符串匹配问题. 设模式串为 ...

  5. java-day19

    获取Stream流方法 根据Collection获取流 根据Map获取流 根据数组获取流 常用方法分为两种:延迟方法和终结方法 逐一处理:forEach 过滤:filter 映射:map 统计个数:c ...

  6. python调用tushare获取A股周线行情

    接口:weekly 描述:获取A股周线行情 限量:单次最大3700,总量不限制 积分:用户需要至少300积分才可以调取,具体请参阅本文最下方积分获取办法 注:tushare模块下载和安装教程,请查阅我 ...

  7. gary's mod

    第一题: class Parent(object): x = 1 class Child1(Parent): pass class Child2(Parent): pass print(Parent. ...

  8. 36-Ubuntu-用户管理-01-新建用户useradd

    创建用户/设置密码/删除用户/确认用户信息 序号 命令 作用 说明 01 sudo useradd -m -g 组名 新建用户名 添加新用户 -m 自动建立用户家目录 -g 指定用户所在的组,否则会建 ...

  9. 【洛谷】P1247取火柴游戏

    题目链接:https://www.luogu.org/problemnew/show/P1247 题意:nim取石子的题意,多了一个判断先手赢的话,输出先手第一把怎么拿,以及拿完之后每堆还剩多少. 题 ...

  10. 检测apache状态,当apache处于非running状态如何脚本启动

    编写脚本内容 #!/bin/bashURL="http://127.0.0.1/"curlit(){curl --connect-timeout 15 --max-time 20 ...