Codeforce 914 D. Bash and a Tough Math Puzzle 解析(線段樹、數論)

今天我們來看看CF914D

題目連結

題目

給你一個長度為\(n\)的數列\(a\),每次玩家會選擇一個區間猜\(g.c.d.\)的值,或者改變數列中的某個數字。而猜中不一定要完全準確,如果玩家能夠改動一個區間中的數字讓\(g.c.d.\)完全猜中也是可以的。

前言

我對線段樹還是不熟阿,一開始一直感覺\(g.c.d.\)沒辦法用線段樹維護...

想法

上模板,從維護區間和的模板改成維護\(g.c.d.\)(這就是為什麼我code中的元素修改函式叫做\(add\))。

接著注意到一件事,猜中的條件是:假設區間中有\(k\)個數字,只要其中\(k-1\)個數字可以被\(val\)(\(val\stackrel{def}{=}\)玩家猜的數字)整除就可以了(如果這\(k-1\)個數字的\(g.c.d.\ge val\),那麼只要把最後那個數字改成\(val\)就好)。

一開始我就直接這樣實作,每次從\(root\)開始往下找有幾個數字可以被整除,整個區間都看過以後再來檢查是否\(\ge k-1\),但是發現這樣會TLE。

查網路後發現我們必須用一個全域變數去計算:有多少在區間中數字不可被整除,如果發現數量\(>1\)就要馬上跳離搜尋,如此一來就不會TLE了。

(\(almost\)函式是這題的重點,寫法和模板有點差異,要小心實作。)

程式碼:

const int _n=5e5+10;
int n,a[_n],q,tt,tot=0;
namespace Seg{
int nn;
int t[_n<<2];
void pull(int v){t[v]=__gcd(t[2*v+1],t[2*v+2]);}
void apply(int v, int val){t[v]=val;}
void build(int v, int l, int r){
if(l+1==r)t[v]=a[l];
else{int m=(l+r)>>1;build(2*v+1,l,m),build(2*v+2,m,r);pull(v);}
}
void add(int v,int l,int r,int ql,int qr,int val){
if(r<=ql or qr<=l)return;
else if(ql<=l and r<=qr)apply(v,val);
else{
int m=(l+r)>>1;
add(2*v+1,l,m,ql,qr,val),add(2*v+2,m,r,ql,qr,val);
pull(v);
}
}
void add(int pos,ll val){add(0,0,nn,pos,pos+1,val);}
void init(int n_){nn=n_;build(0,0,nn);}
void almost(int v,int l,int r,int ql,int qr,int val){
if(tot>1)return;
if(r<=ql or qr<=l)return;
else if(ql<=l and r<=qr and t[v]%val==0)return;
else{
if(l+1==r){tot++;return;}
int m=(l+r)>>1;
almost(2*v+1,l,m,ql,qr,val),almost(2*v+2,m,r,ql,qr,val);
}
}
}
main(void) {cin.tie(0);ios_base::sync_with_stdio(0);
cin>>n;rep(i,0,n)cin>>a[i]; cin>>q;
Seg::init(n);
while(q--){
cin>>tt;
if(tt==1){
int l,r,x;cin>>l>>r>>x;l--,r--;
tot=0;Seg::almost(0,0,n,l,r+1,x);
if(tot<=1)cout<<"YES\n";
else cout<<"NO\n";
}else{
int i,y;cin>>i>>y;i--;
Seg::add(i,y);
}
}
return 0;
}

標頭、模板請點Submission看

Submission

