codeforces 914 D Bash and a Tough Math Puzzle

二阶高通滤波器硬件设计:5种RC到有源方案对比与选型 在传感器前端和音频信号调理中,二阶高通滤波器是抑制直流偏移与低频干扰的关键模块。其设计核心围绕截止频率、品质因数Q、增益与噪声四个指标展开,其中Q值决定滤波器在转折频率附近的响应形状,如Butterworth最大平坦响应需Q=0.707。从纯无源RC电路到引入运放的有源拓扑,演变逻辑在于解决负载效应、提供增益并借助反馈提升Q值。实际工程中,RC级联、VCVS(Sallen-Key)、状态变量及回转器模拟电感等方案各有适用场景:RC电路简单但Q值受限,Sallen-Key单运放即可实现高Q,状态变量适合Q值独 阅读详情

Description
Bash likes playing with arrays. He has an array a1, a2, … an of n integers. He likes to guess the greatest common divisor (gcd) of different segments of the array. Of course, sometimes the guess is not correct. However, Bash will be satisfied if his guess is almost correct.

Suppose he guesses that the gcd of the elements in the range [l, r] of a is x. He considers the guess to be almost correct if he can change at most one element in the segment such that the gcd of the segment is x after making the change. Note that when he guesses, he doesn’t actually change the array — he just wonders if the gcd of the segment can be made x. Apart from this, he also sometimes makes changes to the array itself.

Since he can’t figure it out himself, Bash wants you to tell him which of his guesses are almost correct. Formally, you have to process q queries of one of the following forms:

  • 1 l r x — Bash guesses that the gcd of the range [l, r] is x. Report if this guess is almost correct.
  • 2 i y — Bash sets ai to y.

Note: The array is 1-indexed.
Input

The first line contains an integer n (1 ≤ n ≤ 5·105) — the size of the array.

The second line contains n integers a1, a2, …, an (1 ≤ ai ≤ 109) — the elements of the array.

The third line contains an integer q (1 ≤ q ≤ 4·105) — the number of queries.

The next q lines describe the queries and may have one of the following forms:

  • 1 l r x (1 ≤ l ≤ r ≤ n, 1 ≤ x ≤ 109).
  • 2 i y (1 ≤ i ≤ n, 1 ≤ y ≤ 109).

Guaranteed, that there is at least one query of first type.
Output

For each query of first type, output “YES” (without quotes) if Bash’s guess is almost correct and “NO” (without quotes) otherwise.
Examples

InputOutput
3
2 6 3
4
1 1 2 2
1 1 3 3
2 1 9
1 1 3 2
YES
YES
NO
InputOutput
5
1 2 3 4 5
6
1 1 4 2
2 3 6
1 1 4 2
1 1 5 2
2 5 10
1 1 5 2
NO
YES
NO
YES

Note

In the first sample, the array initially is {2, 6, 3}.

For query 1, the first two numbers already have their gcd as 2.

For query 2, we can achieve a gcd of 3 by changing the first element of the array to 3. Note that the changes made during queries of type 1 are temporary and do not get reflected in the array.

After query 3, the array is now {9, 6, 3}.

For query 4, no matter which element you change, you cannot get the gcd of the range to be 2.


题意:n个数的数列,对它有下面两种操作

  • 猜 l ~ r 这部分数的最大公因数为x,如果x不是最大公因数,但只改变l ~ r中的一个数就能让x是最大公因数,那么可以认为是猜中了;
  • 把某一个数 i 的值变为 y。

