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 个区间, ...
随机推荐
- jquery书写左右两个多选下拉列表交换移除功能
使用jquery做一个多选列表左右互换的功能,代码如下 <!DOCTYPE HTML> <html lang="en-US"> <head> & ...
- 多线程的学习与GDI的学习
今天又是一周的周五,感觉过的好快,我感觉不是期盼周末的到来,而是感觉现在已经习惯啦每天坐在这里敲代码,其实我是一个性格非常开朗的女生,现在不知道为什么感觉默默地坐在自己位置上面敲代码成为了我习以为常的 ...
- 利用html实现类似于word自动生成的目录的效果
在word中的自动生成目录当中,我们会看到是这样的目录结构: 嗯,自动生成固然是简单,但是在html当中,却没有一个合适的标签来去做.今天后台导出PDF的时候告诉我,他需要用html做一个这样的结构, ...
- 《C++ Primer Plus》第13章 类继承 笔记
类继承通过使用已有的类(基类)定义新的来(派生类),使得能够根据需要修改编程代码.共有继承建立is-a关系,这意味着派生类对象也应该是某种基类对象.作为is-a模型的一部分,派生类继承基类的数据称源和 ...
- Java Integer常量池
public class IntegerExample { public static void main(String[] javalatte) { Integer i = 10; Integer ...
- ExtJS6的中sencha cmd中自动创建案例项目代码分析
在之前的博文中,我们按照sencha cmd的指点,在自己win7虚拟机上创建了一个案例项目,相当于创建了一个固定格式的文档目录结构,然后里面自动创建了一系列js代码.这是使用sencha cmd自动 ...
- adb shell dumpsys的用法
一. 打印出设备中所有service的信息 zh@zh:~$adb shell dumpsys -l (字母l)zh@zh:~$adb shell service list 二.查询到运行的syste ...
- CVE-2017-1000117命令注入验证
首先,我们来看第一个问题,就是ssh的一种操作. ssh -oProxyCommand=gnome-calculator xxx 问题的本质在于ssh会把//后的host那么部分带-号的按照参数指令去 ...
- svn-maven-tomcat自动发布脚本
#!/bin/sh #svn-maven-tomcat自动发布脚本 #变量设置 svnpath=svn://10.60.10.120/研发部/xx-maven svnusername=xxx svnp ...
- ThinkPHP如果表名有下划线需要用Model应该怎么做?
最近遇到一个问题,在用TP做系统的时候,我建立的表是 “tp_admin_user” 但是要用到的模型是 “AdminUserModel.model.class.php”,应该如何做? 解决方法: & ...