F题:等差区间(RMQ||线段树)
给定一个长为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||线段树)的更多相关文章
- dutacm.club_1094_等差区间_(线段树)(RMQ算法)
1094: 等差区间 Time Limit:5000/3000 MS (Java/Others) Memory Limit:163840/131072 KB (Java/Others)Total ...
- Codeforces Round #271 (Div. 2) F题 Ant colony(线段树)
题目地址:http://codeforces.com/contest/474/problem/F 由题意可知,最后能够留下来的一定是区间最小gcd. 那就转化成了该区间内与区间最小gcd数相等的个数. ...
- Codeforces Round #538 (Div. 2) F 欧拉函数 + 区间修改线段树
https://codeforces.com/contest/1114/problem/F 欧拉函数 + 区间更新线段树 题意 对一个序列(n<=4e5,a[i]<=300)两种操作: 1 ...
- NBU 2475 Survivors(RMQ线段树)
NBU 2475Survivors 题目链接:http://acm.nbu.edu.cn/v1.0/Problems/Problem.php?pid=2475 题意:给定n个人,每个人有strengt ...
- 【BZOJ4653】【NOI2016】区间(线段树)
[BZOJ4653][NOI2016]区间(线段树) 题面 BZOJ 题解 \(NOI\)良心送分题?? 既然是最大长度减去最小长度 莫名想到那道反复减边求最小生成树 从而求出最小的比值 所以这题的套 ...
- BZOJ_3038_上帝造题的七分钟2_线段树
BZOJ_3038_上帝造题的七分钟2_线段树 题意: XLk觉得<上帝造题的七分钟>不太过瘾,于是有了第二部. "第一分钟,X说,要有数列,于是便给定了一个正整数数列. 第二分 ...
- 【题解】P1712 [NOI2016]区间(贪心+线段树)
[题解]P1712 [NOI2016]区间(贪心+线段树) 一个observe是,对于一个合法的方案,将其线段长度按照从大到小排序后,他极差的来源是第一个和最后一个.或者说,读入的线段按照长度分类后, ...
- hdu 5700区间交(线段树)
区间交 Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submiss ...
- BZOJ_4653_[Noi2016]区间_线段树+离散化+双指针
BZOJ_4653_[Noi2016]区间_线段树+离散化+双指针 Description 在数轴上有 n个闭区间 [l1,r1],[l2,r2],...,[ln,rn].现在要从中选出 m 个区间, ...
随机推荐
- ios 6以后,UILabel全属性
一.初始化 1 UILabel *myLabel = [[UILabel alloc] initWithFrame:CGRectMake(40, 40, 120, 44)]; 2 3 [s ...
- PHP-002
PHP URL重写 怎样在IIS环境下配置Rewrite规则_百度经验 http://jingyan.baidu.com/article/c33e3f485a7c74ea15cbb50e.html W ...
- com.alibaba.fastjson.JSONException: default constructor not found. class ……
1.json工具类 package com.hyzn.fw.util; import java.util.List; import java.util.Map; import com.alibaba. ...
- 如何在Oculus官网下载OculusSetup.exe(当前时间20170720)
踩着免费的蓝灯FQ登录了Oculus官网,找了半天找不到哪里下载OculusSetup.exe,最后在最下面的支持中心找到了..... https://www.oculus.com/
- 关于ARM的内核架构
很多时候我们都会对M0,M0+,M3,M4,M7,arm7,arm9,CORTEX-A系列,或者说AVR,51,PIC等,一头雾水,只知道是架构,不知道具体是什么,有哪些不同?今天查了些资料,来解解惑 ...
- Python做简单爬虫(urllib.request怎么抓取https以及伪装浏览器访问的方法)
一:抓取简单的页面: 用Python来做爬虫抓取网站这个功能很强大,今天试着抓取了一下百度的首页,很成功,来看一下步骤吧 首先需要准备工具: 1.python:自己比较喜欢用新的东西,所以用的是Pyt ...
- 静态资源的gzip
1.项目中,接触到gzip.未压缩的文件和压缩后的文件的比例可能达到:3:1.所以,gzip是网络中文件高速传输的很好方法. 2.一般js.css.html文件都会在后端进行gzip.当浏览器请求这些 ...
- linux 上安装pstree
linux 无法使用pstree centos7上默认没有安装psmisc包. 1.在 Mac OS上 brew install pstree 2.在 Fedora/Red Hat/CentOS yu ...
- Hadoop命令别名
[hadoop@master ~]$ alias hdfs='hadoop dfs' [hadoop@master ~]$ hdfs -ls / drwxrwxr-x - hadoop super ...
- jquery点击事件失效原因和解决办法
在使用jQuery绑定点击事件的时候,有时候会遇到点击无效,这种情况大多出现在动态添加元素的时候 例如:给demo里添加li元素给li绑定点击事件 $("#demo").appen ...