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进制来保存,每一步都取下模,如果这
两个数的十进制不同,那他们的二进制肯定也不同。这样就可以判断出答案了。
 
实现代码;
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define ll long long
  4. #define lson l,m,rt<<1
  5. #define rson m+1,r,rt<<1|1
  6. #define mid ll m = (l + r) >> 1
  7. const ll M = 1e5+;
  8. const ll md = 1e9+;
  9. ll suml[M<<],sumr[M<<],a[M],pw[M];
  10. void pushup(ll l,ll r,ll rt){
  11. ll len = r - l + ;
  12. ll m = len / ;
  13. suml[rt] = (suml[rt<<]*pw[m]+suml[rt<<|])%md;
  14. sumr[rt] = (sumr[rt<<|]*pw[len-m]+sumr[rt<<])%md;
  15. return ;
  16. }
  17.  
  18. void update(ll p,ll l,ll r,ll rt){
  19. if(l == r){
  20. suml[rt] = sumr[rt] = ;
  21. return ;
  22. }
  23. mid;
  24. if(p <= m) update(p,lson);
  25. else update(p,rson);
  26. pushup(l,r,rt);
  27. }
  28.  
  29. ll queryl(ll L,ll R,ll l,ll r,ll rt){
  30. if(L > R) return ;
  31. if(L == l&&R == r) return suml[rt];
  32. mid;
  33. if(L > m) return queryl(L,R,rson);
  34. else if(R <= m) return queryl(L,R,lson);
  35. else return (queryl(L,m,lson)*pw[R-m]+queryl(m+,R,rson))%md;
  36. }
  37.  
  38. ll queryr(ll L,ll R,ll l,ll r,ll rt){
  39. if(L > R) return ;
  40. if(L == l&&R == r) return sumr[rt];
  41. mid;
  42. if(L > m) return queryr(L,R,rson);
  43. else if(R <= m) return queryr(L,R,lson);
  44. else return (queryr(L,m,lson)+queryr(m+,R,rson)*pw[m-L+])%md;
  45. }
  46.  
  47. int main()
  48. {
  49. ll t,n;
  50. ios::sync_with_stdio();
  51. cin.tie(); cout.tie();
  52. cin>>t;
  53. pw[] = ;
  54. for(ll i = ;i <= ;i++)
  55. pw[i] = (pw[i-]*)%md;
  56. while(t--){
  57. cin>>n;
  58. memset(suml,,sizeof(suml));
  59. memset(sumr,,sizeof(sumr));
  60. memset(a,,sizeof(a));
  61. ll flag = ;
  62. for(ll i = ;i <= n;i ++) cin>>a[i];
  63. for(ll i = ;i <= n;i ++){
  64. ll len = min(a[i]-,n-a[i]);
  65. ll t1 = queryl(a[i]-len,a[i]-,,n,);
  66. ll t2 = queryr(a[i]+,a[i]+len,,n,);
  67. if(t1!=t2){
  68. flag = ;break;
  69. }
  70. update(a[i],,n,);
  71. }
  72. if(!flag) cout<<"Y"<<endl;
  73. else cout<<"N"<<endl;
  74. }
  75. }

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. tikz中谐振子(弹簧)的绘制,以及声子色散关系的绘制

    今天整理了简正模导出声子的内容,其中用tikz画了两张图.一张是整个问题的物理模型,效果如下 这幅图的绘制参考了https://tex.stackexchange.com/questions/4160 ...

  2. JavaWeb项目学习教程(2) 系统数据库设计

    最开始本来想写一个管理系统,因为考虑到期末来临,我女朋友就可以看着教程然后学一些东西,然后可以自己慢慢手敲代码.但无奈自己也太懒,两个月过后,我才开始继续写这个博客,而现在我都已经开学了.不过博客还是 ...

  3. 阿里云centos7.4安装并部署svn1.10.0版本(配置多仓库,加入开机自启动)

    如何安装最新版本 1.10.0: 如果已安装旧版本,先卸载 yum remove subversion* 查看当前可安装的版本 yum list | grep subversion 可以去官网下载安装 ...

  4. 《spark机器学习 第二版》 蔡立宇 分享 pdf下载

    链接:https://pan.baidu.com/s/15Y14eAnfj8zf5mXdixbVeQ 提取码:rkdt

  5. lua模块注册

    Lua自带的模块并不多,好处就是Lua足够的小,毕竟它的设计目标是定位成一个嵌入式的轻量级语言的. 相关的函数index2adr static TValue *index2adr (lua_State ...

  6. 32bit 天堂2 windows 2000 server架设教程

    服务器的软件要求: Microsoft Windows 2000 Server or advanced Server license 100 Microsoft SQL Server 2000 Ent ...

  7. PLSQL触发器,游标

    --触发器 drop table emp_log create table emp_log( empno number, log_date date, new_salary number, actio ...

  8. C#如何在各类控件中输入\输出数据

    文本框:TextBox Text - 按钮文字 TextBox.text=""; s=TextBox.text; 单选按钮+复选按钮 RadioButton,CheckBox Te ...

  9. MySQL基础(一)

    首先需要安装MySOL,这里我是在windows环境下安装的,具体教程可以参考https://www.cnblogs.com/xsmile/p/7753984.html,不过要注意安装过程可能会不太顺 ...

  10. CentOS 7 安装图形化界面及 Xshell 连接

    CentOS 比较适合用作服务器的系统,之前用过 CentOS 6,但是在配置 Nginx 的时候,发现很多语句版本7的系统都进行了更新,而且网上针对版本7的例子会更多一下,遂将系统换成版本7. 下载 ...