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 个区间, ...
随机推荐
- MongoDB 用户角色
Read:允许用户读取指定数据库 readWrite:允许用户读写指定数据库 dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建.删除,查看统计或访问system.profile user ...
- iOS文件处理介绍(一)
一.在Documents.tmp和Library中存储文件 Documents:用于存储应用程序中经常需要读取或写入的常规文件. tmp:用于存储应用程序运行时生成的文件.(随着应用程序的关闭失去了利 ...
- PyQt4工具栏
工具栏 菜单对程序中的所有命令进行分组防治,而工具栏则提供了快速执行最常用命令的方法. #!/usr/bin/python # -*- coding:utf-8 -*- import sys from ...
- poj_2739 尺取法
题目大意 给定一个数字N,N可能由1个或多个连续的素数求和得到,比如41 = 2+3+5+7+11+13, 41 = 11+13+17, 41 = 41.求出对于N,所有可能的组合形式. 题目分析 先 ...
- ansible批量验证密码
author: headsen chen date: 2018-08-31 20:45:49 综合比较salt-ssh,ansible .sshpass等批量验证100台机器的密码,最好推荐用ans ...
- iOS - 常用iOS的第三方框架
图像:1.图片浏览控件MWPhotoBrowser 实现了一个照片浏览器类似 iOS 自带的相册应用,可显示来自手机的图片或者是网络图片,可自动从网络下载图片并进行缓存.可对图片进行缩放等 ...
- etc/fstab
etc/fstab 就是在开机引导的时候自动挂载到linux的文件系统 设备名称 挂载点 分区的类型 挂载选项 dump选项 fsck选项UUID=ce25cdc7-434f-420b-b3 / ex ...
- 树链剖分-点的分治(链的点的个数为k的点对数)
hdu4760 Cube number on a tree Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65535/65535 ...
- (转)梯度下降法及其Python实现
梯度下降法(gradient descent),又名最速下降法(steepest descent)是求解无约束最优化问题最常用的方法,它是一种迭代方法,每一步主要的操作是求解目标函数的梯度向量,将当前 ...
- oracle日常函数汇总(转载)
第一篇 著名函数之单值函数 注:N表示数字型,C表示字符型,D表示日期型,[]表示内中参数可被忽略,fmt表示格式 数值类型函数 数值型函数输入数字型参数并返回数值型的值.多数该类函数的返回值支持38 ...