http://codeforces.com/problemset/problem/914/D

题意:给你n个数,两种操作:1、询问区间【l,r】在至多一次修改一个数的条件下区间gcd是否等于x。

2、修改第i个数为x。

解法:区间维护gcd,如果该区间gcd%x==0,则该区间算是正确区间,不需要继续递归其儿子。如果该区间gcd%x  != 0,递归其儿子。如果递归到叶子儿子说明该点必须改变。减枝:如果需改变的数超过1个则返回。

疑惑:如果某区间gcd为16,问区间gcd是否为2,并存在一个数必须修改,为什么是yes?

答:只需将必须修改的数改为2,区间gcd就变成了2,答案是yes。

//#include <bits/stdc++.h>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <iostream>
#include <string>
#include <stdio.h>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <string.h>
#include <vector>
#define ME(x , y) memset(x , y , sizeof(x))
#define SF(n) scanf("%d" , &n)
#define rep(i , n) for(int i = 0 ; i < n ; i ++)
#define INF 0x3f3f3f3f
#define mod 20191117
#define PI acos(-1)
#define gcd __gcd
using namespace std;
typedef long long ll ;
int ans ; struct node
{
int l , r , val ;
}tree[500000<<2]; void build(int l , int r , int root)
{
tree[root].l = l , tree[root].r = r ;
if(l == r)
{
scanf("%d" , &tree[root].val);
return ;
}
int mid = (tree[root].l + tree[root].r) >> 1 ;
build(l , mid , root*2);
build(mid+1 , r , root*2+1);
tree[root].val = gcd(tree[root*2].val , tree[root*2+1].val);
} void update(int x , int val , int root)
{
if(tree[root].l == tree[root].r)
{
tree[root].val = val ;
return ;
}
int mid = (tree[root].l + tree[root].r) >> 1 ;
if(x <= mid)
update(x , val , root*2);
else{
update(x , val , root*2+1);
}
tree[root].val = gcd(tree[root*2].val , tree[root*2+1].val);
} void query(int l , int r , int val , int root)
{
if(tree[root].l == tree[root].r)//该点必修改
{
ans++;
return ;
}
if(ans > 1) return ;
int mid = (tree[root].l + tree[root].r) >> 1 ; if(l <= mid && tree[root*2].val % val != 0)//目标在左儿子区间存在,且左儿子gcd%val!=0,则递归该儿子
query(l , r , val , root*2);
if(r > mid && tree[root*2+1].val % val != 0)
query(l , r , val , root*2+1);
} int main()
{
int n;
scanf("%d" , &n);
build(1 , n , 1);
int q ;
scanf("%d" , &q);
for(int i = 0 ; i < q ; i++)
{
int t ;
scanf("%d" , &t);
if(t == 2)
{
int x ,val;
scanf("%d%d" , &x , &val);
update(x , val , 1);
}
else{
int l , r , val ;
scanf("%d%d%d" , &l , &r , &val);
ans = 0 ;
query(l , r , val , 1);
if(ans <= 1)
printf("YES\n");
else{
printf("NO\n");
}
}
} return 0;
}

