【BZOJ 2124】【CodeVS 1283】等差子序列
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】等差子序列的更多相关文章
- codevs 1283 等差子序列
http://codevs.cn/problem/1283/ 题目描述 Description 给一个 1 到 N 的排列{Ai},询问是否存在 1<=p1<p2<p3<p4& ...
- BZOJ 2124: 等差子序列
Sol 线段树+Hash. 首先暴力 等差子序列至少3项就可以了,就枚举中项,枚举公差就可以了,只需要一个数在中项前出现,另一个数在中项前没出现过就可以了.复杂度 \(O(n^2)\) 然后我想了一个 ...
- bzoj 2124 等差子序列 (线段树维护hash)
2124: 等差子序列 Time Limit: 3 Sec Memory Limit: 259 MBSubmit: 1922 Solved: 714[Submit][Status][Discuss ...
- BZOJ 2124: 等差子序列 线段树维护hash
2124: 等差子序列 Description 给一个1到N的排列{Ai},询问是否存在1<=p1=3),使得Ap1,Ap2,Ap3,…ApLen是一个等差序列. Input 输入的第一行包含一 ...
- 2124: 等差子序列 - BZOJ
Description 给一个1到N的排列{Ai},询问是否存在1<=p1=3),使得Ap1,Ap2,Ap3,…ApLen是一个等差序列. Input 输入的第一行包含一个整数T,表示组数.下接 ...
- BZOJ 2124等差子序列 线段树&&hash
[题目描述 Description] 给一个 1 到 N 的排列{Ai},询问是否存在 1<=p1<p2<p3<p4<p5<…<pLen<=N(Len& ...
- bzoj 2124 等差子序列 树状数组维护hash+回文串
等差子序列 Time Limit: 3 Sec Memory Limit: 259 MBSubmit: 1919 Solved: 713[Submit][Status][Discuss] Desc ...
- BZOJ [P2124] 等差子序列
线段树维护哈希值 要求出现长度大于三的等差子序列,我们只要找到长度等于三的就可以了 初看本题没有思路,只能暴力枚举,O(n^4) 后来发现,这个序列是n的一个排列,那么每个数字都只会出现一次 我们可以 ...
- [bzoj2124]等差子序列(hash+树状数组)
我又来更博啦 2124: 等差子序列 Time Limit: 3 Sec Memory Limit: 259 MBSubmit: 941 Solved: 348[Submit][Statu ...
- bzoj2124 等差子序列(hash+线段树)
2124: 等差子序列 Time Limit: 3 Sec Memory Limit: 259 MBSubmit: 719 Solved: 261[Submit][Status][Discuss] ...
随机推荐
- grunt、Browsersync服务及weinre远程调试
一.grunt server服务 前端开发时,经常需要把静态文件映射成web服务,传统的做法是丢到apache,但太重太不友好了.开发angular的时候,官方的chrome插件对file:///的支 ...
- 自定义ToolBar
一.Toolbar的简介 Toolbar 是 android 5.0 引入的一个新控件,Toolbar出现之前,我们很多时候都是使用ActionBar以及ActionActivity实现顶部导航栏的, ...
- css 背景透明,文字不透明
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- peewee在flask中的配置
# 原文:https://blog.csdn.net/mouday/article/details/85332510 Flask的钩子函数与peewee.InterfaceError: (0, '') ...
- PHP路由代码
<?php /** * 路由 * @author 角度 QQ:1286522207 * */ class Dispatcher extends Action { private ...
- io多路复用-select()
参照<Unix网络编程>相关章节内容,实现了一个简单的单线程IO多路复用服务器与客户端. 普通迭代服务器,由于执行recvfrom则会发生阻塞,直到客户端发送数据并正确接收后才能够返回,一 ...
- CSS浮动和清除
float:让元素浮动,取值:left(左浮动).right(右浮动) clear:清除浮动,取值:left(清除左浮动).right(清除右浮动).both(同时清除上面的左浮动和右浮动) 1.CS ...
- rabbitmq和ons-rocketmq使用对比
MQ,其实目的都是一样,就是应对系统的并发可以实现消峰和解耦的作用,类似于创建了一个线程异步操作,这一点可以了解一下一款优秀的并发框架(Disruptor),据说是每秒可以处理十万级数据, 目前据本人 ...
- ubuntu在vim编辑时,方向键无法正常使用
/* 如果在普通用户下. */ [frankie@localhost ~]$ sudo apt-get install vim [frankie@localhost ~]$ cd /etc/vim [ ...
- 如何消除类型是submit类型的按钮的默认文字 ‘确认提交’
只需要加上value="" 即可.默认的文字就可以去掉了.