http://www.lydsy.com/JudgeOnline/problem.php?id=2124

http://codevs.cn/problem/1283/

重点是把判断是否存在3个数组成等差数列变为对于一个数x快速判断x+d和x-d是否在x的左右两侧。

如果在x左侧,设为1,在x右侧,设为0。

如果没有冲突,就是说同时为1或0,那么x左边一段的01串和x右边一段的01串翻转后的串相同,这个可以线段树+hash快速判断。

时间复杂度\(O(n\log n)\)。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N = 10003;
const int p = 1000000007; int powp[N], n; namespace SegmentTree {
int num, hash1[N << 2], hash2[N << 2]; void clr() {
memset(hash1, 0, sizeof(hash1));
memset(hash2, 0, sizeof(hash2));
} void update(int rt, int l, int r, int pos) {
if (l == r) {hash1[rt] = hash2[rt] = 1; return;}
int mid = (l + r) >> 1;
if (pos <= mid) update(rt << 1, l, mid, pos);
else update(rt << 1 | 1, mid + 1, r, pos);
hash1[rt] = (1ll * hash1[rt << 1] * powp[r - mid] % p + hash1[rt << 1 | 1]) % p;
hash2[rt] = (1ll * hash2[rt << 1 | 1] * powp[mid - l + 1] % p + hash2[rt << 1]) % p;
} void work1(int rt, int l, int r, int L, int R) {
if (L <= l && r <= R) {num = (1ll * num * powp[r - l + 1] % p + hash1[rt]) % p; return;}
int mid = (l + r) >> 1;
if (L <= mid) work1(rt << 1, l, mid, L, R);
if (R > mid) work1(rt << 1 | 1, mid + 1, r, L, R);
} void work2(int rt, int l, int r, int L, int R) {
if (L <= l && r <= R) {num = (1ll * num * powp[r - l + 1] % p + hash2[rt]) % p; return;}
int mid = (l + r) >> 1;
if (R > mid) work2(rt << 1 | 1, mid + 1, r, L, R);
if (L <= mid) work2(rt << 1, l, mid, L, R);
} int get_hash1(int L, int R) {
if (L > R) return 0;
num = 0;
work1(1, 1, n, L, R);
return num;
} int get_hash2(int L, int R) {
if (L > R) return 0;
num = 0;
work2(1, 1, n, L, R);
return num;
}
} int a[N]; int main() {
powp[0] = 1;
for (int i = 1; i < N; ++i)
powp[i] = (powp[i - 1] << 1) % p; bool flag;
int T, len, l1, r1, l2, r2;
scanf("%d", &T);
while (T--) {
SegmentTree::clr();
scanf("%d", &n);
flag = false;
for (int i = 1; i <= n; ++i) scanf("%d", a + i);
for (int i = 1; i <= n; ++i) {
len = min(a[i] - 1, n - a[i]);
r1 = a[i] - 1; l2 = a[i] + 1;
l1 = r1 - len + 1; r2 = l2 + len - 1;
if (SegmentTree::get_hash1(l1, r1) != SegmentTree::get_hash2(l2, r2)) {
flag = true; break;
}
SegmentTree::update(1, 1, n, a[i]);
}
puts(flag ? "Y" : "N");
} return 0;
}

【BZOJ 2124】【CodeVS 1283】等差子序列的更多相关文章

  1. codevs 1283 等差子序列

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

  2. BZOJ 2124: 等差子序列

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

  3. bzoj 2124 等差子序列 (线段树维护hash)

    2124: 等差子序列 Time Limit: 3 Sec  Memory Limit: 259 MBSubmit: 1922  Solved: 714[Submit][Status][Discuss ...

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

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

  5. 2124: 等差子序列 - BZOJ

    Description 给一个1到N的排列{Ai},询问是否存在1<=p1=3),使得Ap1,Ap2,Ap3,…ApLen是一个等差序列. Input 输入的第一行包含一个整数T,表示组数.下接 ...

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

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

  7. bzoj 2124 等差子序列 树状数组维护hash+回文串

    等差子序列 Time Limit: 3 Sec  Memory Limit: 259 MBSubmit: 1919  Solved: 713[Submit][Status][Discuss] Desc ...

  8. BZOJ [P2124] 等差子序列

    线段树维护哈希值 要求出现长度大于三的等差子序列,我们只要找到长度等于三的就可以了 初看本题没有思路,只能暴力枚举,O(n^4) 后来发现,这个序列是n的一个排列,那么每个数字都只会出现一次 我们可以 ...

  9. [bzoj2124]等差子序列(hash+树状数组)

    我又来更博啦     2124: 等差子序列 Time Limit: 3 Sec  Memory Limit: 259 MBSubmit: 941  Solved: 348[Submit][Statu ...

  10. bzoj2124 等差子序列(hash+线段树)

    2124: 等差子序列 Time Limit: 3 Sec  Memory Limit: 259 MBSubmit: 719  Solved: 261[Submit][Status][Discuss] ...

随机推荐

  1. 用vue快速开发app的脚手架工具

    前言 多页面应用于结构较于简单的页面,因为简答的页面使用router又过于麻烦.本脚手架出于这样的场景被开发出来. 使用脚手架搭配Hbuilder也同样可以快速使用vue开发安卓和IOS APP. 本 ...

  2. A题 hdu 1235 统计同成绩学生人数

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1235 统计同成绩学生人数 Time Limit: 2000/1000 MS (Java/Others) ...

  3. 2017-2018-1 20179205《Linux内核原理与设计》第六周作业

    <Linux内核原理与设计> 视频学习及操作 给MenuOS增加time和time-asm命令的方法: 1.更新menu代码到最新版 rm menu -rf //强制删除menu, rm ...

  4. Linux 入门记录:十七、Linux 命令行文本/文件处理工具

    一.文件浏览 cat 查看文件内容 more 以翻页形式查看文件内容(只能向下翻页) less 以翻页形式查看文件内容(可以上下翻页) head 查看文件的头几行(默认10行) tail 查看文件的尾 ...

  5. [device tree] How to decompile a compiled .dtb (device tree blog) into .dts (device tree source).

    $ ./out/target/product/project_name/obj/KERNEL_OBJ/scripts/dtc/dtc -I dtb -O dts -o decompiled.dts ~ ...

  6. linux 命令行远程登录 后台运行命令的方法

    linux 命令行远程登录 后台运行命令的方法 http://blog.csdn.net/isuker/article/details/55061595 Linux 技巧:让进程在后台可靠运行的几种方 ...

  7. 【bzoj1923】外星千足虫

    这个gauss消元有点naive啊. 由于只有01,位操作显然是方便的多. 那么用bitset代替之前的增广矩阵就行了. #include<bits/stdc++.h> #define N ...

  8. OpenCV编程入门目录

    第一部分 快速上手OpenCV 第1 章 邂逅OpenCV 图像处理.计算机视觉与OpenCV OpenCV 概述 起源及发展 应用概述 .2OpenCV 基本架构分析 .3OpenCV3 带来了什么 ...

  9. leetcode 121 122 123 . Best Time to Buy and Sell Stock

    121题目描述: 解题:记录浏览过的天中最低的价格,并不断更新可能的最大收益,只允许买卖一次的动态规划思想. class Solution { public: int maxProfit(vector ...

  10. 后台传入的boolean类型到前台alert为String类型了(解决方法)

    后台代码: // 进入仪器list界面之前查看 是否是科研处人员        SessionContainer sc = (SessionContainer) session.getAttribut ...