题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4373

能形成公差为k的等差数列的条件:mx-mn=k*(r-l) && 差分数组gcd为k  && 区间内没有重复的数。

这些都可以线段树维护。

那个“没有重复的数”需要给每个位置记下权值的pre,修改的时候需要找到它前面一个和后面一个。

用链表的话没法插入。可以给每个权值开一个set,就能用lower_bound了。

有些细节。重载运算符很方便。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<map>
#include<set>
using namespace std;
const int N=3e5+,INF=1e9+;
int n,m,c[N],ls[N<<],rs[N<<],tot,pre[N],lt,cnt;
map<int,int> mp;
set<int> s[N<<];
int gcd(int a,int b){return b?gcd(b,a%b):a;}
int abss(int k){return k<?-k:k;}
struct Node{
int mx,mn,lst,g;
Node(int a=,int b=,int l=,int g=):mx(a),mn(b),lst(l),g(g) {}
Node operator+ (const Node &b)const
{
return Node(max(mx,b.mx),min(mn,b.mn),max(lst,b.lst),gcd(g,b.g));
}
}a[N<<];
void add(int x)
{
mp[x]=++cnt;s[cnt].insert();s[cnt].insert(n+);
}
void pshp(int cr)
{
a[cr]=a[ls[cr]]+a[rs[cr]];
}
void build(int l,int r,int cr)
{
if(l==r)
{
a[cr]=Node(c[l],c[l],pre[l],abss(c[l+]-c[l]));return;
}
int mid=((l+r)>>);
ls[cr]=++tot;build(l,mid,ls[cr]);
rs[cr]=++tot;build(mid+,r,rs[cr]);
pshp(cr);//!!!
}
void updt(int l,int r,int cr,int p)
{
if(l==r)
{
a[cr]=Node(c[l],c[l],pre[l],abss(c[l+]-c[l]));return;
}
int mid=((l+r)>>);
if(p<=mid)updt(l,mid,ls[cr],p);
else updt(mid+,r,rs[cr],p);
pshp(cr);
}
Node query(int l,int r,int cr,int L,int R)
{
if(l>=L&&r<=R)return a[cr];
int mid=((l+r)>>);
if(L>mid)return query(mid+,r,rs[cr],L,R);
if(R<=mid)return query(l,mid,ls[cr],L,R);
return query(l,mid,ls[cr],L,R)+query(mid+,r,rs[cr],L,R);
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
{
scanf("%d",&c[i]);
if(!mp[c[i]])add(c[i]);
int t=mp[c[i]];
pre[i]=*--s[t].lower_bound(i);
s[t].insert(i);
}
a[n+]=a[n];//?是为了让最后一个点的差分是0,使不影响吧
tot=;build(,n,);
int op,x,y;
while(m--)
{
scanf("%d",&op);
if(op==)
{
scanf("%d%d",&x,&y);x^=lt;y^=lt;
int t=mp[c[x]];
int u=*--s[t].lower_bound(x),v=*s[t].upper_bound(x);
if(v!=n+)pre[v]=u,updt(,n,,v);//v!=n+1
s[t].erase(x);
if(!mp[y])add(y);t=mp[y];
u=*--s[t].lower_bound(x);v=*s[t].upper_bound(x);
if(v!=n+)pre[v]=x,updt(,n,,v);//v!=n+1
pre[x]=u;c[x]=y;s[t].insert(x);
updt(,n,,x);
if(x!=)updt(,n,,x-);//x!=1//为了改差分
}
else
{
int L,R,k;
scanf("%d%d%d",&L,&R,&k);L^=lt;R^=lt;k^=lt;
if(L==R){printf("Yes\n");lt++;continue;}//放在下面那个if的上面!
Node ans0=query(,n,,L,R-),ans=ans0+query(,n,,R,R);//为了差分弄ans0
if(!k) //放在下面那个if的上面!
{
if(ans.mx==ans.mn)printf("Yes\n"),lt++;
else printf("No\n");
continue;
}
if(ans.lst<L&&ans.mx-ans.mn==k*(R-L)&&ans0.g==k)printf("Yes\n"),lt++;
else printf("No\n");
}
}
return ;
}

