HDU 5381 The sum of gcd 询问区间内所有子区间的GCD和 [暴力法]

HDU 5381 The sum of gcd 询问区间内所有子区间的GCD和 [莫队算法] 预处理+莫队,需要抓住 gcd 的本质。 阅读详情

题意:给出N个数,M个询问,对于每个询问,有一组[L,R],输出这个区间内所有子区间的GCD和。

范围:T<=3,N,M<=10000

解法:离线处理+暴力,从右至左,处理出加入一个新数a[pos]时,以pos为左端点时,R作为右端点时的gcd,R∈[pos,N],这些GCD记为b[pos,R],可知每个数最多改变logN次,所以求解出所有阶段的b[]只需要nlogn的复杂度。对于每个询问,即是B[L,R]+B[L+1,R]....+B[R,R],最坏情况下是O(N),M个询问,复杂度为O(N*M)


正解应该是莫队,有待学习,此方法900ms卡过。

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
#include<iostream>
#include<stdlib.h>
#include<set>
#include<map>
#include<queue>
#include<vector>
#include<bitset>
#pragma comment(linker, "/STACK:1024000000,1024000000")
template <class T>
bool scanff(T &ret){ //Faster Input
    char c; int sgn; T bit=0.1;
    if(c=getchar(),c==EOF) return 0;
    while(c!='-'&&c!='.'&&(c<'0'||c>'9')) c=getchar();
    sgn=(c=='-')?-1:1;
    ret=(c=='-')?0:(c-'0');
    while(c=getchar(),c>='0'&&c<='9') ret=ret*10+(c-'0');
    if(c==' '||c=='\n'){ ret*=sgn; return 1; }
    while(c=getchar(),c>='0'&&c<='9') ret+=(c-'0')*bit,bit/=10;
    ret*=sgn;
    return 1;
}
#define inf 1073741823
#define llinf 4611686018427387903LL
#define PI acos(-1.0)
#define lth (th<<1)
#define rth (th<<1|1)
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define drep(i,a,b) for(int i=a;i>=b;i--)
#define gson(i,root) for(int i=ptx[root];~i;i=ed[i].next)
#define tdata int testnum;scanff(testnum);for(int cas=1;cas<=testnum;cas++)
#define mem(x,val) memset(x,val,sizeof(x))
#define mkp(a,b) make_pair(a,b)
#define findx(x) lower_bound(b+1,b+1+bn,x)-b
#define pb(x) push_back(x)
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;

int n,m;
ll c[11111],a[11111],b[11111],d[11111],ans[11111];

struct node{
    int idx,ql,qr;
}ask[11111];
bool cmp(node x,node y){
    return x.ql>y.ql;
}
int gcd(int x,int y){
    if(y==0)return x;
    else return gcd(y,x%y);
}
void change(int pos){
    b[pos]=a[pos];
    int t=b[pos];
    rep(i,pos+1,n){
        t=gcd(t,a[i]);
        if(t==b[i]||b[i]==1){
            b[i]=t;
            break;
        }
        b[i]=t;
    }
}
int main(){
    tdata{
        scanff(n);
        rep(i,1,n)scanff(a[i]),b[i]=0,c[i]=0,d[i]=0;
        scanff(m);
        rep(i,1,m){
            ask[i].idx=i;
            scanff(ask[i].ql);
            scanff(ask[i].qr);
        }
        sort(ask+1,ask+1+m,cmp);
        int k=1;
        drep(i,n,1){
            change(i);
            rep(j,i,n){
                c[j]+=b[j];
                d[j]=d[j-1]+c[j];
            }
            while(ask[k].ql==i&&k<=m){
                ans[ask[k].idx]=d[ask[k].qr];
                k++;
            }
        }
        rep(i,1,m)printf("%lld\n",ans[i]);
    }
    return 0;
}

离线安装WSL2系统 由于办公环境在内网环境中,需将开发环境部署到内网中。环境:内网:win10。 阅读详情

相关推荐

