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 个区间, ...
随机推荐
- Java精选笔记_DBUtils工具
DBUtils工具 API介绍 为了更加简单地使用JDBC,Apache组织提供了一个工具类库commons-dbutils组件. 该组件实现了对JDBC的简单封装,可以在不影响性能的情况下极大简化J ...
- 7 -- Spring的基本用法 -- 3... Spring 的核心机制 : 依赖注入
7.3 Spring 的核心机制 : 依赖注入 Spring 框架的核心功能有两个. Spring容器作为超级大工厂,负责创建.管理所有的Java对象,这些Java对象被称为Bean. Spring容 ...
- swift--控件工厂类的实现
控件工厂类,简而言之就是,减少代码的复用率,只在哪里用,然后在哪里调: 代码如下: import UIKit class ViewFactory: UIView,UITextFieldDelegate ...
- RecyclerView的通用适配器,和滚动时不加载图片的封装
对于RecyclerView我们需要使用RecyclerAdapter,使用方式与ListViewAdapter类似,具体代码大家可以在网上搜索,这里就只教大家使用封装后的简洁RecyclerAdap ...
- 教你一招解决浏览器兼容问题(PostCSS的使用)
我们在处理网页的时候,往往会遇到兼容性的问题.在这个问题上分为两个大的方向:屏幕自适应&浏览器兼容.而屏幕自使用的方法有许多,包括框架之类的,但是浏览器的兼容却没有一个号的框架.在我们日常处理 ...
- DOS cmd - how to ping a remote host with specified port
You can use ping to test whether you can connect to a remote host: ping baidu.com ping 125.6.45.88 ( ...
- SQL 根据日期精确计算年龄
SQL 根据日期精确计算年龄 第一种: 一张人员信息表里有一人生日(Birthday)列,跟据这个列,算出该人员的年龄 datediff(year,birthday,getdate()) 例:birt ...
- windows下的mysql迁移到linux下
最近做毕业设计,需要把windows下的mysql移植到linux下 曾经有过在window下移植mysql数据库的经验,只需要把msql的数据文件复制到另一台安装mysql的机器的数据存放位置,然后 ...
- Windows 2008 server R2安装.NET Framework4时提示“灾难性故障”
报错信息: 安装.NET Framework 4时,提示安装未成功,“灾难性故障”.服务器的操作系统是windows server 2008 R2. 查看系统日志时显示“无法安装 Windows 更 ...
- SQL用户存在则更新不存在则插入
1.添加索引(一般是唯一索引,我的是联合唯一索引): alter table T_Cart add unique index(goods_id,user_id); 2.SQL /* * 保存购物车(如 ...