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

一个区间有以 k 为公差的数列,有3个条件:

1.区间 mx - mn = (r-l) * k;

2.差分数组的 gcd 是 k 的倍数;

3.没有重复出现的数;

其中1,2都可以用线段树维护,3用 set 维护每个数上一个出现的位置即可;

模仿TJ写的:https://blog.csdn.net/neither_nor/article/details/52461940

对 set 更熟悉了,细节还蛮多的。

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<set>
#include<map>
using namespace std;
int const maxn=3e5+;
int n,m,a[maxn],key,tot,pre[maxn];
map<int,int>h;
set<int>s[maxn<<];
int gcd(int a,int b){return b?gcd(b,a%b):a;}
int ab(int x){return x>?x:-x;}
struct N{
int mx,mn,fro,g;
friend N operator + (N x,N y)
{
N ret;
ret.mx=max(x.mx,y.mx);
ret.mn=min(x.mn,y.mn);
ret.fro=max(x.fro,y.fro);
ret.g=gcd(x.g,y.g);
return ret;//!
}
}t[maxn<<];
void build(int x,int l,int r)
{
if(l==r)
{
t[x].mn=t[x].mx=a[l]; t[x].g=ab(a[l+]-a[l]);
t[x].fro=pre[l]; return;
}
int mid=((l+r)>>);
build(x<<,l,mid); build(x<<|,mid+,r);
t[x]=t[x<<]+t[x<<|];
}
void update(int x,int l,int r,int p)
{
if(l==r)
{
t[x].mn=t[x].mx=a[l]; t[x].g=ab(a[l+]-a[l]);
t[x].fro=pre[l]; return;
}
int mid=((l+r)>>);
if(p<=mid)update(x<<,l,mid,p);
else update(x<<|,mid+,r,p);
t[x]=t[x<<]+t[x<<|];
}
N query(int x,int l,int r,int L,int R)
{
if(l>=L&&r<=R)return t[x];
int mid=((l+r)>>);
if(mid<L)return query(x<<|,mid+,r,L,R);
else if(mid>=R)return query(x<<,l,mid,L,R);
else return query(x<<,l,mid,L,R)+query(x<<|,mid+,r,L,R);
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
{
scanf("%d",&a[i]);
if(!h[a[i]])
{
h[a[i]]=++tot;
s[tot].insert();
s[tot].insert(n+);
}
int tmp=h[a[i]];
s[tmp].insert(i);
pre[i]=*--(s[tmp].insert(i).first);//
}
a[n+]=a[n];//!
build(,,n);
for(int i=,op,x,y,l,r,k;i<=m;i++)
{
scanf("%d",&op);
if(op==)
{
scanf("%d%d",&x,&y);
x^=key; y^=key;
int tmp,nxt,pr;
tmp=h[a[x]];
nxt=*s[tmp].upper_bound(x);
if(nxt!=n+)
{
pre[nxt]=pre[x];
update(,,n,nxt);
}
s[tmp].erase(x); if(!h[y])//
{
h[y]=++tot;
s[tot].insert();
s[tot].insert(n+);
}
tmp=h[y];
s[tmp].insert(x);
nxt=*s[tmp].upper_bound(x);
pre[x]=*--s[tmp].lower_bound(x);
if(nxt!=n+)
{
pre[nxt]=x;
update(,,n,nxt);
}
a[x]=y;
update(,,n,x);
if(x!=)update(,,n,x-);//
}
if(op==)
{
scanf("%d%d%d",&l,&r,&k);
l^=key; r^=key; k^=key;
if(l==r){key++; printf("Yes\n"); continue;}
N tmpp=query(,,n,l,r-);//
N tmp=tmpp+query(,,n,r,r);//
if(k==)
{
if(tmp.mx==tmp.mn)key++,printf("Yes\n");
else printf("No\n");
continue;
}
if(tmp.fro<l && tmp.mx==k*(r-l)+tmp.mn && tmpp.g%k==)//tmpp!
key++,printf("Yes\n");
else printf("No\n");
}
}
return ;
}

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

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

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

  2. BZOJ4373: 算术天才⑨与等差数列(线段树 hash?)

    题意 题目链接 Sol 正经做法不会,听lxl讲了一种很神奇的方法 我们考虑如果满足条件,那么需要具备什么条件 设mx为询问区间最大值,mn为询问区间最小值 mx - mn = (r - l) * k ...

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

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

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

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

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

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

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

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

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

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

  8. bzoj 4373 算术天才⑨与等差数列——线段树+set

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4373 能形成公差为k的等差数列的条件:mx-mn=k*(r-l) && 差分 ...

  9. BZOJ4373 算术天才⑨与等差数列 【线段树】*

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

随机推荐

  1. Resources.getResourceAsReader 报空指针

    1.maven项目中 可能未编译 导致找不到, 解决方法:mvn clean install -DskipTests -X   编译一下项目 2.可能在 Resources.getResourceAs ...

  2. 重现apache commons fileupload DOS漏洞

    这个漏洞是2014年2月4日被发现的, 因为该组件试用范围非常广, 所以该漏洞的影响也非常巨大.通过特制的包含畸形header的http请求,可以导致使用该组件的应用程序进入无限循环从而耗尽CPU等资 ...

  3. JS——缓慢动画封装案例

    手风琴 1.排他思想 2.ul宽度需要大一点,防止li撑开跑下去 3.一个变大其他所有变小,变小不能太小,不然会出现空白 <!DOCTYPE html> <html lang=&qu ...

  4. 怎样用Fiddler模拟网络超时

    转自:http://materliu.github.io/all/web/2014/04/28/fiddler-timeout.html   用fiddler模拟网络请求超时 用fiddler模拟网络 ...

  5. ajax不执行success的问题

    有时候经常会遇到ajax请求后台,然后后台返回数据后,不触发ajax的success函数的问题,归根到底,这与ajax的参数设置dataType和后台的返回值的类型有关,现总结如下: 一.后台返回值的 ...

  6. xamarin.forms模拟rem动态大小值,实现屏幕适配

    开发app的时候,比较麻烦的地方,就是处理屏幕适配,比如文字设为12的大小,测试的时候,看得文字挺正常,可是,放到高分辨率设备一看,文字就变得特别小, 怎样实现随着分辨率变大或者变小,所有的size数 ...

  7. Python---HTML表单

    一. http:80 https:443 -------------------------- 二.

  8. Html5 WebSocket详细介绍

    什么是WebSocket?看过html5的同学都知道,WebSocket protocol 是HTML5一种新的协议.它是实现了浏览器与服务器全双工通信(full-duplex).HTML5定义了We ...

  9. 51nod1006 -最长公共子序列Lcs【动态规划】

    给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的). 比如两个串为: abcicba abdkscab ab是两个串的子序列,abc也是,abca也是,其中abca是这两个字符串最 ...

  10. 第五节:numpy之数组维度处理