ThinkPHP 8.1 + think-swoole 4.1 实战:5分钟搞定WebSocket聊天室(附完整代码)

本文详细介绍了如何使用ThinkPHP 8.1和think-swoole 4.1快速构建高并发WebSocket聊天室。通过5分钟实战教程,开发者可以轻松实现用户列表、消息广播等核心功能,支持2000+并发连接,适用于客服系统、在线协作等实时通信场景。

ol789012345的博客 126

【HDU5726】GCD(区间GCD查询+统计区间gcd为k的区间个数----线段树/st表+思维)

题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=5726 题目: 给一个数组a,大小为n,接下来有m个询问,每次询问给出l、r,定义f[l,r]=gcd(al,al+1,...,ar),问f[l,r]的值 和 有多少对(l',r')使得f[l',r']=f[l,r]。n<=1e5,m<=1e5,1<=l<=r<=n,1...

Cassie_zkq的博客 1422

从FER2013到AffectNet:表情识别数据集十年演进史与你的项目选型攻略

本文回顾了从FER2013到AffectNet等主流人脸表情识别数据集的十年演进历程,详细分析了各数据集的特点、适用场景及技术突破。针对不同项目需求,提供了从移动端应用到高精度研究的选型策略,特别强调AffectNet在现代FER项目中的核心价值,并给出混合数据集构建的实战方案。

weixin_26808439的博客 522

HDU 5381 The sum of gcd

题意: 有一列数,Q个询问区间,求所有子区间的GCD值之和。 思路:线段树先处理区间左右端点都在同一线段树结点内的情况,再加上各在左右子树的情况,即得到当前结点的所有子区间GCD之和。             需要维护[L,R]区间的所有[L,X]区间和[Y,R]的GCD值,可以发现这些不同的GCD不超过log(ai)个,并且具有递减性质。 #include #include #incl

CSU_ACM Solution Library 429

【ArcGIS遇上Python】批量提取多波段影像至单个波段

本案例基于ArcGIS python,将landsat影像的7个波段影像数据,批量提取至单个波段。

智慧空间实验室 2073

【WRF-UCM】BEP+BEM 模拟:README

【WRF-UCM】BEP+BEM 模拟:README

WW、forever的博客 223

codeforces1098E Fedya the Potter

题面 题意 给出一个长度为n的序列a,将它的所有子区间的gcd计算出来并存入数组b(长度为n∗(n+1)/2n*(n+1)/2n∗(n+1)/2),并将b区间排序,然后将数组b的所有子区间的和计算出来存入数组c,问数组c的中位数是多少。 做法 首先因为数组a中的所有数都小于等于100000,因此gcd的数字种类也在这个范围内,对数组a可以用倍增求出每个数字作为gcd的次数。 然后考虑二分答案,可以...

yzyyylx的博客 565

openbmc 支持mctp over pcie(三)(支持作为endpoint)

本文介绍了在Intel BHS平台上支持MCTP over PCIe端点开发的调试方法。开发基于CodeConstruct和AspeedTech-BMC的开源项目,将内核驱动改为模块形式以便调试。内容包括DTS配置、驱动模块设置步骤,以及如何将BMC配置为端点设备。调试过程涉及内核模块加载、MCTPD启动、参数设置等关键命令,并展示了路由表、地址和邻居信息的测试结果。该方案仅为实验性工作,需注意停止其他使用/dev/aspeed-mctp0接口的应用。

wit_yuan的专栏 1554

『分治·GCD』区间GCD和

