题面

搬砖

题解

题意为求最大的 ppp 使得 h1≡h2≡⋯≡hn(modp)h_1\equiv h_2\equiv \cdots\equiv h_n\pmod ph1​≡h2​≡⋯≡hn​(modp)。

即 h2−h1≡h3−h2≡⋯≡hn−hn−1≡0(modp)h_2-h_1\equiv h_3-h_2\equiv \cdots\equiv h_n-h_{n-1}\equiv 0\pmod ph2​−h1​≡h3​−h2​≡⋯≡hn​−hn−1​≡0(modp)。

那么我们可以得到 p∣gcd⁡(h2−h1,h3−h2,⋯,hn−hn−1)p|\gcd(h_2-h_1,h_3-h_2,\cdots,h_n-h_{n-1})p∣gcd(h2​−h1​,h3​−h2​,⋯,hn​−hn−1​)。

令 ci=hi+1−hic_i=h_{i+1}-h_ici​=hi+1​−hi​,那么最大的 ppp 就是 gcd⁡(c1,c2,⋯,cn−1)\gcd(c_1,c_2,\cdots,c_{n-1})gcd(c1​,c2​,⋯,cn−1​)。

那么我们要做的就是动态维护差分下的全局 gcd⁡\gcdgcd。

考虑修改操作,对于操作一 L,R,a,b,cL,R,a,b,cL,R,a,b,c 来说:(其中 x∈[L,R)x\in [L,R)x∈[L,R),注意 cxc_xcx​ 和 ccc 的区分)
cx=hx+1−hx=[a(x+1)2+b(x+1)+c]−[ax2+bx+c]=a(2x+1)+b=2ax+a+b\begin{aligned} c_x&=h_{x+1}-h_x=\left[a(x+1)^2+b(x+1)+c\right]-\left[ax^2+bx+c\right]\\ &=a(2x+1)+b=2ax+a+b \end{aligned} cx​​=hx+1​−hx​=[a(x+1)2+b(x+1)+c]−[ax2+bx+c]=a(2x+1)+b=2ax+a+b​
令 k=2ak=2ak=2a,m=a+bm=a+bm=a+b,由 gcd⁡(a,b)=gcd⁡(a,b−a)\gcd(a,b)=\gcd(a,b-a)gcd(a,b)=gcd(a,b−a) 可知对于任意的 L≤l<r<RL\leq l<r< RL≤l<r<R,有:
gcd⁡(cl,cl+1,⋯,cr)=gcd⁡(kl+m,k(l+1)+m,⋯,k(r−2)+m,k(r−1)+m,kr+m)=gcd⁡(kl+m,k(l+1)+m,⋯,k(r−2)+m,k(r−1)+m,k)=gcd⁡(kl+m,k,k,⋯,k)=gcd⁡(kl+m,k)=gcd⁡(m,k)\begin{aligned} \gcd(c_{l},c_{l+1},\cdots,c_{r})&=\gcd(kl+m,k(l+1)+m,\cdots,k(r-2)+m,k(r-1)+m,kr+m)\\ &=\gcd(kl+m,k(l+1)+m,\cdots,k(r-2)+m,k(r-1)+m,k)\\ &=\gcd(kl+m,k,k,\cdots,k)\\ &=\gcd(kl+m,k)\\ &=\gcd(m,k)\\ \end{aligned} gcd(cl​,cl+1​,⋯,cr​)​=gcd(kl+m,k(l+1)+m,⋯,k(r−2)+m,k(r−1)+m,kr+m)=gcd(kl+m,k(l+1)+m,⋯,k(r−2)+m,k(r−1)+m,k)=gcd(kl+m,k,k,⋯,k)=gcd(kl+m,k)=gcd(m,k)​
那么我们用两棵线段树,一棵 T1T_1T1​ 维护 hih_ihi​,另一棵 T2T_2T2​ 维护 gcd⁡(ci)\gcd(c_i)gcd(ci​),然后操作一就相当于在 T1T_1T1​ 上区间二次函数重置、在 T2T_2T2​ 上区间重置和单点修改。

而操作二就是来蒙人的……注意到 a=b=0a=b=0a=b=0,除了端点外 cic_ici​ 不变,那么我们只需要在 T1T_1T1​ 上区间加、在 T2T_2T2​ 上单点修改。

时间复杂度 O(nlog⁡nlog⁡w)O(n\log n\log w)O(nlognlogw),其中 n,qn,qn,q 同阶,www 为值域最大值。

