题目描述

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

使得Ap1,Ap2,Ap3,…ApLen是一个等差序列。

输入

输入的第一行包含一个整数T,表示组数。

下接T组数据,每组第一行一个整数N,每组第二行为一个1到N的排列,数字两两之间用空格隔开。

N<=10000,T<=7

输出

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

样例输入

2
3
1 3 2
3
3 2 1

样例输出

N
Y 

考虑什么时候不存在等差数列把出现过的数字对应位置赋成1,没出现过的为0那么扫到i时,以a[i]为中心的串如果是回文,那么就不存在以a[i]为中心的等差数列考虑用线段树维护正反两种hash值,详情看代码吧233这题做的时候一次忘关调试信息了,然后删的时候还不小心删多了。。。(ノへ ̄、)

 1 #include<cstdio>
 2 #include<cstring>
 3 #define ull unsigned long long
 4 using namespace std;
 5 int T,n,a[10005];
 6 ull sum1[50000],sum2[50000],hsh[10005];
 7 void add(int x,int l,int r,int q){
 8     if(l==q&&r==q){
 9         sum1[x]=sum2[x]=1;
10         return;
11     }
12     int mid=(l+r)/2;
13     if(q<=mid)add(x+x,l,mid,q);
14     else add(x+x+1,mid+1,r,q);
15     sum1[x]=sum1[x+x]*hsh[r-mid]+sum1[x+x+1];
16     sum2[x]=sum2[x+x]+sum2[x+x+1]*hsh[mid-l+1];
17 }
18 ull query(int x,int l,int r,int L,int R,int t){
19     if(l==L&&r==R){
20         if(t==1)return sum1[x];
21         else return sum2[x];
22     }
23     int mid=(l+r)/2;
24     if(R<=mid)return query(x+x,l,mid,L,R,t);
25     else if(L>mid)return query(x+x+1,mid+1,r,L,R,t);
26     else{
27         if(t==1)return query(x+x,l,mid,L,mid,t)*hsh[R-mid]+query(x+x+1,mid+1,r,mid+1,R,t);
28         else return query(x+x,l,mid,L,mid,t)+query(x+x+1,mid+1,r,mid+1,R,t)*hsh[mid-L+1];
29     }
30 }
31 ull A,B;
32 int main(){
33     scanf("%d",&T);
34     hsh[0]=1;
35     for(int i=1;i<=10002;i++)hsh[i]=hsh[i-1]*131;
36     while(T--){
37         bool ok=1;
38         scanf("%d",&n);
39         for(int i=1;i<=n;i++)scanf("%d",&a[i]);
40         for(int i=1;i<=n;i++){
41             if(ok){
42                 if(a[i]<=n/2){
43                     A=query(1,1,n,1,2*a[i]-1,1);
44                     B=query(1,1,n,1,2*a[i]-1,0);
45                 }
46                 else{
47                     A=query(1,1,n,2*a[i]-n,n,1);
48                     B=query(1,1,n,2*a[i]-n,n,0);
49                 }
50                 if(A!=B)ok=0;
51                 add(1,1,n,a[i]);
52             }
53             else break;
54         }
55         if(ok)printf("N\n");
56         else printf("Y\n");
57         memset(sum1,0,sizeof(sum1));
58         memset(sum2,0,sizeof(sum2));
59     }
60     return 0;
61 }

View Code

转载于:https://www.cnblogs.com/2017SSY/p/10176350.html

