2124: 等差子序列

Time Limit: 3 Sec  Memory Limit: 259 MB
Submit: 1922  Solved: 714
[Submit][Status][Discuss]

Description

给一个1到N的排列{Ai},询问是否存在1<=p1<p2<p3<p4<p5<…<pLen<=N (Len>=3),
使得Ap1,Ap2,Ap3,…ApLen是一个等差序列。
 

Input

输入的第一行包含一个整数T,表示组数。
下接T组数据,每组第一行一个整数N,每组第二行为一个1到N的排列,数字两两之间用空格隔开。
N<=10000,T<=7
 

Output

对于每组数据,如果存在一个等差子序列,则输出一行“Y”,否则输出一行“N”。
 

Sample Input

2
3
1 3 2
3
3 2 1

Sample Output

N
Y
 
思路:
 
线段树神仙操作。。完全想不到怎么用线段树写,看了别人题解看了一天才看懂这操作。。
题目要求存在个数不小于3的等差序列就行了,那么我们只要找到三个数可以组成等差序列就可以了。
我们先从1-n逐步插入,用01表示插入的状态吗如果插入了就标为1,然后只要找出当前值左右两边是否存在
距离相等但状态不同的点,如果有的话那么就存在这么一种等差序列,因为状态不同只有一种情况:一个之前
就已经插入了,一个还没插入,但另一个迟早会插入,所以我们不用管,只要找到这个就可以确定他是等差序列了。
用线段树维护一下hash就行了。
线段树维护的操作比较麻烦,主要就是将这个由01组成的序列由二进制转成10进制来保存,每一步都取下模,如果这
两个数的十进制不同,那他们的二进制肯定也不同。这样就可以判断出答案了。
 
实现代码;
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define mid ll m = (l + r) >> 1
const ll M = 1e5+;
const ll md = 1e9+;
ll suml[M<<],sumr[M<<],a[M],pw[M];
void pushup(ll l,ll r,ll rt){
ll len = r - l + ;
ll m = len / ;
suml[rt] = (suml[rt<<]*pw[m]+suml[rt<<|])%md;
sumr[rt] = (sumr[rt<<|]*pw[len-m]+sumr[rt<<])%md;
return ;
} void update(ll p,ll l,ll r,ll rt){
if(l == r){
suml[rt] = sumr[rt] = ;
return ;
}
mid;
if(p <= m) update(p,lson);
else update(p,rson);
pushup(l,r,rt);
} ll queryl(ll L,ll R,ll l,ll r,ll rt){
if(L > R) return ;
if(L == l&&R == r) return suml[rt];
mid;
if(L > m) return queryl(L,R,rson);
else if(R <= m) return queryl(L,R,lson);
else return (queryl(L,m,lson)*pw[R-m]+queryl(m+,R,rson))%md;
} ll queryr(ll L,ll R,ll l,ll r,ll rt){
if(L > R) return ;
if(L == l&&R == r) return sumr[rt];
mid;
if(L > m) return queryr(L,R,rson);
else if(R <= m) return queryr(L,R,lson);
else return (queryr(L,m,lson)+queryr(m+,R,rson)*pw[m-L+])%md;
} int main()
{
ll t,n;
ios::sync_with_stdio();
cin.tie(); cout.tie();
cin>>t;
pw[] = ;
for(ll i = ;i <= ;i++)
pw[i] = (pw[i-]*)%md;
while(t--){
cin>>n;
memset(suml,,sizeof(suml));
memset(sumr,,sizeof(sumr));
memset(a,,sizeof(a));
ll flag = ;
for(ll i = ;i <= n;i ++) cin>>a[i];
for(ll i = ;i <= n;i ++){
ll len = min(a[i]-,n-a[i]);
ll t1 = queryl(a[i]-len,a[i]-,,n,);
ll t2 = queryr(a[i]+,a[i]+len,,n,);
if(t1!=t2){
flag = ;break;
}
update(a[i],,n,);
}
if(!flag) cout<<"Y"<<endl;
else cout<<"N"<<endl;
}
}