区间gcd的更多相关文章

  1. HDU 5726 GCD 区间GCD=k的个数

    GCD Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submis ...

  2. Codeforces 914D - Bash and a Tough Math Puzzle 线段树,区间GCD

    题意: 两个操作, 单点修改 询问一段区间是否能在至多一次修改后,使得区间$GCD$等于$X$ 题解: 正确思路; 线段树维护区间$GCD$,查询$GCD$的时候记录一共访问了多少个$GCD$不被X整 ...

  3. bzoj 5028: 小Z的加油店——带修改的区间gcd

    Description 小Z经营一家加油店.小Z加油的方式非常奇怪.他有一排瓶子,每个瓶子有一个容量vi.每次别人来加油,他会让 别人选连续一段的瓶子.他可以用这些瓶子装汽油,但他只有三种操作: 1. ...

  4. dutacm.club 1094: 等差区间(RMQ区间最大、最小值,区间GCD)

    1094: 等差区间 Time Limit:5000/3000 MS (Java/Others)   Memory Limit:163840/131072 KB (Java/Others)Total ...

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

    前言: 主要最近在刷莫队的题,这题GCD的特性让我对莫队的使用也有了新的想法.给福利:神犇的一套莫队算法题 先撇开题目,光说裸的一个莫队算法,主要的复杂度就是n*sqrt(n)对吧,这里我忽略了一个左 ...

  6. 区间 GCD

    区间 GCD题目描述最近 JC 同学刚学会 gcd,于是迷上了与 gcd 有关的问题.今天他又出了一道这样的题目,想要考考你,你能顺利完成吗?给定一个长度为 n 的字符串 s[1..n],串仅包含小写 ...

  7. HDU 5726 GCD (2016多校、二分、ST表处理区间GCD、数学)

    题目链接 题意 : 给出一个有 N 个数字的整数数列.给出 Q 个问询.每次问询给出一个区间.用 ( L.R ) 表示.要你统计这个整数数列所有的子区间中有多少个和 GCD( L ~ R ) 相等.输 ...

  8. 区间加值,区间gcd, 牛客949H

    牛客小白月赛16H 小阳的贝壳 题目链接 题意 维护一个数组,支持以下操作: 1: 区间加值 2: 询问区间相邻数差的绝对值的最大值 3: 询问区间gcd 题解 设原数组为\(a\), 用线段树维护\ ...

  9. 洛谷 P5502 - [JSOI2015]最大公约数(区间 gcd 的性质+分治)

    洛谷题面传送门 学校模拟赛的某道题让我联想到了这道题-- 先讲一下我的野鸡做法. 首先考虑分治,对于左右端点都在 \([L,R]\) 中的区间我们将其分成三类:完全包含于 \([L,mid]\) 的区 ...

随机推荐

  1. PIXI如何绘制离屏canvas到舞台上

    有个方法是toDataURL(),原生的,先转换成图片再绘制. 但是pixi提供了一个BaseTexture,其构造函数的参数可以是一个canvas 因此可以直接使用如下代码绘制canvas //微信 ...

  2. CSS 阴影应用

    1.背景阴影的使用 box-shadow:1px 1px 1px 1px #ccccccc inset; 说明:第一个参数为水平阴影的大小.第二个为垂直阴影的大小(值可以为负数).第三个参数是阴影模糊 ...

  3. npm安装源修改为淘宝源

    npm安装源修改为淘宝源 标签(空格分隔): 编译 原:https://cnodejs.org/topic/4f9904f9407edba21468f31e npm安装源修改为淘宝源 镜像使用方法(三 ...

  4. java第二周小结

    这是接触Java的第一周,了解这个语言的一些基础知识,下面是对这段时间重要知识点的汇总 一.Java是一种面向对象的语言    特点为:简洁高效.可移植性.适合分布式计算.健壮防患于未然的特性.多线程 ...

  5. 当出现no changes added to commit时如何正确使用git提交命令

    对于这个问题,最好的解决方法就是按如下步骤:1.到根目录下:git add .  :("."是必须要的)2.git commit -m "some word"3 ...

  6. linux系统PS命令,按CPU、内存使用率对进程排序

    https://blog.csdn.net/weixin_42123737/article/details/90081318

  7. Promethus

    https://blog.csdn.net/zl1zl2zl3/article/details/74332437

  8. (转)使用NMAP工具扫描端口

    原文:http://www.linuxde.net/2013/02/12354.html nmap 是一个用于网络探索或安全评测的工具.它支持 ping 扫描(判定哪些主机在运行),多端口扫描技术(判 ...

  9. fixture之autouse=True

    平常写自动化用例会写一些前置的fixture操作,用例需要用到就直接传该函数的参数名称就行了.当用例很多的时候,每次都传这个参数,会比较麻烦.fixture里面有个参数autouse,默认是Fasle ...

  10. Delphi回车键切换焦点

    unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...