bzoj 4373 算术天才⑨与等差数列——线段树+set
题目: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的更多相关文章
- BZOJ 4373 算术天才⑨与等差数列 线段树+set(恶心死我了)
mdzz,这道题重构了4遍,花了一个晚上... 满足等差数列的条件: 1. 假设min是区间最小值,max是区间最大值,那么 max-min+k(r−l) 2. 区间相邻两个数之差的绝对值的gcd=k ...
- BZOJ 4373算术天才⑨与等差数列(线段树)
题意:给你一个长度为n的序列,有m个操作,写一个程序支持以下两个操作: 1. 修改一个值 2. 给出三个数l,r,k, 询问:如果把区间[l,r]的数从小到大排序,能否形成公差为k的等差数列. n,m ...
- BZOJ 4373: 算术天才⑨与等差数列 线段树
Description 算术天才⑨非常喜欢和等差数列玩耍. 有一天,他给了你一个长度为n的序列,其中第i个数为a[i]. 他想考考你,每次他会给出询问l,r,k,问区间[l,r]内的数从小到大排序后能 ...
- bzoj 4373 算术天才⑨与等差数列
4373: 算术天才⑨与等差数列 Time Limit: 10 Sec Memory Limit: 128 MBhttp://www.lydsy.com/JudgeOnline/problem.ph ...
- 【BZOJ4373】算术天才⑨与等差数列 [线段树]
算术天才⑨与等差数列 Time Limit: 10 Sec Memory Limit: 128 MB[Submit][Status][Discuss] Description 算术天才⑨非常喜欢和等 ...
- 【BZOJ4373】算术天才⑨与等差数列 线段树+set
[BZOJ4373]算术天才⑨与等差数列 Description 算术天才⑨非常喜欢和等差数列玩耍.有一天,他给了你一个长度为n的序列,其中第i个数为a[i].他想考考你,每次他会给出询问l,r,k, ...
- bzoj 4373: 算术天才⑨与等差数列 hash
题目链接 题目大意: 给你n个数, 给两种操作, 一种给你l, r, k,问你[l, r]区间里的数排序后能否构成一个公差为k的等差数列. 另一种是将位置x的数变为y. 强制在线. 可以用hash来 ...
- [BZOJ4373]算术天才⑨与等差数列(线段树)
[l,r]中所有数排序后能构成公差为k的等差数列,当且仅当: 1.区间中最大数-最小数=k*(r-l) 2.k能整除区间中任意两个相邻数之差,即k | gcd(a[l+1]-a[l],a[l+2]-a ...
- bzoj4373 算术天才⑨与等差数列——线段树+set
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4373 一个区间有以 k 为公差的数列,有3个条件: 1.区间 mx - mn = (r-l) ...
随机推荐
- CSS选择器及优先级
转自CSS优先级的计算公式:http://wyz.67ge.com/css-selector-priority/ 通常我们可以将CSS的优先级由高到低分为六组: 无条件优先的属性只需要在属性后面使用 ...
- 获取m,n之间的随机整数
获取m,n之间的随机整数 代码去下:
- React在componentWillMount中请求接口数据结束后再执行render
1.在getInitialState中初始化isloading,初始值false getInitialState() { return { editionid: '', isloading:false ...
- echo 改变字体颜色
字颜色:30—–37 echo -e “\033[30m 黑色字 \033[0m” echo -e “\033[31m 红色字 \033[0m” echo -e “\033[32m 绿色字 \033[ ...
- python 简单的图片比较
# by movie on 2019/12/18 from PIL import Image from PIL import ImageChops path1 = 'images/trumpA689. ...
- leetcode-123-买卖股票的最佳时机③
题目描述: 方法一: class Solution: def maxProfit(self, prices: List[int]) -> int: dp_i1_0 = 0 dp_i1_1 = f ...
- COMMENT方法 用于在生成的SQL语句中添加注释内容,
COMMENT方法 用于在生成的SQL语句中添加注释内容,例如: $this->comment('查询考试前十名分数') ->field('username,score') ->li ...
- memcached 技术支持
1. Install sudo apt-get install memcached 2.启动和停止 启动: service memcached start 停止: service memcached ...
- Ubuntu 12.04 Eclipse设置 Javadoc背景色
在Ambiance主题下,eclipse弹出的tip是黑色背景的,这样压根就看不清java doc. 当然可以在外观改变系统主题为其他主题,相应的gtk-2.0/gtkrc要重新设置,比如Ubuntu ...
- Android基础控件ImageView的使用
1.相关属性 <!--src 设置内容--> <!--background 设置背景--> <!--alpha 设置透明度 --> <!--adjustVie ...