bzoj 2124 等差子序列 (线段树维护hash)的更多相关文章

  1. BZOJ 2124: 等差子序列 线段树维护hash

    2124: 等差子序列 Description 给一个1到N的排列{Ai},询问是否存在1<=p1=3),使得Ap1,Ap2,Ap3,…ApLen是一个等差序列. Input 输入的第一行包含一 ...

  2. BZOJ 2124等差子序列 线段树&&hash

    [题目描述 Description] 给一个 1 到 N 的排列{Ai},询问是否存在 1<=p1<p2<p3<p4<p5<…<pLen<=N(Len& ...

  3. bzoj2124: 等差子序列线段树+hash

    bzoj2124: 等差子序列线段树+hash 链接 https://www.lydsy.com/JudgeOnline/problem.php?id=2124 思路 找大于3的等差数列其实就是找等于 ...

  4. BZOJ 2124: 等差子序列

    Sol 线段树+Hash. 首先暴力 等差子序列至少3项就可以了,就枚举中项,枚举公差就可以了,只需要一个数在中项前出现,另一个数在中项前没出现过就可以了.复杂度 \(O(n^2)\) 然后我想了一个 ...

  5. cf213E 线段树维护hash

    链接 https://codeforces.com/contest/213/problem/E 题目大意 给出两个排列a.b,长度分别为n.m,你需要计算有多少个x,使 得\(a_1 + x; a_2 ...

  6. MemSQL Start[c]UP 2.0 - Round 1 F - Permutation 思维+线段树维护hash值

    F - Permutation 思路:对于当前的值x, 只需要知道x + k, x - k这两个值是否出现在其左右两侧,又因为每个值只有一个, 所以可以转换成,x+k, x-k在到x所在位置的时候是否 ...

  7. BZOJ2124:等差子序列(线段树,hash)

    Description 给一个1到N的排列{Ai},询问是否存在1<=p1<p2<p3<p4<p5<…<pLen<=N (Len>=3), 使得A ...

  8. [bzoj2124]等差子序列——线段树+字符串哈希

    题目大意 给一个1到N的排列\(A_i\),询问是否存在\(p_i\),\(i>=3\),使得\(A_{p_1}, A_{p_2}, ... ,A_{p_len}\)是一个等差序列. 题解 显然 ...

  9. bzoj 4184: shallot (线段树维护线性基)

    题面 \(solution:\) 这一题绝对算的上是一道经典的例题,它向我们诠释了一种新的线段树维护方式(神犇可以跳过了).像这一类需要加入又需要维护删除的问题,我们曾经是遇到过的像莫对,线段树... ...

随机推荐

  1. 【Unity Shader】(七) ------ 复杂的光照(下)

    笔者使用的是 Unity 2018.2.0f2 + VS2017,建议读者使用与 Unity 2018 相近的版本,避免一些因为版本不一致而出现的问题.              [Unity Sha ...

  2. SAO Utils – SAO风格启动菜单

    SAO Utils 是一款拥有 SAO(刀剑神域)外观风格的启动器,搭载各种各样强大的小工具. 随时随地.在屏幕任何地方 按住鼠标左键和右键并向下拖动 即可呼出应用启动菜单(触控设备直接支持双指下滑手 ...

  3. oracle存储过程 关于update的动态SQL-工作心得

    本随笔文章,由个人博客(鸟不拉屎)转移至博客园 发布时间: 2018 年 12 月 20 日 原地址:https://niaobulashi.com/archives/oracle-procedure ...

  4. java基础---类加载和对象创建过程

    类中可以存在的成员: class A{ 静态成员变量: 非静态成员变量: 静态函数: 非静态函数: 构造函数 A(..){...} 静态代码块 static{...} 构造代码块 {...} } 类加 ...

  5. CF 675E Trains and Statistic

    草稿和一些题解而已 因为指针太恶心了 所以query决定还是要试试自己yy一下 #include<cstdio> #include<cstring> #include<i ...

  6. FFmpeg简单转码程序--视频剪辑

    学习了雷神的文章,慕斯人分享精神,感其英年而逝,不胜唏嘘.他有分享一个转码程序<最简单的基于FFMPEG的转码程序>其中使用了filter(参考了ffmpeg.c中的流程),他曾说想再编写 ...

  7. java 第一次实验报告

    北京电子科技学院(BESTI) 实     验    报     告 课程:Java程序设计 班级:1353  姓名:黎静  学号:20135338 成绩:             指导教师:娄嘉鹏  ...

  8. centos6 安装图形化界面

    1.首先进行光盘的挂载,注意光盘挂载时不会自动建立目录的,所以需要自己建立目录 mkdir /mnt/cdrom mount /dev/cdrom /mnt/cdrom #dev目录为设备目录 2.更 ...

  9. spring冲刺计划

    会议召开时间表 日期 时间 内容 05/09 21:00-22:00 讨论题目(未果) 05/10 21:00-21:30 确定题目(网络助手) 05/13 21:00-21:45 讨论软件页面设计 ...

  10. Beta Scrum Day 1 — 听说

    听说