原题大意:原题链接  题解链接

给定一个长为n的数组元素和q次区间[l,r]询问,判断区间[l,r]内元素排序后能否构成等差数列

#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=1e5+;
int n,q,l,r;
int a[maxn],temp[];
int mi[maxn][],ma[maxn][];
int gd[maxn][],po[maxn][]; int gcd(int a,int b)
{
if(b==) return a;
return gcd(b,a%b);
}
int ggg(int a,int b)
{
if(a==||b==) return ;
return gcd(a,b);
}
void Rmq_Precede()
{
for(int j=;(<<j)<=n;j++){
for(int i=;i+(<<j)-<=n;i++){
ma[i][j]=max(ma[i][j-],ma[i+(<<(j-))][j-]);
mi[i][j]=min(mi[i][j-],mi[i+(<<(j-))][j-]);
gd[i][j]=ggg(gd[i][j-],gd[i+(<<(j-))][j-]);
po[i][j]=max(po[i][j-],po[i+(<<(j-))][j-]);
}
}
}
int Rmq_Max(int l,int r)
{
int k=log2(r-l+);
return max(ma[l][k],ma[r-(<<k)+][k]);
}
int Rmq_Min(int l,int r)
{
int k=log2(r-l+);
return min(mi[l][k],mi[r-(<<k)+][k]);
}
int Rmq_Gcd(int l,int r)
{
int k=log2(r-l+);
return gcd(gd[l][k],gd[r-(<<k)+][k]);
}
int Rmq_Pos(int l,int r)
{
int k=log2(r-l+);
return max(po[l][k],po[r-(<<k)+][k]);
} int main()
{
while(scanf("%d%d",&n,&q)!=EOF){
memset(temp,,sizeof(temp));
for(int i=;i<=n;i++){
scanf("%d",&a[i]);
po[i][]=temp[a[i]];//如果有重复元素,则temp[a[i]]会被覆盖
temp[a[i]]=i;
mi[i][]=ma[i][]=a[i];
gd[i][]=abs(a[i]-a[i-]);
}
Rmq_Precede();
while(q--){
scanf("%d%d",&l,&r);
if(l==r||l+==r) {printf("Yes\n"); continue;}
int curmi=Rmq_Min(l,r),curma=Rmq_Max(l,r),curgd=Rmq_Gcd(l+,r);
if(Rmq_Pos(l,r)>=l){//判重,如果数组中有相同元素,一定会执行此步骤
if(curmi==curma){printf("Yes\n"); continue;}
else{printf("No\n"); continue;}
}
if(curgd*(r-l)==curma-curmi){printf("Yes\n"); continue;}
else{printf("No\n"); continue;}
}
}
return ;
}

测试很多数据均无误,但是提交后却一直WA,望各位大佬指点

#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 100010
#define inf 0x3f3f3f3f
using namespace std;
int temp[];
int i=,po,mi,ma,gd;
int segmin[*maxn];
int segmax[*maxn];
int a[maxn],d[maxn];
int g[*maxn],segpos[*maxn]; int gcd(int a,int b)
{
if(b==) return a;
return gcd(b,a%b);
}
int ggg(int a,int b)
{
if(a==||b==) return ;
return gcd(a,b);
}
void Build(int p,int l,int r)
{
if(l==r){
scanf("%d",&a[i]);
segmin[p]=segmax[p]=a[i];
segpos[p]=temp[a[i]];
temp[a[i]]=i;
i++;
return;
}
int mid=(l+r)/;
Build(*p,l,mid);
Build(*p+,mid+,r);
segpos[p]=max(segpos[*p],segpos[*p+]);
segmin[p]=min(segmin[*p],segmin[*p+]);
segmax[p]=max(segmax[*p],segmax[*p+]);
}
void Query_val(int p,int l,int r,int ll,int rr)
{
if(ll<=l&&r<=rr){
po=max(po,segpos[p]);
mi=min(mi,segmin[p]);
ma=max(ma,segmax[p]);
return;
}
int mid=(l+r)/;
if(ll<=mid)
Query_val(*p,l,mid,ll,rr);
if(rr>mid)
Query_val(*p+,mid+,r,ll,rr);
}
void Create(int p,int l,int r)
{
if(l==r){
g[p]=d[l];
return;
}
int mid=(l+r)/;
Create(*p,l,mid);
Create(*p+,mid+,r);
g[p]=ggg(g[*p],g[*p+]);
}
void Query_gcd(int p,int l,int r,int ll,int rr)
{
if(ll<=l&&r<=rr){
gd=ggg(gd,g[p]);
return;
}
int mid=(l+r)/;
if(ll<=mid)
Query_gcd(*p,l,mid,ll,rr);
if(rr>mid)
Query_gcd(*p+,mid+,r,ll,rr);
} int main()
{
int n,q,l,r;
while(scanf("%d%d",&n,&q)!=EOF){
memset(temp,,sizeof(temp));
Build(,,n);
/*for(int i=1;i<=9;i++){
printf("%d\n",segpos[i]);
printf("%d %d\n",segmin[i],segmax[i]);
}*/
for(int i=;i<n;i++)
d[i]=abs(a[i]-a[i-]);
Create(,,n-);
while(q--){
scanf("%d%d",&l,&r);
if(l==r||l+==r){
printf("Yes\n");
continue;
}
po=-,mi=inf,ma=-inf;
Query_val(,,n,l,r);
if(po>=l){
if(mi==ma) {printf("Yes\n"); continue;}
else {printf("No\n"); continue;}
}
gd=d[l+];
Query_gcd(,,n-,l+,r);
if(gd*(r-l)==ma-mi) printf("Yes\n");
else printf("No\n");
}
}
}

