区间gcd
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的更多相关文章
- HDU 5726 GCD 区间GCD=k的个数
GCD Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submis ...
- Codeforces 914D - Bash and a Tough Math Puzzle 线段树,区间GCD
题意: 两个操作, 单点修改 询问一段区间是否能在至多一次修改后,使得区间$GCD$等于$X$ 题解: 正确思路; 线段树维护区间$GCD$,查询$GCD$的时候记录一共访问了多少个$GCD$不被X整 ...
- bzoj 5028: 小Z的加油店——带修改的区间gcd
Description 小Z经营一家加油店.小Z加油的方式非常奇怪.他有一排瓶子,每个瓶子有一个容量vi.每次别人来加油,他会让 别人选连续一段的瓶子.他可以用这些瓶子装汽油,但他只有三种操作: 1. ...
- dutacm.club 1094: 等差区间(RMQ区间最大、最小值,区间GCD)
1094: 等差区间 Time Limit:5000/3000 MS (Java/Others) Memory Limit:163840/131072 KB (Java/Others)Total ...
- HDU5381【莫队算法+区间GCD特性】
前言: 主要最近在刷莫队的题,这题GCD的特性让我对莫队的使用也有了新的想法.给福利:神犇的一套莫队算法题 先撇开题目,光说裸的一个莫队算法,主要的复杂度就是n*sqrt(n)对吧,这里我忽略了一个左 ...
- 区间 GCD
区间 GCD题目描述最近 JC 同学刚学会 gcd,于是迷上了与 gcd 有关的问题.今天他又出了一道这样的题目,想要考考你,你能顺利完成吗?给定一个长度为 n 的字符串 s[1..n],串仅包含小写 ...
- HDU 5726 GCD (2016多校、二分、ST表处理区间GCD、数学)
题目链接 题意 : 给出一个有 N 个数字的整数数列.给出 Q 个问询.每次问询给出一个区间.用 ( L.R ) 表示.要你统计这个整数数列所有的子区间中有多少个和 GCD( L ~ R ) 相等.输 ...
- 区间加值,区间gcd, 牛客949H
牛客小白月赛16H 小阳的贝壳 题目链接 题意 维护一个数组,支持以下操作: 1: 区间加值 2: 询问区间相邻数差的绝对值的最大值 3: 询问区间gcd 题解 设原数组为\(a\), 用线段树维护\ ...
- 洛谷 P5502 - [JSOI2015]最大公约数(区间 gcd 的性质+分治)
洛谷题面传送门 学校模拟赛的某道题让我联想到了这道题-- 先讲一下我的野鸡做法. 首先考虑分治,对于左右端点都在 \([L,R]\) 中的区间我们将其分成三类:完全包含于 \([L,mid]\) 的区 ...
随机推荐
- Python 列表(List)Ⅱ
删除列表元素 可以使用 del 语句来删除列表的元素,如下实例: . 以上实例输http://www.xuanhe.net/出结果: 注意:我们会在接下来的章节讨论remove()方法的使用 Pyth ...
- php实现hashTable
Hash表作为最重要的数据结构之一,也叫做散列表.使用PHP实现Hash表的功能.PHP可以模拟实现Hash表的增删改查.通过对key的映射到数组中的一个位置来访问.映射函数叫做Hash函数,存放记录 ...
- postman—随机数和Monitors
postman做重复测试时,随机数就有很大的作用,不用每次都输入 在postman的Params中,输入一个左大括号,会显示三种随机数: 也可以在body中设置 随机数如下: {{$guid}}:添加 ...
- DevOps之持续集成SonarQube代码质量扫描
一.SonarQube介绍 SonarQube是一个用于代码质量检测管理的开放平台,可以集成不同的检测工具,代码分析工具,以及持续集成工具.SonarQube 并不是简单地把不同的代码检查 ...
- Springboot 构建http服务,返回的http行是'HTTP/1.1 200' 无状态码描述 客户端解析错误
————————————————————————————————————————— *** 响应的数据格式 HTTP/1.1 200 OK Server: Apache-Coyote/1.1 A ...
- 学习日记21、IE下的Ajax需要注意的地方
上面这张图片我是封装了一个easyui下拉框,红框出则是动态传入的json数据,这串代码在google下运行不会有任何问题,但是在IE下运行则会提示缺少:,这是因为IE只识别json格式的数据,所以这 ...
- 时间戳Unix和时间之间的转换
时间戳 ---> 时间 var a="1523258178"; var start = new Date(a).format("yyyy-MM-dd hh:mm ...
- Proxy-代理器(预计vue3.0实现双向绑定的方式)
todo 常见的基于数据劫持的双向绑定有两种实现,一个是目前Vue在用的Object.defineProperty,另一个是ES2015中新增的Proxy,而Vue的作者宣称将在Vue3.0版本后加入 ...
- Vue 项目构建
一.初始化项目 1.vue init webpack (fileName) 2.项目名称 3.项目描述 4.项目作者 5.是否依赖 .Vue 文件开发 第一个选项可以不依赖 .Vue 文件开发, 第二 ...
- rosbag record and play
话题录制: 录制所有发布出来的话题,此时默认将话题保存在一个以当时时间戳命名的文件夹中: $ rosbag record -a1 录制指定话题: $ rosbag record /topic1 ...