#include<bits/stdc++.h>#define N 200010
#define ll __int128using namespace std;inline int read()
{int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^'0');ch=getchar();}return x*f;
}inline void write(ll x,char c)
{static int a[55];int cnt=0;while(x){a[++cnt]=x%10;x/=10;}for(int i=cnt;i>=1;i--)putchar(a[i]+'0');putchar(c);
}ll Abs(ll x)
{return x<0?-x:x;
}ll gcd(ll a,ll b)
{if(!a||!b) return a+b;return b?gcd(b,a%b):a;
}struct data
{int a,b,c;data(){};data(int aa,int bb,int cc){a=aa,b=bb,c=cc;}
};int n,q,h[N];namespace T1
{data lazy[N<<2];bool tag[N<<2];ll lazadd[N<<2];void downn(int k,data v){lazy[k]=v;lazadd[k]=0;tag[k]=1;}void down(int k){if(tag[k]){downn(k<<1,lazy[k]);downn(k<<1|1,lazy[k]);tag[k]=0;}if(lazadd[k]){lazadd[k<<1]+=lazadd[k];lazadd[k<<1|1]+=lazadd[k];lazadd[k]=0;}}void build(int k,int l,int r){if(l==r){h[l]=lazadd[k]=read();return;}int mid=(l+r)>>1;build(k<<1,l,mid);build(k<<1|1,mid+1,r);}void update(int k,int l,int r,int ql,int qr,data v){if(ql<=l&&r<=qr){downn(k,v);return;}down(k);int mid=(l+r)>>1;if(ql<=mid) update(k<<1,l,mid,ql,qr,v);if(qr>mid) update(k<<1|1,mid+1,r,ql,qr,v);}void change(int k,int l,int r,int ql,int qr,int v){if(ql<=l&&r<=qr){lazadd[k]+=v;return;}down(k);int mid=(l+r)>>1;if(ql<=mid) change(k<<1,l,mid,ql,qr,v);if(qr>mid) change(k<<1|1,mid+1,r,ql,qr,v);}ll query(int k,int l,int r,int x){if(l==r){ll ans=0;if(tag[k]) ans=(ll)lazy[k].a*l*l+(ll)lazy[k].b*l+lazy[k].c;ans+=lazadd[k];return ans;}down(k);int mid=(l+r)>>1;if(x<=mid) return query(k<<1,l,mid,x);return query(k<<1|1,mid+1,r,x);}
}namespace T2
{int leaf[N<<2];ll g[N<<2],lazy[N<<2];bool tag[N<<2];void up(int k){g[k]=gcd(g[k<<1],g[k<<1|1]);}void build(int k,int l,int r){if(l==r){leaf[k]=l;g[l]=Abs(h[l+1]-h[l]);return;}int mid=(l+r)>>1;build(k<<1,l,mid);build(k<<1|1,mid+1,r);up(k);}void downn(int k,ll v){if(!leaf[k]){g[k]=lazy[k]=v;tag[k]=1;}}void getval(int k){g[k]=Abs(T1::query(1,1,n,leaf[k]+1)-T1::query(1,1,n,leaf[k]));}void down(int k){if(tag[k]){downn(k<<1,lazy[k]);downn(k<<1|1,lazy[k]);tag[k]=0;}if(leaf[k<<1]) getval(k<<1);if(leaf[k<<1|1]) getval(k<<1|1);}void update(int k,int l,int r,int ql,int qr,ll v){if(ql<=l&&r<=qr){downn(k,v);return;}down(k);int mid=(l+r)>>1;if(ql<=mid) update(k<<1,l,mid,ql,qr,v);if(qr>mid) update(k<<1|1,mid+1,r,ql,qr,v);up(k);}void change(int k,int l,int r,int x){if(l==r) return;down(k);int mid=(l+r)>>1;if(x<=mid) change(k<<1,l,mid,x);else change(k<<1|1,mid+1,r,x);up(k);}
}int main()
{n=read(),q=read();T1::build(1,1,n);T2::build(1,1,n-1);while(q--){int opt=read(),l=read(),r=read(),a=read(),b=read(),c=read();if(opt==1){T1::update(1,1,n,l,r,data(a,b,c));if(1<=l-1) T2::change(1,1,n-1,l-1);if(r<=n-1) T2::change(1,1,n-1,r);if(l==r-1) T2::change(1,1,n-1,r-1);else if(l<r-1) T2::update(1,1,n-1,l,r-1,gcd(a+b,2*a));}if(opt==2){T1::change(1,1,n,l,r,c);if(1<=l-1) T2::change(1,1,n-1,l-1);if(r<=n-1) T2::change(1,1,n-1,r);}int ans=T2::g[1];if(!ans) assert(0),ans=T1::query(1,1,n,1);write(ans,'\n');}return 0;
}
/*
5 3
2 2 4 8 12
1 1 3 0 0 4
2 3 5 0 0 8
1 1 5 4 2 4
*/
//不知道为什么95pts过不去……