F题:等差区间(RMQ||线段树)的更多相关文章

  1. dutacm.club_1094_等差区间_(线段树)(RMQ算法)

    1094: 等差区间 Time Limit:5000/3000 MS (Java/Others)   Memory Limit:163840/131072 KB (Java/Others)Total ...

  2. Codeforces Round #271 (Div. 2) F题 Ant colony(线段树)

    题目地址:http://codeforces.com/contest/474/problem/F 由题意可知,最后能够留下来的一定是区间最小gcd. 那就转化成了该区间内与区间最小gcd数相等的个数. ...

  3. Codeforces Round #538 (Div. 2) F 欧拉函数 + 区间修改线段树

    https://codeforces.com/contest/1114/problem/F 欧拉函数 + 区间更新线段树 题意 对一个序列(n<=4e5,a[i]<=300)两种操作: 1 ...

  4. NBU 2475 Survivors(RMQ线段树)

    NBU 2475Survivors 题目链接:http://acm.nbu.edu.cn/v1.0/Problems/Problem.php?pid=2475 题意:给定n个人,每个人有strengt ...

  5. 【BZOJ4653】【NOI2016】区间(线段树)

    [BZOJ4653][NOI2016]区间(线段树) 题面 BZOJ 题解 \(NOI\)良心送分题?? 既然是最大长度减去最小长度 莫名想到那道反复减边求最小生成树 从而求出最小的比值 所以这题的套 ...

  6. BZOJ_3038_上帝造题的七分钟2_线段树

    BZOJ_3038_上帝造题的七分钟2_线段树 题意: XLk觉得<上帝造题的七分钟>不太过瘾,于是有了第二部. "第一分钟,X说,要有数列,于是便给定了一个正整数数列. 第二分 ...

  7. 【题解】P1712 [NOI2016]区间(贪心+线段树)

    [题解]P1712 [NOI2016]区间(贪心+线段树) 一个observe是,对于一个合法的方案,将其线段长度按照从大到小排序后,他极差的来源是第一个和最后一个.或者说,读入的线段按照长度分类后, ...

  8. hdu 5700区间交(线段树)

    区间交 Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submiss ...

  9. BZOJ_4653_[Noi2016]区间_线段树+离散化+双指针

    BZOJ_4653_[Noi2016]区间_线段树+离散化+双指针 Description 在数轴上有 n个闭区间 [l1,r1],[l2,r2],...,[ln,rn].现在要从中选出 m 个区间, ...

随机推荐

  1. ios开发之--从相机或相册选取图片,并带删除操作的demo

    多选图片的一个效果,如下图:

  2. Error: could not find java.dll如何解决

    安装配置Java环境变量,在命令行中运行java -version进行测试时却出现下面的问题: Error: opening registry key 'Software\JavaSoft\Java ...

  3. Windows7安装Mongodb

    1.安装mongodb-win32-x86_64-3.0.4-signed.msi 2.安装kb2731284 安装补丁:Windows6.1-KB2731284-v3-x64.msu 3.创建数据库 ...

  4. 事件和winform的学习

             记得现在已经不在学习winform啦,可是我们为什么还是学习啦,我感觉就是帮助我们往下一个层次进发啦,因为从控制台直接开始进入webform的学习,我们很难接受啦,估计效率也不高啦, ...

  5. 使用Jquery做分页效果

    之前写过一个PHP 的分页效果,但是今天小伙伴和我说了一个不适用后台单纯用前段的JS来写分页,整理了一下,代码如下: html: <div id="containet"> ...

  6. Kconfig和Makefile的修改

    Kconfig文件的作用 内核源码树的目录下都有两个文件Kconfig(2.4版本是Config.in)和Makefile.分布到各目录的Kconfig构成了一个分布式的内核配置数据库,每个Kconf ...

  7. java中的Iterator和Iterable 区别

    java.lang.Iterable java.util.Iterator 来自百度知道: Iterator是迭代器类,而Iterable是接口. 好多类都实现了Iterable接口,这样对象就可以调 ...

  8. LeetCode——Consecutive Numbers

    Description: Write a SQL query to find all numbers that appear at least three times consecutively. + ...

  9. 为非ajax请求绑定回调函数的方法

    我们都知道jQuery为ajax请求封装了success和error两个回调方法,其实jQuery也实现了为非ajax请求的普通方法也设计了绑定回调函数的方法. 当一个方法需要等待另一个耗时很长的方法 ...

  10. 卸载vue-cli

    全局安装:npm install vue-cli -g; 全局卸载:npm uninstall vue-cli -g; 查看vue版本,vue -V 回车,查看vue最新的版本.