BZOJ [P2124] 等差子序列
线段树维护哈希值
要求出现长度大于三的等差子序列,我们只要找到长度等于三的就可以了
初看本题没有思路,只能暴力枚举,O(n^4)
后来发现,这个序列是n的一个排列,那么每个数字都只会出现一次
我们可以维护一个 \(01\) 序列 B ,表示某个数字是否出现过,
然后我们从左往右枚举等差中项x并将该项在B中置为1,存在等差数列当且仅当,
B序列以x为中心的极大子区间不是回文子区间
我们该如何高效的判断回文子区间呢,首先维护B的正反两个序列
然后有两种做法
1.线段树维护 \(01\) 序列的哈希值,要注意预处理,以及具体在某步中移多少位
2.用bitset维护
线段树维护哈希值,64位自然溢出
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cstdlib>
#include <cmath>
#define lson l, mid, rt<<1
#define rson mid + 1, r, rt<<1|1
#define ll unsigned long long
using namespace std;
const int MAXN = 10005, base = 233;
int init() {
int rv = 0, fh = 1;
char c = getchar ();
while(c < '0' || c > '9') {
if(c == '-') fh = -1;
c = getchar();
}
while(c >= '0' && c <= '9') {
rv = (rv<<1) + (rv<<3) + c - '0';
c = getchar();
}
return fh * rv;
}
int T, n;
ll hash1[MAXN<<2], hash2[MAXN<<2], idx[MAXN<<2];
ll Query1(int L, int R, int l, int r,int rt) {
if(L > R) return 0;
if(L <= l && r <= R) {
return hash1[rt];
}
int mid = (l + r) >>1;
ll ans = 0;
if(L <= mid) ans = Query1(L, R, lson);
if(mid < R) {
ans *= idx[min(R, r) - mid]; //注意min(R,r)
ans += Query1(L, R, rson);
}
return ans;
}
ll Query2(int L, int R, int l, int r, int rt) {
if(L > R) return 0;
if(L <= l && r <= R) {
return hash2[rt];
}
int mid = (l + r) >>1;
ll ans = 0;
if(mid < R) ans = Query2(L ,R, rson);
if(L <= mid){
ans *= idx[mid - max(L, l) + 1];
ans += Query2(L, R, lson);
}
return ans;
}
void PushUp(int rt, int m) {
hash1[rt] = hash1[rt<<1] * idx[m>>1] + hash1[rt<<1|1];
hash2[rt] = hash2[rt<<1|1] * idx[m - (m>>1)] + hash2[rt<<1];
}
void Update(int x, int l, int r, int rt) {
if(l >= r) {
hash1[rt] = hash2[rt] = 1;
return;
}
int mid = (l + r) >>1;
if(x <= mid) Update(x, lson);
else Update(x, rson);
PushUp(rt, r - l + 1);
}
int main() {
freopen("in.txt", "r", stdin);
T = init();
idx[0] = 1;
for(int i = 1 ; i <= MAXN ; i++) {
idx[i] = idx[i-1] * base;
}
while(T--) {
n = init();
memset(hash1, 0, sizeof(hash1));
memset(hash2, 0, sizeof(hash2));
bool f = 0;
for(int i = 1 ; i <= n ; i++) {
int x = init();
int len = min(x - 1, n - x);
if((!f) && (Query1(x - len, x - 1, 1, n, 1) != Query2(x + 1, x + len, 1, n, 1))) {
f = 1;
}
Update(x, 1, n, 1);
}
printf("%c\n", f?'Y':'N');
}
fclose(stdin);
return 0;
}
BZOJ [P2124] 等差子序列的更多相关文章
- BZOJ 2124: 等差子序列
Sol 线段树+Hash. 首先暴力 等差子序列至少3项就可以了,就枚举中项,枚举公差就可以了,只需要一个数在中项前出现,另一个数在中项前没出现过就可以了.复杂度 \(O(n^2)\) 然后我想了一个 ...
- BZOJ 2124等差子序列 线段树&&hash
[题目描述 Description] 给一个 1 到 N 的排列{Ai},询问是否存在 1<=p1<p2<p3<p4<p5<…<pLen<=N(Len& ...
- bzoj 2124 等差子序列 (线段树维护hash)
2124: 等差子序列 Time Limit: 3 Sec Memory Limit: 259 MBSubmit: 1922 Solved: 714[Submit][Status][Discuss ...
- bzoj 2124 等差子序列 树状数组维护hash+回文串
等差子序列 Time Limit: 3 Sec Memory Limit: 259 MBSubmit: 1919 Solved: 713[Submit][Status][Discuss] Desc ...
- 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,表示组数.下接 ...
- [BZOJ2124]等差子序列/[CF452F]Permutation
[BZOJ2124]等差子序列/[CF452F]Permutation 题目大意: 一个\(1\sim n\)的排列\(A_{1\sim n}\),询问是否存在\(i,j(i<j)\),使得\( ...
- [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] ...
随机推荐
- ubuntu 14.04 安装mysql,并配置远程连接和中文乱码
1. 安装MySQL的jar root@computer-PowerEdge-T30:~# sudo apt-get install mysql-server mysql-client在本次安装中,根 ...
- 最近在准备面试,总结了几个java中面向对象的几个问题,问题本事还不够全面,要想知道还是要自己去找,但是在面试上应该是没多大问题了
Overload(重载)与Override(重写)的区别 重载:发生在一个类中,方法名称相同,参数列表不同,方法体不同(看对象类型) 重写:发生在父类中,方法名称相同,参数列表相同,方法体不同(看引用 ...
- Java动态代理之InvocationHandler最简单的入门教程
网上关于Java的动态代理,Proxy和InvocationHandler这些概念有讲解得非常高深的文章.其实这些概念没有那么复杂.现在咱们通过一个最简单的例子认识什么是InvocationHandl ...
- 字符串赋值方式理解 sizeof 和strlen的一些区别
#include<stdio.h>#include<string.h> int main(){ int a,i=0; char ch[10000]; while(scanf( ...
- leetcode_1049. Last Stone Weight II_[DP]
1049. Last Stone Weight II https://leetcode.com/problems/last-stone-weight-ii/ 题意:从一堆石头里任选两个石头s1,s2, ...
- ucosii(2.89)mbox 应用要点
OSMboxCreate(void *msg) 当创建一个mbox时候,消息邮箱允许(任务或者中断)向其他一个或者几个任务发送消息.初始化msg指向消息邮箱中的消息. void*OSMboxP ...
- Hopfield 网络(上)
讲的什么 这部分主要对 Hopfield 网络作一大概的介绍.写了其模型结构.能量函数和网络的动作方式.主要参考了网上搜到的一些相关 PPT. 概述 早在 1982 年,Hopfield 发表的文 ...
- python爬虫---实现项目(三) Selenium分析美团美食
上一期博客,我本来想爬取美团美食的,但是由于请求头太复杂,没有破解开其中的几个参数,所以放弃,这次我们来用selenium来模式浏览器抓取数据,我们先来简单看一下流程: 1,利用selenium驱动浏 ...
- mac系统下android studio创建手机模拟器
打开android studio,点击右上角的模拟器图标,打开“Android Virtual Device Manager” 窗口,如下图 点击“Create Virtual Device”,在 ...
- Bootstrap历练实例:点击激活的按钮
<!DOCTYPE html><html><head> <meta http-equiv="Content-Type" content=& ...