【XSY4041】搬砖(线段树)相关推荐

  1. BZOJ 2138 stone(霍尔定理推论,线段树)【BZOJ 修复工程】

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目链接 https://hydro.ac/d/bzoj/p/2138 是 hydro 的 BZOJ ...

  2. hdu 2795(线段树)

    解题思路:这道题很难想到是用线段树,确实转化的很巧妙 实际上,我们只需要利用线段树(记录1-h)维护哪个位置的剩余空间最大即可,即1,2,......,h是线段树的叶子节点,我们每次要找的就是叶子节点 ...

  3. 【IOI2018】会议【笛卡尔树】【dp】【线段树】

    题意:长度为nnn的序列,qqq次询问,每次给定一个区间,钦定区间中的一个位置xxx,使得区间所有点 与xxx之间的最大值(含端点) 之和 最小,输出最小值. n,q≤7.5×105n,q\leq7. ...

  4. 清明梦超能力者黄YY[树链剖分+扫描线,线段树合并]

    清明梦超能力者黄YY 题目连接 https://www.nowcoder.com/acm/contest/206/I 暂时有两种做法. 算法一 涉及:树链剖分,扫描线 在一个线段的情况下,我们可以把一 ...

  5. 【攻略】如何用云服务器实现云搬砖

        本篇博文是从我的公众号转过来的,请尊重作者的劳动成果,未经允许请勿转载!值得说明的是,本篇博文主要适用于使用Python的同学. 目录 0 引言 1 本地PC(windows)如何远程连接云服 ...

  6. HDU 4533 威威猫系列故事――晒被子(线段树区间更新+分情况推公式)

    因为马拉松初赛中吃鸡腿的题目让不少人抱憾而归,威威猫一直觉得愧对大家,这几天他悄悄搬到直角坐标系里去住了.  生活还要继续,太阳也照常升起,今天,威威猫在第一象限晒了N条矩形的被子,被子的每条边都和坐 ...

  7. 「hdu6681」Rikka with Cake【线段树】

    Rikka with Cake Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Others) T ...

  8. Java:JVM+数据库(搬砖整理,侵权删文)

    Java:JVM+数据库(搬砖整理,侵权删文) 十一.JVM 1.Java内存区域 1.说一下 JVM 的主要组成部分及其作用? ​ JVM包含两个子系统和两个组件,两个子系统为Class loade ...

  9. 二逼平衡树——树套树(线段树套Splay平衡树)

    题面 Bzoj3196 解析 线段树和Splay两棵树套在一起,常数直逼inf,但最终侥幸过了 思路还是比较简单, 在原数组维护一个下标线段树,再在每一个线段树节点,维护一个对应区间的权值Splay. ...

最新文章

  1. 【数学建模】线性规划模型MATLAB求解(最优化)
  2. Python常用的模块的使用技巧
  3. 电子商务系统的设计与实现(九):后端管理系统功能细化
  4. 想离职,是现在就提?还是等到年后?
  5. 如何从源码包安装软件?
  6. 安装LR提示“此计算机缺少 vc2005_sp1_with_atl_fix_redist,请安装所有缺少的必要组件,然后重新运行此安装“
  7. 20-21-2网络管理quiz3
  8. 6实验心得_看县委书记如何写“水平高”“亮点足”的考察心得体会!
  9. linux 读写信号量学习
  10. java1.5_Java15下载 JDK15(Java SE Development Kit 15) 15.0.2 官方正式版 Win64位 下载-脚本之家...
  11. 关于软件工程的目的与意义
  12. 灵飞经 ①洪武天下 第二章 紫禁深深
  13. 爬虫抓取究竟是什么?
  14. WPF实现炫酷Loading控件
  15. 使用ps制作端午海报
  16. KOL营销之痛点难点
  17. 洛谷P5707 【深基2.例12】上学迟到(c++)
  18. linux root用su 切换到普通用户提示输入密码并报密码错误(Linux禁止非WHEEL用户组使用su命令)
  19. JESD204接口调试总结——Xilinx JESD204B IP testbench解析
  20. matlab f检验 f值,如何用matlab进行F检验

热门文章

  1. cnpm不是内部命令的解决方案:配置环境变量【推荐】
  2. 清华大学,北京大学,浙江大学公布计算机考研校线!有的不变,有的下降5分!...
  3. 设置字段默认值Java_小书MybatisPlus第9篇-常用字段默认值自动填充
  4. 大工14春 计算机文化基础 在线测试,大工14春《计算机文化基础》在线测试1
  5. excel数据透视表总结
  6. java未来发展潜力_Java语言未来是否还有发展前景
  7. 用Python去除PDF水印尝试
  8. android开发双击唤醒屏幕,安卓手机双击唤醒原理是什么 安卓双击唤醒原理介绍...
  9. linux 系统安全以及应用
  10. SAP MM批次切换