思路:
更新操作是比较简单的,只需要用log(n)找到这个数所在的叶子,修改它和所有与他相关的父亲即可。
询问操作的处理比较复杂,首先想到的是,为了检查x,需要求所询问区间的gcd,就要搜索所有相关的区间结点,求出gcd后再进一步操作。但是由于这个二叉树维护的是最大公因数,父节点维护的gcd一定可以整除子节点维护的gcd,可以利用这个性质来求解。

  • 假设要求的范围是[l, r],猜的gcd是x。由线段树的性质,可以找到[l, r]由若干个区间结点[l1, r1], [l2, r2], … ,[ln, rn] 形成的划分。
  • 因为只能修改一个叶子结点来使x正确,而这个叶子节点只由上面的某一个区间结点维护,所以修改过后只能使一个区间的gcd发生变化,所以在检查每个区间结点时,最多只有一个结点的gcd不能被x整除,否则x是错误的
  • 处理这个不能被整除的区间[li, ri]
    • 假如x是almost right的,但是我们最多只能改这个区间内的一个叶子节点。由于左右子节点维护的区间是父亲结点的划分 ,那么修改过后只有一个子节点的值会发生改变,所以x至少应该能整除某一个子节点的gcd。如果两个子节点都不能整除,那么x是错误的;否则进入不能整除的子节点重复上述步骤。
  • 当不能被整除的区间是叶子结点时,假设x是almost right的,如果把这个叶子节点修改为x,根据之前的假设,父节点的gcd将变为x,父节点的父节点的gcd也变为x,…。最终,[l1, r1], [l2, r2], … ,[ln, rn] 这些区间的gcd里,某一个原来不能被x整除的现在变成了x,而其他区间的gcd能被x整除,所以最后总的gcd就是x。
#include <stdio.h>
#include<string.h>



#define maxn 500000
#define fath(i) (i>>1)
#define left(i) (i<<1)
#define right(i) ((i<<1)+1)
#define mid(l,r) (l+ ((r -l) >> 1))

//完全二叉树用数组存放
int l[(maxn << 3) + 5] = { 0 };
int r[(maxn << 3) + 5] = { 0 };
int k[(maxn << 3) + 5] = { 0 };
//int lzy[(maxn << 2) + 5] = { 0 };

int gcd(int a, int b)
{
    while (b != 0)
    {
        int r = b;
        b = a % b;
        a = r;
    }
    return a;
}


int n;
void build(int cl, int cr, int i) {
    l[i] = cl; r[i] = cr;
    k[i] = 1;
    if (cl != cr) {
            build(cl, mid(cl, cr), left(i));
        build(mid(cl, cr) + 1, cr, right(i));
        k[i] = gcd(k[left(i)], k[right(i)]);
    }
    else    scanf("%d", &k[i]); 
}

int update(int num, int vol, int i) {

    if (l[i]==r[i]) {
        k[i] = vol;
        return vol;
    }
    int m = mid(l[i], r[i]);

    if (num <= m)
    {
        return k[i] = gcd(update(num, vol, left(i)), k[right(i)]);
    }
    else if (num >= (m + 1)) {
        return k[i] = gcd(update(num, vol, right(i)), k[left(i)]);
    }
}


int cnt;
bool guess(int cl,int cr,int gs,int i){
    int m = mid(l[i], r[i]);
    if (l[i] == r[i]) { //当前是叶子节点
        if( k[i]%gs==0)return true; //当前叶子不需要替换
        else //当前叶子需要替换
        { 
            cnt++; //记录需要替换的区间的次数
            return cnt <= 1;//如果多于一个那gs就是错的 
        }

    }

    if (cl == l[i] && cr == r[i]) {//[l,r]的划分
        int kl = k[left(i)];
        int kr = k[right(i)];
        if (gs==k[i])return true;//能整除

        //左边可以被整除则检查有没有可能修改右边为gs
        if (kl%gs==0)return guess(m + 1, cr, gs ,right(i));

         //右边可以被整除则检查有没有可能修改左边为gs
        if(kr%gs==0)return guess(cl, m, gs,left(i));
        //都不能被整除
        return false;
    }

    if (cr <= m)//所询问范围全部在左子节点中
    {
        return guess(cl, cr,gs, left(i));
    }
    else if (cl >= (m + 1)) {//所询问范围全部在右子结点中
        return guess(cl, cr,gs, right(i));
    }
    else {//所询问范围左右子节点都维护了一部分
        return (guess(cl, m, gs,left(i))&&guess(m + 1, cr, gs,right(i)));//这些区间的答案不能有一个是false,而且最多替换一个区间
    }
}

    int qry;
    int a1, a2, a3;
