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) ...
随机推荐
- BZOJ1597: [Usaco2008 Mar]土地购买——斜率优化
题目大意: 将$n$个长方形分成若干部分,每一部分的花费为部分中长方形的$max_长*max_宽$(不是$max_{长*宽}$),求最小花费 思路: 首先,可以被其他长方形包含的长方形可以删去 然后我 ...
- 廖雪峰Java15JDBC编程-3JDBC接口-1JDBC简介
JDBC:Java DataBase Connectivity Java程序访问数据库的标准接口 使用Java程序访问数据库的时候,Java代码并不是直接通过TCP连接去访问数据库,而是通过JDBC接 ...
- BZOJ 1579 [Usaco2009 Feb]Revamping Trails 道路升级
堆优化的dijkstra. 把一个点拆成k个. 日常空间要开炸一次.. //Twenty #include<cstdio> #include<cstring> #include ...
- 使用 SourceTree 操作时弹出 password required
通过 https 的方式克隆仓库的,SourceTree 推送等操作的时候会弹出提示要求输入密码. 在仓库里面设置: 远程仓库-选中仓库-点击编辑-修改 url 路径, 路径格式,以码云为例: htt ...
- 19-10-30-C
交文件吼啊. ZJ一下: T1是真·高中数学. T2不是很清楚,只得了30. T3打了一个欧拉序. 做的海星的地方: Vim太好用辣,直接按平常打叫上去它就是 freopen T1仔仔细细的研究了高考 ...
- 洛谷P5104 红包发红包
题目链接: P5104 题目分析: 题目和\(n\)是没什么关系的,因为是\(n\)个人抢,其实不一定抢完 其实很显然--就是求一个连续型随机变量的期望 首先设一个随机变量\(X\),表示第一个人拿到 ...
- rabbit mq 基础流程(转)
从AMQP协议可以看出,MessageQueue.Exchange和Binding构成了AMQP协议的核心,下面我们就围绕这三个主要组件 从应用使用的角度全面的介绍如何利用Rabbit MQ构建 ...
- Struts2入门问题
一 使用Struts 2 开发程序的基本步骤 加载Struts2 类库 配置web.xml文件 开发视图层页面 开发控制层Action 配置struts.xml文件 部署.运行项目 第一步先导架包:在 ...
- <爬虫>利用BeautifulSoup爬取百度百科虚拟人物资料存入Mysql数据库
网页情况: 代码: import requests from requests.exceptions import RequestException from bs4 import Beautiful ...
- mapduce简介
原文引自:http://www.cnblogs.com/shishanyuan/p/4639519.html 1.环境说明 部署节点操作系统为CentOS,防火墙和SElinux禁用,创建了一个shi ...