HDU 5726 线段树+dp
题意:给出一个序列,后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的更多相关文章
- hdu 4747 线段树/DP
先是线段树 可以知道mex(i,i),mex(i,i+1)到mex(i,n)是递增的. 首先很容易求得mex(1,1),mex(1,2)......mex(1,n) 因为上述n个数是递增的. 然后使用 ...
- HDU 3607 线段树+DP+离散化
题意:从左往右跳箱子,每个箱子有金币数量,只能从矮处向高处跳,求最大可获得金币数,数据规模1<=n<=1e5. 显然是一个dp的问题,不难得出dp[ i ] = max(dp[j] )+v ...
- HDU 3016 Man Down (线段树+dp)
HDU 3016 Man Down (线段树+dp) Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Ja ...
- Tsinsen A1219. 采矿(陈许旻) (树链剖分,线段树 + DP)
[题目链接] http://www.tsinsen.com/A1219 [题意] 给定一棵树,a[u][i]代表u结点分配i人的收益,可以随时改变a[u],查询(u,v)代表在u子树的所有节点,在u- ...
- 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 ...
- hdu 3974 线段树 将树弄到区间上
Assign the task Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- hdu 3436 线段树 一顿操作
Queue-jumpers Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) To ...
- hdu 3397 线段树双标记
Sequence operation Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
- hdu 4578 线段树(标记处理)
Transformation Time Limit: 15000/8000 MS (Java/Others) Memory Limit: 65535/65536 K (Java/Others) ...
随机推荐
- mongdb 备份还原导入导出
-------------------MongoDB数据导入与导出------------------- 1.导出工具:mongoexport 1.概念: mongoDB中的m ...
- elasticsearch中TermQuery查不到数据问题
在java rest client中调用elasticsearch中的数据,精准匹配的termQuery查不到数据,这个问题是java rest client客户端自带的bug,换用matchPhra ...
- 您应升级到 MySQL 5.5.0 或更高版本。 phpmyadmin
最近又折腾LAMP了.从官方下载的phpmyadmin在部署的时候发现 “您应升级到 MySQL 5.5.0 或更高版本”.原因是我安装的mysql数据库版本过低. 解决思路: 1.升级mysql版本 ...
- Apache Flink 整体介绍
前言 Flink 是一种流式计算框架,为什么我会接触到 Flink 呢?因为我目前在负责的是监控平台的告警部分,负责采集到的监控数据会直接往 kafka 里塞,然后告警这边需要从 kafka topi ...
- sed 删除含有某个字符串的行 (在文件txt)
#删除a.txt中含有“aaa”的行 sed -i “/aaa/d” a.txt
- Gerrit(0): Install and Config
Install(Ubuntu 17.04): apt-get install default-jre daemon [nginx] #Other OS: install openjdk8-jre [n ...
- 拾遗:Gentoo 使用笔记
零.使用 Git 源 mkdir /etc/portage/repos.conf cd !$ vi gentoo.conf [DEFAULT] main-repo = gentoo [gentoo] ...
- localStorage使用总结(转载)
localStorage使用总结 本文转载自:https://www.cnblogs.com/st-leslie/p/5617130.html(点击标题可跳转至原文) 一.什么是localStora ...
- JFreeChart架构
本章介绍给大家介绍 JFreeChart 不同类中如何交互的概念, JFreeChart基本类层次和应用水平的架构在基于Java应用程序如何工作的. 类层次架构 类层次架构解释了如何把不同阶层的相互库 ...
- 利用OpenFileDialog 获取图片存储到数据库中
private void button1_Click(object sender, EventArgs e) { string fName; ...