int main() {

        scanf("%d", &n);
        build(1, n, 1);
        int q;

        scanf("%d", &q);
        for (int i = 0; i < q; ++i) {
            scanf("%d", &qry);
            if (qry == 1)
            {
                scanf("%d %d %d", &a1, &a2, &a3);
                cnt = 0;
                if (guess(a1, a2, a3,1) == true&&cnt<=1)printf("YES");
                else printf("NO");
                if (i < q - 1)printf("\n");
            }
            else {
                scanf("%d %d", &a1, &a2);
                update(a1, a2, 1);
            }
        }

}
计算机控制技术及应用 《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。 立即下载

相关推荐

Easymesh之拓扑模块(二)

介绍 easymesh 拓扑消息:Topo discovery、Topo notification、Topo query、Topo response

qq_53619687的博客 2152

D Bash and a Tough Math Puzzle(线段树+思维+剪枝)

题目大意: 给你一个序列,你要在这个序列上进行mmm次操作,操作1:l,r,x1:l,r,x1:l,r,x表示判断是否序列区间[l,r][l,r][l,r]中所有数的gcd()=xgcd()=xgcd()=x,如果不等于你可以修改其中一个数的值。操作2:i,y将ai=y2:i,y将ai= y2:i,y将ai=y。 思路: 注意到q=4e5q=4e5q=4e5也就是说你的所有操作要在O(log...

weixin_43736492的博客 325

SPI模式下的SD卡读写,为什么你的数据总出错?详解时序与状态机避坑指南

本文深入探讨SPI模式下SD卡读写数据出错的根本原因,提供时序优化与状态机设计的实战指南。针对时钟周期计数、状态机跳转和忙检测等核心问题,详解命令时序细节、状态机同步策略及高级避坑技巧,帮助开发者提升SD卡在SPI模式下的稳定性和性能。

weixin_30514745的博客 261

Bash and a Tough Math Puzzle 【CodeForces - 914D】【线段树】

题目链接 有两种操作: 1、询问[l, r]区间内改变一个数,是否可以将它的gcd()的值变成x; 2、将i位置上的值改变成y。 然后怎么去处理gcd(),因为可以改变一个,那么线段树去查询这个区间最少要改变的数的个数不就可以了。 #include &lt;iostream&gt; #include &lt;cstdio&gt; #include &lt;cmath&gt; #...

既然弱小,就只顾变强就是了 308

BIDS数据存储格式介绍与dcm2bids安装与使用

BIDS格式&dcm2bids安装与使用

machinelearning_er的博客 7315

深入了解AES_GCM算法

常见的对称加密算法,在解密过程中无法确认密钥是否正确的。这就意味着,密文可以用任何密钥执行解密运算,得到一组疑似密文;由于不知道密钥是否正确,故也不能确定解密出来的明文数据是否正确。因此,需要在对称加密算法上增加一层验证机制,常见思路为使用加密算法进行加密保证机密性,使用摘要算法计算MAC保证完整性和真实性,这就涉及到摘要计算和加密计算的前后顺序和参与计算的数据、密钥等,使用起来略微麻烦。

huaqianzkh的专栏 4187

Bash and a Tough Math Puzzle(线段树维护区间公约数)

直接给中文题意吧: 给定长度为n的数组a1,a2,…,an。 q次操作。操作分为两种: 1 l r x,若能在a[l]~a[r]中至多修改一个数的情况下,使得gcd(a[l],a[l+1],…,a[r])=x,输出YES,否则输出NO。注意:我们不需要进行实际的改动。 2 i y,将a[i]修改为y。 Input 第一行为一个整数n(1 ≤ n ≤ 5*105)。 第二行为n个整数,表示数组a(1 ≤ ai≤ 109)。 第三行为一个整数q(1 ≤ q ≤ 4*105)。 接下来q行,每行一个操作.

AC__dream的博客 260

Prompt提示优化工具

在大模型使用过程中,Prompt尤为重要。一个好的Prompt可以解决很多的问题。那么如何撰写一个完美的Prompt?下面汇总了一些Prompt工具,可以辅助日常Prompt的编写。

HJ_blog 3108

CodeForces914 D.Bash and a Tough Math Puzzle(线段树)

题意: 给长度为n的序列, 有q次操作: 操作有两种: 1.(1,x,y)把a[x]改成y 2.(2,l,r,x)询问区间[l,r]能否通过修改一个数(改成任意数)使得区间gcd为x(不用真的修改) 思路: 单点修改和区间gcd可以用线段树轻松解决,难点主要是询问。 1.如果区间gcd是x的倍数,则把任意数修改为x都满足条件 2.如果区间内只有一个数不是x的倍数,则把这个数改成x后满足条件 3.如...

zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz 277

Qt Quick/QML入门到精通_专栏demo对应文章目录(目前50个左右demo/长期更新)

自定义图标下拉列表框的效果如下所示:自定义三态按钮的效果如下所示:传送门:53.qt quick-自定义三态按钮、自定义图标下拉列表框_诺谦的博客-优快云博客传送门:59.qt quick-qml调色板(颜色取色器)实现、自定义QQuickStyle样式_诺谦的博客-优快云博客63.qt quick-QML侧边滑动栏(不需要任何图片资源,支持自定义左右方向和大小)_诺谦的博客-优快云博客_qt实现好看侧边栏。...

抵抗时间扭曲,坚持做一件有意义的事 2万+

【AI技术赋能有限元分析应用实践】Abaqus有限元分析与深度学习结合20个案例与有限元分析数据来源方法说明

结合 Abaqus 和深度学习,数据的获取和处理是关键的一步。通过从仿真、实验、公开数据库或合成数据中获取数据,经过预处理后,可以将其用于训练深度学习模型。最终,将训练好的深度学习模型与 Abaqus 集成,用于材料行为预测、结构优化、非线性分析、损伤预测等任务,从而提升仿真效率和精度。

源代码杀手的博客 3213

Bash and a Tough Math Puzzle 线段树维护区间gcd

还是一道很不错的题目,很容易想到用一棵线段树来维护区间gcd。注意用倍数来剪枝就好了,很是一到很好的题目的。

m0_60921016的博客 482

Camera2Demo

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

[Codeforces 914D] Bash and a Tough Math Puzzle

[题目链接] https://codeforces.com/contest/914/problem/D [算法] 显然 , 当一个区间[l , r]中为d倍数的数的个数 <= 1 , 答案为Yes , 否则为No 线段树简单维护即可 , 详见代码 , 时间复杂度 : O(NlogN ^ 2) [代码] ...

186

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Bash and a Tough Math Puzzle CodeForces 914D 线段树+gcd数论

Bash and a Tough Math Puzzle CodeForces 914D 线段树+gcd数论 题意 给你一段数,然后小明去猜某一区间内的gcd,这里不一定是准确值,如果在这个区间内改变一个数的值(注意不是真的改变),使得这个区间的gcd是小明所猜的数也算小明猜对。另一种操作就是真的修改某一点的值。 解题思路 这里我们使用线段树,维护区间内的gcd,判断的时候需要判断这个区...

weixin_30715523的博客 181

Codeforces914D Bash and a Tough Math Puzzle 线段树维护gcd

题意:给你一个序列,有两个操作:1、把某个数改为另一个数。2、询问你某一区间内的所有数,能否只修改其中一个数(但不用修改),使得该区间所有数的最大公约数gcd为k,k在每次询问时给出。 思路:单点修改不必说,对于询问:若只修改一个数使得序列符合要求,那么我们需要找有多少数不符合要求,那怎样才算符合要求呢? 我这样说: 若询问的区间的最大公约数是k的倍数(即gcd%k==0),那么所有的数(都是k的...

枚举星星 297

Bash and a Tough Math Puzzle CodeForces - 914D+线段树+维护区间gcd

题目链接: Bash and a Tough Math Puzzle CodeForces - 914D 注意这里所给x是满足要求的,比如,20,30,gcd==5,不会给x==10; 题目大意:给定一段区间的数值,执行下面两个操作: 1,查询区间[le,re]的最大公约数是不是x,且对于这个区间可以“假性”修改至多一个位置的值,使得区间[le,re]的gcd是x; 2,修改le处的值为x(简单...

地衣的博客——qdu 204

Codeforces914D Bash and a Tough Math Puzzle (思维 线段树)

题目链接: Bash and a Tough Math Puzzle 大致题意 给定一个长度为n的序列, 有两种操作: 1 l r x 询问[l, r]区间, 最多修改1个位置的数字的条件下, 能否使得区间内所有数字的gcd = x. 2 a c 把a位置的数字修改为c. 解题思路 思维 我们先考虑查询操作. 设区间[l, r]gcd的结果为ddd​​​, 如果d是x的倍数, 则我们一定可以至多修改一个位置, 使得d’ = x. 那这又代表着什么? 这代表着, [l, r]每一个位置上的数字都是x的倍数.

Fau的博客 380

CodeForces - 914D Bash and a Tough Math Puzzle(线段树)

题面 Bash likes playing with arrays. He has an array a1, a2, ... an of n integers. He likes to guess the greatest common divisor (gcd) of different segments of the array. Of course, sometimes the g...

weixin_30375427的博客 175

codeforces 914 D. Bash and a Tough Math Puzzle(线段树 区间gcd)

http://codeforces.com/problemset/problem/914/D 题意:给出一个数组,现有两种操作 1.给出l,r,x 询问在l,r区间内至多改变一个数,gcd能否为x 2.单点修改元素值 思路:考虑线段树维护,最麻烦的是改变一个元素后gcd能否为x,首先线段树维护每个区间的gcd,首先父节点储存的gcd如果能都整除x,那么该区间gcd就可以在改变一个数的情况下为x ...

- 回忆゛ 211

CodeForces 914D :Bash and a Tough Math Puzzle 线段树

传送门 题目描述 分析 我们去维护每个区间内不能整除xxx的个数cntcntcnt x==0x == 0x==0 把这个区间内任意一个数修改为xxx即可 x==1x == 1x==1 将不能整除xxx的数修改为xxx x>1x > 1x>1 无法达到要求 代码 #pragma GCC optimize(3) #include <bits/stdc++.h> #define debug(x) cout<<#x<<":"<<x<&lt

tlyzxc的博客 239

CodeForces - 914D -Bash and a Tough Math Puzzle (线段树+点更新)

题目链接:http://codeforces.com/problemset/problem/914/D 题目: Bash likes playing with arrays. He has an arraya1, a2, ...anofnintegers. He likes to guess the greatest common divisor (gcd) of different...

weixin_44757834的博客 204

Codeforces914D Bash and a Tough Math Puzzle

题意:一个长度为n的序列,T个询问,2种询问1 l r x问[l, r]区间内替换一个数能不能使得gcd[l, r] == x,输出yes和no,2 l x序列第l个数替换为x 题解:区间询问,单点需修改,线段树,算出区间有t个数不是x的倍数,t>1输出no #include <bits/stdc++.h> #define maxn 501000 #define IN...

weixin_30663391的博客 126

codeforces 914D. Bash and a Tough Math Puzzle(线段树)

传送门 线段树辣鸡题。 题意简述:给出一个序列,支持修改其中一个数,以及在允许自行修改某个数的情况下询问区间[l,r][l,r][l,r]的gcdgcdgcd是否可能等于一个给定的数。 看完题就感觉是道线段树。 修改操作不谈了。 查询给人的第一感觉有点新奇。 但仔细分析就是sbsbsb操作了。 我们维护一个全局变量cntcntcnt来记录为了达到要求已经修改了几个数,如果cnt&amp;gt;1...

苟为蒟蒻又何妨 420

Bash and a Tough Math Puzzle CodeForces - 914D(线段树+思维)

题目链接 思路描述出处: 题意: 给出一段序列,两个操作 操作1 : 给出l,r,x 求区间l-r的gcd,如果至多能改掉区间内的一个数(不影响原序列),使gcd是x的倍数,那么输出YES,否则输出NO 操作2 : 给出pos,x 将序列中pos位置上的数字改为x 思路:首先GCD是具有传递性的,所以可以使用线段树进行维护,但比较麻烦的就是可以改掉一个数。可以试想一下,对于每个区间的查询,我们最终得到的是若干完整返回块的gcd,如果其中有两个块gcd都不是x的倍数,那么肯定不对。如果只有一个块不是呢?这个块

Ray.C.L的博客 378
上一篇: codeforces 916 A Jamie and Alarm Snooze
下一篇: codeforces 148 B Escape
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值