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) ...
随机推荐
- springcloud Finchley 版本hystrix 和 hystrix Dashboard
hystrix的断路功能 引用上个项目,创建新的model ,cloud-hystrix pom.xml <?xml version="1.0" encoding=" ...
- CAS机制详解
目录 1. 定义 2. 实现原理 3. 无版本号CAS实战说明 4. CAS机制在Java中的应用 5. CAS的缺点 1. CPU开销过大 2. 不能保证代码块的原子性 3. ABA问题 6. JA ...
- 2019-8-30-PowerShell-通过-WMI-获取系统安装的驱动
title author date CreateTime categories PowerShell 通过 WMI 获取系统安装的驱动 lindexi 2019-08-30 08:58:39 +080 ...
- [NOIP2019模拟赛][AT2381] Nuske vs Phantom Thnook
题目链接 评测姬好快啊(港记号?)暴力40pts变成60pts 因为题目说了保证蓝色点两两之间只有一条路径,所以肯定组成了一棵树,而对于每次询问的x1,y1,x2,y2的子矩阵中就存在着一个森林 不难 ...
- iPhoneX适配随笔
1.安全区域 2.NavigationBar 和 TabBar的xib示意图 两个View要相同的效果,坐标不同 UIButton *btn = [UIButton buttonWithType:UI ...
- Hibernate 查询语言
查询语言 Hibernate 查询语言(HQL)是一种面向对象的查询语言,类似于 SQL,但不是去对表和列进行操作,而是面向对象和它们的属性. HQL 查询被 Hibernate 翻译为传统的 SQL ...
- Android笔记之让Debug和Release模式使用相同的签名
方法如下图 完整的build.gradle如下 apply plugin: 'com.android.application' android { compileSdkVersion 29 build ...
- VS2005下安装boost
本文参照http://dxwang.blog.51cto.com/384651/711798 (一)boost的安装和编译 1:下载boost版本,目前最新的版本为1-47-0 下载地址为htt ...
- Python-可变类型与不可变类型
可变类型 可以变化的,列表和字典 利用id()函数 查看内存地址 内存地址变化即不可变类型. 内存地址不变化即可变类型 不可变类型 不可以变化的,字符串和数字 字符串内置方法 索引取值 索引切片 成员 ...
- Django项目:CRM(客户关系管理系统)--62--52PerfectCRM实现CRM客户报名流程学生合同审核
# sales_urls.py # ————————47PerfectCRM实现CRM客户报名流程———————— from django.conf.urls import url from bpm. ...