题解 结论:当右端点固定,左端点不固定的区间gcdgcdgcd中,一定有相同的个数不超过log2(n)log2(n)log2(n)段且单调递增的gcdgcdgcd序列。因为nnn分解质因数顶多logloglog个质因子,每次还需要减少不增多,因为上述结论正确。 我们每一次都枚举右端点时,动态维护这一个gcdgcdgcd序列,相同部分用左右端点表示即可。 即: 每一次新加入区间为[i,i][i,i...

Ronaldo7_ZYB的博客 810

【OpenCV C++】基本绘图操作

OpenCV C++基本绘图操作程序说明代码运行效果 程序说明 // 程序描述:OpenCV C++基本绘图操作 //参 考:毛星云《OpenCV3编程入门》 // 操作系统: Windows 10 64bit // 开发语言: C++ // IDE 版 本:Visual Studio 2019 // OpenCV版本:4.20 代码 main函数写法很简单,先创建空表Mat图像,然后点用函数绘制化学原子图,接着绘制组合图,最后显示图像。 //-------------------------

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 765

【ComfyUI】Wan2.2 Animate 背景保留动作迁移视频生成

本文介绍了一个基于ComfyUI的高精度视频生成工作流"Wan2.2 Animate",该系统融合动作捕捉、图像拼接和LoRA加权等技术,能自动识别人脸并完成精准动作迁移,同时保持背景稳定。工作流采用模块化设计,包含输入提取、图像融合、模型加载等关键节点,核心模型Wan2.2-Animate-14B支持fp8精度与BlockSwap控制。流程分为图像输入、动作提取、多图合成等五个阶段,通过文本提示编码器和图像语义编码器实现语义驱动的动作生成,最终输出高质量视频,适用于虚拟形象驱动和

Mr数据杨 2260

HDU 5381 The sum of gcd 莫队暴力

链接 题解链接:http://www.cygmasot.com/index.php/2015/08/15/hdu_5381/ 题意: 给定n长的序列 下面n个数给出这个序列 m个询问 下面m行给出询问的区间。 对于一个询问,输出这个区间内的任意子段的gcd 和。 思路: 因为一个数的gcd只会不变或下降,下降一次至少减半,下降至多32次,所以处理出每个数连续相同的gcd的区间。 然后暴力跑莫队。 #pragma comment(linker, "/STACK:1

九野的博客 2636

【论文解读--Xdog】新型电驱式四足机器人研制与测试

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录系列文章目录前言一、四足机器人体型大小和驱动方式的比较二、四足机器人设计一些重要的结论三、系统控制框架四、系统硬件框架五、力位混合控制(阻抗控制)六、侧向平衡控制(和VMC如出一辙)七、电机驱动系统研制(FOC磁场定向控制)总结 前言 认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长! 本文先对新型电驱式四足机器人研制与测试做个简单的介绍,具体内容后续再更,其他模块可以参

qq_35635374的博客 3726

HDU - 5381 The sum of gcd(莫队/线段树区间合并)

题目链接:点击查看 题目大意:给出一个长度为 nnn 的序列,再给出 mmm 次询问,每次询问需要回答区间 [L,R][L,R][L,R] 内所有子区间的 gcdgcdgcd 之和。更具体的,对于询问 [L,R][L,R][L,R],输出 ∑l=LR∑r=lRgcd⁡{al,al+1,⋯ ,ar}\sum\limits_{l=L}^{R}\sum\limits_{r=l}^{R}\gcd\{a_l,a_{l+1},\cdots,a_r\}l=L∑R​r=l∑R​gcd{al​,al+1​,⋯,ar​} 题目

Falcon的博客 480

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

HDU - 5381 The sum of gcd 莫队

HDU - 5381 首先我们可以观察出从一个点开始的连续gcd最多只有log个, 因为gcd每次最少除2, 然后我们暴力莫队转移就好啦。 #include<bits/stdc++.h> #define LL long long #define LD long double #define ull unsigned long long #define fi...

131

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Hdu5381 the sum of gcd(莫队)

题目大意:q此询问,每次询问[l,r]的所有子区间的gcd之和 思路:莫队,暴力 为什么能暴力,因为1e9范围内的gcd势能有限,对于一个数,最多有32个不同的gcd,因为gcd最小每次减少gcd/2 考虑左右指针移动对答案的贡献 [l,r] -> [l-1,r]则增加了l-1对[l,r]的贡献 [l,r] -> [l+1,r]则减少了l对[l,r]的贡献 [l,r] -> [l,r-1]则减少了r对[l,r]的贡献 [l,r] -> [l,r+1]则增加了r对[l,r]的贡献 接下

m0_53688600的博客 195

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

2015 Multi-University Training Contest 8 (hdu5381 The sum of gcd)

Problem Description   Input There are multiple test cases. The first line of input contains an integer T, indicating the number of test cases. For each test case: First line has one integers n Se...

snayf的博客 227

hdu5381 ST+二分+莫队

//题意:多个区间询问,问区间[l,r] 的所有子区间的gcd和 //思路: //1e4 考虑莫队,每次[l,r]转移到[l-1,r]需要加上sum=gcd[l-1,l-1]+gcd[l-1,l]+gcd[l-1,l+1]....+gcd[l-1,r]; //由于gcd特性,gcd[l-1,l-1],gcd[l-1,l],gcd[l-1,l+1]....gcd[l-1,r]是递减的,且值的数...

animalcoder 351

HDU 5381 The sum of gcd (莫队 + 二分 + 区间GCD特性)

/** 题意:.... 思路: 固定一个端点(值为k),那么这个端点属于的所有区间的不同的gcd最多只有logk中,因为gcd 整除 k, 从大到小排序去重后 后一个数至少除以2,所以不同的GCD最多只有logk个,那么找出这个端点往左和往右当GCD为g时能扩展到多远,这个二分即可,区间 的gcd用ST表预处理出来,之后找出关系式后莫队算法就可以了 */ #include&lt;bits/s...

hnust_Derker的博客 327

246. 区间最大公约数

C l r dQ l r对于每个询问,输出一个整数表示答案。

GitHub:https://github.com/myp020301 317

区间最大公约数 - 区间修改、区间查询gcd

C l r dQ l r对于每个询问,输出一个整数表示答案。

a1695574118的博客 419

(多校第一场1004)HDU5726 GCD(区间GCD查询+)

题意:给出n个数,区间为(1,n),查询区间(l,r)的GCD,以及区间(1, n)有多少子区间的GCD等于区间(l,r)的GCD。 做法:使用线段树,或RMQ维护区间GCD,并且要预处理出所有可能出现的GCD值 的区间数量。针对固定左端点,一直向右GCD阶梯状减小的特性,大概有两种做法。 1)对于某一固定起点(以选定左端点L=i为例),从最右端R开始,二分枚举GCD突变位置pos,这一段阶梯的长度就是R-pos+1,定义INTERGCD(L,R)=区间(L,R)的GCD,则GCD值等于 INTERGC