D. Bash and a Tough Math Puzzle 解析(線段樹、數論)的更多相关文章

  1. CF 914 D. Bash and a Tough Math Puzzle

    D. Bash and a Tough Math Puzzle http://codeforces.com/contest/914/problem/D 题意: 单点修改,每次询问一段l~r区间能否去掉 ...

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

    Bash and a Tough Math Puzzle CodeForces 914D 线段树+gcd数论 题意 给你一段数,然后小明去猜某一区间内的gcd,这里不一定是准确值,如果在这个区间内改变 ...

  3. E. Copying Data 解析(線段樹)

    Codeforce 292 E. Copying Data 解析(線段樹) 今天我們來看看CF292E 題目連結 題目 給你兩個陣列\(a,b\),有兩種操作:把\(a\)的一段複製到\(b\),或者 ...

  4. Codecraft-18 and Codeforces Round #458:D,Bash and a Tough Math Puzzle

    题目传送门 题目大意:Bash喜欢对数列进行操作.第一种操作是询问l~r区间内的gcd值是否几乎为x,几乎为表示能否至多修改一个数达到.第二种操作是将ai修改为x.总共Q个询问,N个数. Soluti ...

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

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

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

    题目链接 \(Description\) 给定一个序列,两种操作:一是修改一个点的值:二是给一个区间\([l,r]\),问能否只修改一个数使得区间gcd为\(x\). \(Solution\) 想到能 ...

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

    传送门 线段树辣鸡题. 题意简述:给出一个序列,支持修改其中一个数,以及在允许自行修改某个数的情况下询问区间[l,r][l,r][l,r]的gcdgcdgcd是否可能等于一个给定的数. 看完题就感觉是 ...

  8. Bash and a Tough Math Puzzle CodeForces - 914D (线段树二分)

    大意:给定序列, 单点修改, 区间询问$[l,r]$内修改至多一个数后$gcd$能否为$x$ 这题比较有意思了, 要注意到询问等价于$[l,r]$内最多有1个数不为$x$的倍数 可以用线段树维护gcd ...

  9. [CF914D]Bash and a Tough Math Puzzle

    给定一个数列$a_1,a_2,...,a_n$,支持两种操作 1 l r x,猜测数列中[l,r]位置上的数的最大公约数$x$,判断这个猜测是否是接近正确的.如果我们可以在数列[l,r]位置中改动至多 ...

随机推荐

  1. java安全编码指南之:敏感类的拷贝

    目录 简介 一个简单的SensitiveObject SensitiveObject的限制 对SensitiveObject的攻击 解决办法 简介 一般来说class中如果包含了私有的或者敏感的数据的 ...

  2. 双向最大匹配算法——基于词典规则的中文分词(Java实现)

    目录 一.中文分词理论描述 二.算法描述 1.正向最大匹配算法 2.反向最大匹配算法 3.双剑合璧 三.案例描述 四.JAVA实现完整代码 五.组装UI 六.总结 前言 这篇将使用Java实现基于规则 ...

  3. springmvc 源码分析(二)-- DiapartcherServlet核心调用流程分析

    测试环境搭建: 本次搭建是基于springboot来实现的,代码在码云的链接:https://gitee.com/yangxioahui/thymeleaf.git 项目结构代码如下: 一: cont ...

  4. Actor:人生如戏全靠演技--“三维度”逻辑编程语言的设计(3)

    在上一篇介绍了逻辑编程的作用,介绍了逻辑编程中的一些概念,包括逻辑程序的结构:事实.规则和问题:知识的表达方式:谓词演算.产生式规则,以及这些概念与三维度(角色+场景+时间)理论的契合关系,正式提出了 ...

  5. Hadoop框架:HDFS读写机制与API详解

    本文源码:GitHub·点这里 || GitEE·点这里 一.读写机制 1.数据写入 客户端访问NameNode请求上传文件: NameNode检查目标文件和目录是否已经存在: NameNode响应客 ...

  6. Centos-将文件内容输出到标准输出-cat

    cat 将文件内容输出到标准输出 相关选项 -n 显示行号,包括空行 -b 显示行号,不包括空行 -A 显示制表符为 ^I ,结尾符为 $ 应用 1. 清空文件 cat /dev/null > ...

  7. selenium3介绍

    1.  简介 Selenium是用于测试 Web应用程序用户界面 (UI)的常用框架.它是一款用于运行端到端功能测试的超强工具.您可以使用多个编程语言编写测试,并且 Selenium能够在一个或多个浏 ...

  8. CTFshow_Web入门源码

    Web1 题目打开始是这样的 直接看源码 Web2 题目打开是这样的,右键无法打开菜单,无法查看源码,F12也不可以 更改JavaScript权限,即可查看源码 Web3 真就抓个包看看 Web4 访 ...

  9. vs中CString的用法,以及所需的头文件

    转载:https://blog.csdn.net/shizhandong50/article/details/13321505 1.CString类型的头文件#include <afx.h> ...

  10. C++中cout.setf()和cout.precision()

    这两个就是格式控制的~ostream成员函数里面的,也可以用输出流操作符来控制,都一样的~附给你一些看看~ 其中cout.setf跟setiosflags一样的,cout.precision跟setp ...