D. Bash and a Tough Math Puzzle 解析(線段樹、數論)
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 解析(線段樹、數論)的更多相关文章
- 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区间能否去掉 ...
- Bash and a Tough Math Puzzle CodeForces 914D 线段树+gcd数论
Bash and a Tough Math Puzzle CodeForces 914D 线段树+gcd数论 题意 给你一段数,然后小明去猜某一区间内的gcd,这里不一定是准确值,如果在这个区间内改变 ...
- E. Copying Data 解析(線段樹)
Codeforce 292 E. Copying Data 解析(線段樹) 今天我們來看看CF292E 題目連結 題目 給你兩個陣列\(a,b\),有兩種操作:把\(a\)的一段複製到\(b\),或者 ...
- Codecraft-18 and Codeforces Round #458:D,Bash and a Tough Math Puzzle
题目传送门 题目大意:Bash喜欢对数列进行操作.第一种操作是询问l~r区间内的gcd值是否几乎为x,几乎为表示能否至多修改一个数达到.第二种操作是将ai修改为x.总共Q个询问,N个数. Soluti ...
- Codeforces 914D - Bash and a Tough Math Puzzle 线段树,区间GCD
题意: 两个操作, 单点修改 询问一段区间是否能在至多一次修改后,使得区间$GCD$等于$X$ 题解: 正确思路; 线段树维护区间$GCD$,查询$GCD$的时候记录一共访问了多少个$GCD$不被X整 ...
- Codeforces.914D.Bash and a Tough Math Puzzle(线段树)
题目链接 \(Description\) 给定一个序列,两种操作:一是修改一个点的值:二是给一个区间\([l,r]\),问能否只修改一个数使得区间gcd为\(x\). \(Solution\) 想到能 ...
- 2018.12.08 codeforces 914D. Bash and a Tough Math Puzzle(线段树)
传送门 线段树辣鸡题. 题意简述:给出一个序列,支持修改其中一个数,以及在允许自行修改某个数的情况下询问区间[l,r][l,r][l,r]的gcdgcdgcd是否可能等于一个给定的数. 看完题就感觉是 ...
- Bash and a Tough Math Puzzle CodeForces - 914D (线段树二分)
大意:给定序列, 单点修改, 区间询问$[l,r]$内修改至多一个数后$gcd$能否为$x$ 这题比较有意思了, 要注意到询问等价于$[l,r]$内最多有1个数不为$x$的倍数 可以用线段树维护gcd ...
- [CF914D]Bash and a Tough Math Puzzle
给定一个数列$a_1,a_2,...,a_n$,支持两种操作 1 l r x,猜测数列中[l,r]位置上的数的最大公约数$x$,判断这个猜测是否是接近正确的.如果我们可以在数列[l,r]位置中改动至多 ...
随机推荐
- 使用监听器来启动spring -------使用监听器初始化上下文参数
问题: 数据初始化监听器要注入spring容器的对象,必须先启动spring容器才能使用监听器初始化数据. 解决: 使用监听器来启动spring框架 问题:spring框架启动需要哪些参数? 1.需要 ...
- spring:spring再总结(ioc、aop、DI等)
IOC(Inversion of Control),即"控制反转",不是一种技术而是一种思想 1.IOC的理解 Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部 ...
- 简述application.properties和application.yml 以及 @ConfigurationProperties 和@PropertySource @Value 和@ImportResource的用法,区别
问题: 如何在application.properties和application.yml中配置String,Date,Object,Map,List类型的属性,并且idea能提示 先写一个Perso ...
- django 的跨域配置
1.跨域原理 #1. 首先浏览器安全策略限制js ajax跨域访问服务器 #2. 如果服务器返回的头部信息中有当前域: // 允许 http://localhost:8080 这个网站打开的页面中的j ...
- SVN合并分支提示不是祖先关系
开发:dev 测试:test 开发完成后,需要合并到test然后部署,进入测试. F:主干 合并到那里,那里就是主干(要合并到的分支)[起始] T:分支 从那里合并那里就是分支[结束] 备注:需要精确 ...
- matlab中colormap
来源:https://ww2.mathworks.cn/help/matlab/ref/colormap.html?searchHighlight=colormap&s_tid=doc_src ...
- Tensorflow学习笔记No.1
使用tf.keras.Sequential()建立网络模型 整个过程可分为五步:1创建Sequential模型,2添加所需要的神经层,3使用.compile方法确定模型训练结构,4使用.fit方法 使 ...
- Linux系统编程—有名管道
▋****1. 管道的概念 管道,又名「无名管理」,或「匿名管道」,管道是一种非常基本,也是使用非常频繁的IPC方式. 1.1 管道本质 管道的本质也是一种文件,不过是伪文件,实际上是一块内核缓冲区, ...
- 实时,异步网页使用jTable, SignalR和ASP。NET MVC
下载source code - 984.21 KB 图:不同客户端的实时同步表. 点击这里观看现场演示. 文章概述 介绍使用的工具演示实现 模型视图控制器 遗言和感谢参考历史 介绍 HTTP(即web ...
- ansible-playbook-jinja2管理nginx配置文件
1. 案例1:创建jinja2的nginx的主配置文件 1) 编写jinja2的nginx的主配置文件 1 [root@test-1 jinja2]# vim /ansible/jinja2/tes ...