首页 > 其他分享 >interval GCD

interval GCD

时间:2023-03-19 13:22:23浏览次数:41  
标签:md GCD int interval tr build include gcd

https://ac.nowcoder.com/acm/contest/1033/B

 

区间加,求 区间 gcd [L,R]

 

 gcd (a[x],a[x+1],.....a[y] ) = gcd (a[x],  a[x+1]-a[x], a[x+2]-a[x+1] ,..... a[y]-a[y-1] )

 

 线段树维护差分数组的gcd,而区间加变为2个单点改

 a[x] 的话要维护下差分数组的前缀和,和原来的a[x] 加起来

 

#include <iostream>
#include <map>
#include <cstring>
#include <algorithm>
using namespace std ;
 const int N =5e5+10;
 
 #define int long long
 #define k1 k<<1
 #define k2 k<<1|1
 
 struct TREE{
 	int l,r,g ;
 }tr[N<<2];
 int n,a[N],df[N],c[N*2];
 
 int lowbit(int x){ return x&-x; }
 int q(int x){
 	int res=0 ;
 	for(;x;x-=lowbit(x)) res+=c[x];
 	return res;
 }
 void add(int x,int v){
 	for(;x<=n;x+=lowbit(x)) c[x]+=v;
 }
 int qry(int k,int x,int y){
 	int l=tr[k].l, r=tr[k].r;
 	if(x<=l&&y>=r){
 		return abs(tr[k].g) ;
 	}
 	int md=(l+r)>>1;
 	int t= 0;
 	if(x<=md) t=__gcd(qry(k1,x,y),t);
 	if(y>md) t=__gcd(qry(k2,x,y),t);
 	return abs(t); 
 }
 void build(int k,int l,int r){
 	tr[k].l=l,tr[k].r=r,tr[k].g= 0 ;
 	if(l==r){
 		tr[k].g = df[l];
 		return ;
 	}
 	int md=(tr[k].l+tr[k].r)>>1;
 	build(k1,l,md),build(k2,md+1,r);
 	tr[k].g= __gcd(tr[k1].g,tr[k2].g) ;
 }
 void cg(int k,int x,int v){
 	int l=tr[k].l, r=tr[k].r;
 	if(x==l&&l==r){
 		tr[k].g+=v;
 		return ;
 	}
 	int md=(l+r)>>1;
 	if(x<=md) cg(k1,x,v); else cg(k2,x,v);
 	tr[k].g= __gcd(tr[k1].g,tr[k2].g) ;
 }
 
 //  q(x,y)
 signed main(){
 	int i,x,y,z,tes;
 	cin>>n>>tes ;
 	for(i=1;i<=n;i++) 
 		cin>>a[i],df[i]=a[i]-a[i-1];
 	
 	build(1,1,n) ;
 	while(tes--){
 		char op ;
 		cin>>op>>x>>y;
 		if(op=='C'){
 			cin>>z;
 			cg(1,x,z); 
 			if(y+1<=n) cg(1,y+1,-z);
 			add(x,z),add(y+1,-z);
 		}
 		else{
 			int t1= a[x]+q(x), t2= qry(1,x+1,y) ;
 			cout<<__gcd(t1,t2)<<'\n';
 		}
 	}
 }
 
 

 

标签:md,GCD,int,interval,tr,build,include,gcd
From: https://www.cnblogs.com/towboa/p/17232879.html

相关文章

  • 【洛谷】P2257 YY的GCD(莫比乌斯反演)
    原题链接题意\(T\)组询问,每次询问求:\[\sum_{i=1}^{n}\sum_{i=1}^{m}[\gcd(i,j)\inprime]\]\(T=10^4,n,m\leq10^7\)。思路不难想到枚举质数,将原式化简为:\[\sum......
  • CF1665D GCD Guess
    个人思路:\(\gcd(x+a,x+b)=gcd(x+a,b-a)\)。考虑固定\(a\),然后试出来\(x+a\)所有因子。然后发现质数根本试不完。发现询问\(30\)次,\(2^{30}\)刚好比\(x\)大一......
  • mysql elt interval函数区间统计
    引言 在实际的业务统计需求中有时往往需要对区间进行分组统计查询,如分数区间,工资区间查询统计等!mysql中可以利用elt函数来实现此类需求!接下来看如下时间业务需求:......
  • useState+setInterval 导致获取useState都是原始的解决方法
    1import{useRef,useEffer}from"react";2exportfunctionuseInterval(callback,delay){3constsavedCallback=useRef();45useEffect(()=>......
  • 【总结】2023-03-01 Count Interval
    CountInterval题意给定\(n\)个数字\(a_1,a_2\ldotsa_n\)和一个整数\(k\),求有多少个非空子段之和为\(k\)。也就是问有多少对数\((l,r)(1\leqslantl\leqsla......
  • why is the setInterval task executed slower than the setTimeout task in the brow
    whyisthesetIntervaltaskexecutedslowerthanthesetTimeouttaskinthebrowserjavascriptenvironment?为什么在浏览器javascript环境下setInterval任务......
  • Binary GCD 学习笔记
    算是一点杂项吧,感觉没什么机会用上。0x00前言有时你需要大量且快速的求gcd,像P5435。但是对值域预处理gcd又很麻烦,所以这时候我们可以考虑BinaryGCD。0x01原理......
  • C++快速求解最大公因数 | gcd库函数
    1.介绍gcd全称:greatestcommondivisor使用__gcd(intx1,intx2)函数可以高效、迅速得到x1,x2两个数的最大公因数。省去手写底层代码,专注代码逻辑的研究 2.注......
  • 区间 (interval)
    题目链接:https://ac.nowcoder.com/acm/problem/16722差分模版#include<bits/stdc++.h>usingnamespacestd;#definelllonglongllsum[1000005];lla[1000005];......
  • CF1034A Enlarge GCD 题解
    题意简述:删去最少的数使所有的数的\(\text{gcd}\)增加。解:先对每个数除以所有数的\(\text{gcd}\),然后剩下的需要找到所有数的质因子,找到一个最多的序列中数拥有的质......