bzoj 4373 算术天才⑨与等差数列——线段树+set的更多相关文章

  1. BZOJ 4373 算术天才⑨与等差数列 线段树+set(恶心死我了)

    mdzz,这道题重构了4遍,花了一个晚上... 满足等差数列的条件: 1. 假设min是区间最小值,max是区间最大值,那么 max-min+k(r−l) 2. 区间相邻两个数之差的绝对值的gcd=k ...

  2. BZOJ 4373算术天才⑨与等差数列(线段树)

    题意:给你一个长度为n的序列,有m个操作,写一个程序支持以下两个操作: 1. 修改一个值 2. 给出三个数l,r,k, 询问:如果把区间[l,r]的数从小到大排序,能否形成公差为k的等差数列. n,m ...

  3. BZOJ 4373: 算术天才⑨与等差数列 线段树

    Description 算术天才⑨非常喜欢和等差数列玩耍. 有一天,他给了你一个长度为n的序列,其中第i个数为a[i]. 他想考考你,每次他会给出询问l,r,k,问区间[l,r]内的数从小到大排序后能 ...

  4. bzoj 4373 算术天才⑨与等差数列

    4373: 算术天才⑨与等差数列 Time Limit: 10 Sec  Memory Limit: 128 MBhttp://www.lydsy.com/JudgeOnline/problem.ph ...

  5. 【BZOJ4373】算术天才⑨与等差数列 [线段树]

    算术天才⑨与等差数列 Time Limit: 10 Sec  Memory Limit: 128 MB[Submit][Status][Discuss] Description 算术天才⑨非常喜欢和等 ...

  6. 【BZOJ4373】算术天才⑨与等差数列 线段树+set

    [BZOJ4373]算术天才⑨与等差数列 Description 算术天才⑨非常喜欢和等差数列玩耍.有一天,他给了你一个长度为n的序列,其中第i个数为a[i].他想考考你,每次他会给出询问l,r,k, ...

  7. bzoj 4373: 算术天才⑨与等差数列 hash

    题目链接 题目大意:  给你n个数, 给两种操作, 一种给你l, r, k,问你[l, r]区间里的数排序后能否构成一个公差为k的等差数列. 另一种是将位置x的数变为y. 强制在线. 可以用hash来 ...

  8. [BZOJ4373]算术天才⑨与等差数列(线段树)

    [l,r]中所有数排序后能构成公差为k的等差数列,当且仅当: 1.区间中最大数-最小数=k*(r-l) 2.k能整除区间中任意两个相邻数之差,即k | gcd(a[l+1]-a[l],a[l+2]-a ...

  9. bzoj4373 算术天才⑨与等差数列——线段树+set

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4373 一个区间有以 k 为公差的数列,有3个条件: 1.区间 mx - mn = (r-l) ...

随机推荐

  1. Java SE开发系列-JDK下载安装

    JDK下载安装 JDK是Java的开发环境,目前JDK内部也包含了JRE,JRE主要是JAVA程序的运行环境. 点击官方下载地址,按着下图操作即可下载对应系统的不同版本JDK. 进入页面滑到页面底部点 ...

  2. 《代码整洁之道》ch5~ch9读书笔记 PB16110698(~3.15) 第二周

    <代码整洁之道>ch5~ch9读书笔记 本周我阅读了本书的第5~9章节,进一步了解整洁代码需要注意的几个方面:格式.对象与数据结构.错误处理.边界测试.单元测试和类的规范.以下我将分别记录 ...

  3. mysqldump使用记录

    #导出单个数据库:结构 无数据 [root@localhost ~]#mysqldump -h127.0.0.1 -uroot -p --opt --no-data db_name >~/db_ ...

  4. 记录一次工作中配置的Mysql主从复制过程

    Mysql主从复制教程 1.安装mysql(安装步骤跳过)2.配置密码.(如果忘记密码或者误操作删除了root用户,使用如下命令,没有忘记就跳到3)将skip-grant-tables放在/etc/m ...

  5. FileCloud 的原理简述&自己搭建文件云

    FileCloud 的原理简述&自己搭建文件云 copyright(c) by zcy 关于如何使用IIS创建asp服务,请读者自行研究 注:不要忘记添加入站规则 代码的存储: 根目录 fil ...

  6. [JZOJ4759] 【雅礼联考GDOI2017模拟9.4】石子游戏

    题目 描述 题目大意 在一棵树上,每个节点都有些石子. 每次将mmm颗石子往上移,移到根节点就不能移了. 双方轮流操作,问先手声还是后手胜. 有三种操作: 1. 询问以某个节点为根的答案. 2. 改变 ...

  7. 0817NOIP模拟测试赛后总结

    吐槽一句:话说NOIP都取消了还叫NOIP模拟真的好么 于是乎我再次爆炸……(0+20+50=70 rank26) 赛时状态 赛时的状态依旧不佳.不过还是硬逼着自己把三道题都读完,然后开始对出题人静坐 ...

  8. 我王某的 低错&&(女装)Flag

    日月共鉴,人心同睹. 喜欢你. 喜欢你的眼睛. 春天银河般闪烁的双瞳.春日阳光般温柔的眼神. 喜欢你的头发. 在微风中飘拂丝绢般柔滑的长发. 喜欢你的嘴唇. 给我甜蜜的吻.吐出忧伤叹息的嘴唇. 喜欢你 ...

  9. Entity Framework Extended 批量删除

    public static class DbContextExtensions { public static void DeleteBatch<T>(this DbContext con ...

  10. 菜鸟nginx源码剖析数据结构篇(八) 缓冲区链表ngx_chain_t[转]

    菜鸟nginx源码剖析数据结构篇(八) 缓冲区链表 ngx_chain_t Author:Echo Chen(陈斌) Email:chenb19870707@gmail.com Blog:Blog.c ...