Bzoj2124(p5364): 等差子序列相关推荐

  1. 线段树专题-等差子序列 BZOJ-2124

    线段树专题-等差子序列 感谢 感谢孙耀峰的线段树PPT,使我获益匪浅. 题目来源 BZOJ−2124BZOJ-2124BZOJ−2124 题意 给出长度为nnn的1−n1-n1−n的排列AAA 问是否 ...

  2. CF452F Permutations/Luogu2757 等差子序列 树状数组、Hash

    传送门--Luogu 传送门--Codeforces 如果存在长度\(>3\)的等差子序列,那么一定存在长度\(=3\)的等差子序列,所以我们只需要找长度为\(3\)的等差子序列.可以枚举等差子 ...

  3. BZOJ 2124 等差子序列 线段树维护哈希

    $ \Rightarrow $ 戳我进BZOJ原题 等差子序列 Time Limit: 3 Sec $ \quad $ Memory Limit: 259 MB Description 给一个 $ 1 ...

  4. codevs 1283 等差子序列

    http://codevs.cn/problem/1283/ 题目描述 Description 给一个 1 到 N 的排列{Ai},询问是否存在 1<=p1<p2<p3<p4& ...

  5. P2757 [国家集训队]等差子序列

    P2757 [国家集训队]等差子序列 题目传送门 推荐一篇好题解 此题要求我们在一个序列中找出一个等差子序列. 显然,我们只需要考虑子序列长度len=3的情况,因为在长度为4的子序列中必定有一个长度为 ...

  6. 最长等差数列_最长等差子序列的长度

    问题描述 给定一个整数数组 A,返回A 中最长等差子序列的长度. 输入:[20,1,15,3,10,5,8] 输出:4 解释:最长的等差子序列是 [20,15,10,5] 问题分析 我们要找出最长的等 ...

  7. java 请求响应_java http接口请求响应 request response

    接口类: 1 package org.sunshine.dcda.epg.wechat.controller.niao; 2 3 import javax.servlet.http.HttpServl ...

  8. Leecode 1218. 最长定差子序列——Leecode每日一题系列

    今天是坚持每日一题打卡的第十天 题目链接:https://leetcode-cn.com/problems/longest-arithmetic-subsequence-of-given-differ ...

  9. 等差数列划分 II - 子序列(动态规划)

    如果一个数列至少有三个元素,并且任意两个相邻元素之差相同,则称该数列为等差数列. 例如,以下数列为等差数列: 1, 3, 5, 7, 9 7, 7, 7, 7 3, -1, -5, -9 以下数列不是 ...

最新文章

  1. java. 算法分析,Java常用算法分析
  2. mysql中先随机提取再排序d_mysql性能优化
  3. Citrix Port(常用端口)
  4. Hadoop - MapReduce
  5. 第四章 Lua模块开发
  6. 内存泄漏(OOM)产生原因
  7. 谷歌离线地图Api附获取教程
  8. 正交投影与最佳最小二乘解
  9. STL8-string容器
  10. Android系统(237)---OTA升级基本信息介绍
  11. 自动生成 Makefile 的全过程详解
  12. Git最好的CRLF(回车,换行)处理策略是什么?
  13. 【java笔记】Iterator迭代器 增强for
  14. 有害评论识别问题:数据可视化与频率词云
  15. 设计模式大类--结构模式(下)
  16. 如何使用jmeter录制脚本
  17. 2021公路水运工程试验检测考试大纲
  18. 计算机怎么改鼠标标志,电脑鼠标指针怎么改 修改电脑鼠标指针方法【图文】...
  19. 启动auditd时,报错如下,怎么解决?
  20. 基于面板数据的熵值法介绍与实现

热门文章

  1. f1ag_1s_h3re.php,攻防世界XCTF-WEB-新手练习区(1-3)
  2. feign传递数组_feign中传递自定义MultipartFile
  3. MySQL快速上手[学习笔记](二)
  4. java list_java中的list集合
  5. Python自动化整理文件,还增加了可视化GUI界面
  6. 营业执照psd模板2020_荣誉证书聘书奖状模板,CFR矢量素材PSD源文件,700张精美套用...
  7. java 3500_学java开发3500价位的笔记本该侧重那些方面?
  8. 机器人搬运礼盒程序_机器人搬运程序.doc
  9. 简单创建两个线程,交替输出内容
  10. java exec waitfor,Java Process waitFor()方法与示例