emmmmmm 4386

【hdu5381】维护区间内所有子区间的gcd之和-线段树

【hdu5381】维护区间内所有子区间的gcd之和-线段树 题意:给定n个数,m个询问,每次询问一个区间内所有连续子区间的gcd的和。n,m&lt;=10^5 题解: 这题和之前比赛的一题很像。我们从小到大枚举r,固定右端点枚举左端点,维护的区间最多只有log段。为什么?以为长区间的gcd肯定是短区间gcd的约数,并且要是不同的话至少要/2,最...

qq_25768269的博客 769

HDU5381【莫队算法+区间GCD特性】

前言: 主要最近在刷莫队的题,这题GCD的特性让我对莫队的使用也有了新的想法。给福利:神犇的一套莫队算法题 先撇开题目,光说裸的一个莫队算法,主要的复杂度就是n*sqrt(n)对吧,这里我忽略了一个左端点(增加/删除)或者右端点(增加/删除)的所带来的复杂度, 之前也遇到过卡这里的复杂度,但是是因为简单的long long计算多而造成了复杂度增大,从而转变一下。 回到这道题:给...

weixin_30823683的博客 225
上一篇: HDU 5386 Cover 覆盖染色
下一篇: HDU 5381 The sum of gcd 询问区间内所有子区间的GCD和 [莫队算法]
GrassTreeFlower
博客等级 码龄11年 14粉丝 116原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值