BZOJ4373 算术天才与等差数列 题解
题目大意:
一个长度为n的序列,其中第i个数为a[i]。修改一个点的值询问区间[l,r]内的数从小到大排序后能否形成公差为k的等差数列。
思路:
1.一段区间符合要求满足:(1)区间中的max-min=(r-l)*公差;(2)区间相邻的两个数的差的gcd为公差;(3)区间内的数不重复。
2.(1)(2)用一个线段树维护,(3)首先,序列出现过的值最多只有600000种,所以可以对于每个值开一个set(离散化),对应的id用一个map存起来。然后维护一个pre[i],表示当前a[i]这个值,在i前面最后一次出现的位置。那么满足(3),当且仅当区间[l,r]的pre的最大值小于l。这个也是用线段树维护。然后看修改操作:在set上找前一个数、后一个数,然后修改相应的值。
反思:
(1)(2)比较好求就打了,网上有人这样A了,(3)既不理解又不会STL就不打了(逃……
单点时公差可为任何数,要特判。线段树修改时从底向上更新,gcd原来与最大最小值分开和加法一样打的,可WA了就换成这样了(不过原来的应该是能A的)。
代码:
#include<cstdio>
const int M=;
struct data{ int l,r,max,min,gcd; }t[M<<],u,v;
int p,a[M]; int abs(int x) { return x>?x:-x; }
int Min(int x,int y) { return x<y?x:y; }
int Max(int x,int y) { return x>y?x:y; } int read()
{
int x=; char ch=getchar();
for (;ch< || ch>;ch=getchar());
for (;ch> && ch<;ch=getchar()) x=(x<<)+(x<<)+ch-;
return x;
} int Gcd(int x,int y)
{
if (!x) return y; if (!y) return x;
for (int z;y;z=y,y=x%z,x=z);
return x;
} void push_up(int k)
{
t[k].l=t[k<<].l,t[k].r=t[k<<|].r;
t[k].max=Max(t[k<<].max,t[k<<|].max);
t[k].min=Min(t[k<<].min,t[k<<|].min);
t[k].gcd=Gcd(Gcd(t[k<<].gcd,t[k<<|].gcd),abs(t[k<<].r-t[k<<|].l));
} void build(int l,int r,int k)
{
if (l==r) { t[k].max=t[k].min=t[k].l=t[k].r=a[l]; return; }
int mid=l+r>>; build(l,mid,k<<),build(mid+,r,k<<|),push_up(k);
} void change(int l,int r,int k,int x,int cur)
{
if (l==r) { t[cur].max=t[cur].min=t[cur].l=t[cur].r=x; return; }
int mid=l+r>>;
if (k>mid) change(mid+,r,k,x,cur<<|);
else change(l,mid,k,x,cur<<);
push_up(cur);
} data query(int l,int r,int L,int R,int cur)
{
if (L<=l && r<=R) return t[cur];
int mid=l+r>>; data x,y,z=v;
bool fl=,fr=;
if (L<=mid) fl=,x=query(l,mid,L,R,cur<<);
if (R>mid) fr=,y=query(mid+,r,L,R,cur<<|);
if (fl)
if (fr) z.l=x.l,z.r=y.r,z.max=Max(x.max,y.max),
z.min=Min(x.min,y.min),z.gcd=Gcd(Gcd(x.gcd,y.gcd),abs(x.r-y.l));
else z=x;
else z=y;
return z;
} int main()
{
int n=read(),m=read(),x,y,k,i;
for (i=;i<=n;++i) a[i]=read();
for (build(,n,);m--;)
if (read()^) x=read()^p,y=read()^p,change(,n,x,y,);
else
{
x=read()^p,y=read()^p,k=read()^p,u=query(,n,x,y,);
if (x==y || u.gcd==k && u.max-u.min==(y-x)*k) puts("Yes"),++p;
else puts("No");
}
return ;
}
BZOJ4373 算术天才与等差数列 题解的更多相关文章
- BZOJ4373 算术天才⑨与等差数列 【线段树】*
BZOJ4373 算术天才⑨与等差数列 Description 算术天才⑨非常喜欢和等差数列玩耍. 有一天,他给了你一个长度为n的序列,其中第i个数为a[i]. 他想考考你,每次他会给出询问l,r,k ...
- 【线段树 集合hash】bzoj4373: 算术天才⑨与等差数列
hash大法好(@ARZhu):大数相乘及时取模真的是件麻烦事情 Description 算术天才⑨非常喜欢和等差数列玩耍.有一天,他给了你一个长度为n的序列,其中第i个数为a[i].他想考考你,每次 ...
- [BZOJ4373]算术天才⑨与等差数列(线段树)
[l,r]中所有数排序后能构成公差为k的等差数列,当且仅当: 1.区间中最大数-最小数=k*(r-l) 2.k能整除区间中任意两个相邻数之差,即k | gcd(a[l+1]-a[l],a[l+2]-a ...
- BZOJ4373 算术天才⑨与等差数列(线段树)
看上去很难维护,考虑找一些必要条件.首先显然最大值-最小值=k*(r-l).然后区间内的数需要模k同余.最后区间内的数两两不同(k=0除外).冷静一下可以发现这些条件组合起来就是充分的了. 考虑怎么维 ...
- BZOJ4373 : 算术天才⑨与等差数列
设$pre[i]$表示第$i$个数上一次出现的位置,$d[i]=abs(a[i]-a[i+1])$. 用线段树维护区间内$a$的最小值.最大值,$pre$的最大值以及$d$的$\gcd$. 对于询问$ ...
- BZOJ4373: 算术天才⑨与等差数列(线段树 hash?)
题意 题目链接 Sol 正经做法不会,听lxl讲了一种很神奇的方法 我们考虑如果满足条件,那么需要具备什么条件 设mx为询问区间最大值,mn为询问区间最小值 mx - mn = (r - l) * k ...
- bzoj4373 算术天才⑨与等差数列——线段树+set
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4373 一个区间有以 k 为公差的数列,有3个条件: 1.区间 mx - mn = (r-l) ...
- 【BZOJ4373】算术天才⑨与等差数列 线段树+set
[BZOJ4373]算术天才⑨与等差数列 Description 算术天才⑨非常喜欢和等差数列玩耍.有一天,他给了你一个长度为n的序列,其中第i个数为a[i].他想考考你,每次他会给出询问l,r,k, ...
- 【BZOJ4373】算术天才⑨与等差数列 [线段树]
算术天才⑨与等差数列 Time Limit: 10 Sec Memory Limit: 128 MB[Submit][Status][Discuss] Description 算术天才⑨非常喜欢和等 ...
随机推荐
- HDU 1223 打表 + 大数
http://acm.hdu.edu.cn/showproblem.php?pid=1223 一般遇到这些题,我都是暴力输出前几项,找规律.未果. 然后输出n = 1时候,以A开始,有多少个答案, n ...
- salt-stack系列报错
master启动报错 实验环境为: [root@master salt]# cat /proc/version Linux version 3.10.0-327.el7.x86_64 (mockbui ...
- PHP的知识点总结1
PHP 基础知识总结 2015-06-03 分类: 编程技术 PHP 代表 PHP: Hypertext Preprocessor PHP 文件可包含文本.HTML.JavaScript代码和 P ...
- 2018微软实习笔试一道dp题目总结
题意大概是说在一维数轴上起点和终点的距离是d,现在我们要从起点走到终点.每走一个单位长度消耗一个单位能量,初始时有K单位能量.同时在起点和终点之间分布一些加油站a1,a2,...an,给你加油站数量. ...
- 雪碧图(background-position)、overflow、title中的小图标、光标、rgb 和opacity 与rgba
一.background-position 雪碧图 我们的html和css中有三个属性可以向服务器发送请求:src url href 1.我们为什么使用雪碧图? 因为我们使用雪碧图之 ...
- SEO & HTML语义化
SEO SEO的概念:搜索引擎优化,常见的搜索引擎有百度.谷歌等.优化的话,就是通过我们的处理,使得我们的网站在搜索引擎下有一个理想的结果. SEO的目的:当用户在搜索引擎上搜索关键词的时候,看到我们 ...
- 不全屏显示、手柄不居中的SlidingDrawer
SlidingDrawer是一个滑动式抽屉,通过点击或拖拽手柄(handle)来显示或隐藏内容(content). 看了很多关于SlidingDrawer的例子,但基本都是全屏显示,并且手柄居中的.我 ...
- RHEL6.4上Samba/NFS服务器简单配置
近期在RHEL6.4上尝试搭建一个NAS,底层使用XFS文件系统,对外主要提供samba协议和NFS协议共享,这里把主要步骤记录下来. 环境:RHEL6.4,IP:192.168.50.117 1.关 ...
- JAVA自带的加密算法-MD5\SHA1\BASE64
需要导入jar包: commons-codec.jar MD5 String str = "abc"; DigestUtils.md5Hex(str); SHA1 String s ...
- iview table icon dorpdown html页面级别vue组件 #vuez#
iview table icon dorpdown html页面级别vue组件 <!DOCTYPE html> <html> <head> <meta cha ...