BZOJ 3207 花神的嘲讽计划Ⅰ(函数式线段树)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=3207
题意:给出一个数列,若干询问。每个询问查询[L,R]区间内是否存在某个长度为K的子数列(连续的)。
思路:将长度为K的每个子数列哈希成一个值,将查询也哈希成一个值,建立函数式线段树,然后对于查询[L,R],查询个数是否大于0。
int n,m,K,a[N];
int st[N],ed[N];
u64 b[N],bNum;
u64 p[N],q[N];
u64 getHash(int L,int R)
{
u64 ans=0;
int i;
for(i=L;i<=R;i++) ans=ans*107+a[i];
return ans;
}
struct node
{
int L,R,a,b,s;
};
node tree[N<<4];
int root[N],tot;
int build(int a,int b)
{
int k=++tot;
tree[k].a=a;
tree[k].b=b;
tree[k].s=0;
int mid=(a+b)>>1;
if(a!=b)
{
tree[k].L=build(a,mid);
tree[k].R=build(mid+1,b);
}
return k;
}
int insert(int p,int x)
{
int k=++tot;
tree[k]=tree[p];
tree[k].s++;
if(tree[k].a==x&&tree[k].b==x) return k;
int mid=(tree[k].a+tree[k].b)>>1;
if(x<=mid) tree[k].L=insert(tree[p].L,x);
else tree[k].R=insert(tree[p].R,x);
return k;
}
int get(int p,int x)
{
if(tree[p].a==tree[p].b) return tree[p].s;
int mid=(tree[p].a+tree[p].b)>>1;
if(x<=mid) return get(tree[p].L,x);
else get(tree[p].R,x);
}
int main()
{
RD(n,m,K);
int i;
FOR1(i,n) RD(a[i]);
bNum=n-K+1;
FOR1(i,bNum) p[i]=b[i]=getHash(i,i+K-1);
int j,x;
u64 t;
FOR1(i,m)
{
RD(st[i],ed[i]); ed[i]=ed[i]-K+1;
t=0;
FOR1(j,K) RD(x),t=t*107+x;
q[i]=b[++bNum]=t;
}
sort(b+1,b+bNum+1);
root[0]=build(1,bNum);
FOR1(i,n-K+1)
{
a[i]=lower_bound(b+1,b+bNum+1,p[i])-b;
root[i]=insert(root[i-1],a[i]);
}
FOR1(i,m)
{
x=lower_bound(b+1,b+bNum+1,q[i])-b;
if(get(root[ed[i]],x)-get(root[st[i]-1],x)>0) puts("No");
else puts("Yes");
}
}
BZOJ 3207 花神的嘲讽计划Ⅰ(函数式线段树)的更多相关文章
- BZOJ 3207: 花神的嘲讽计划Ⅰ( hash + 可持久化线段树 )
O(NK)暴力搞出所有子串的哈希值, 然后就对哈希值离散化建权值线段树, 就是主席树的经典做法了.总时间复杂度O(NK+(N+Q)logN) ----------------------------- ...
- bzoj 3207 花神的嘲讽计划Ⅰ 主席树+hash
花神的嘲讽计划Ⅰ Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3112 Solved: 1086[Submit][Status][Discuss] ...
- [BZOJ 3207] 花神的嘲讽计划Ⅰ【Hash + 可持久化线段树】
题目链接:BZOJ - 3207 题目分析 先使用Hash,把每个长度为 k 的序列转为一个整数,然后题目就转化为了询问某个区间内有没有整数 x . 这一步可以使用可持久化线段树来做,虽然感觉可以有更 ...
- bzoj 3207: 花神的嘲讽计划Ⅰ
Description 背景 花神是神,一大癖好就是嘲讽大J,举例如下: "哎你傻不傻的![hqz:大笨J]" "这道题又被J屎过了!!" "J这程序 ...
- bzoj 3207 花神的嘲讽计划Ⅰ(哈希法+主席树)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3207 [题意] 给定一个文本串,多次询问K长的模式串是否在文本[l,r]区间内出现. ...
- BZOJ 3207: 花神的嘲讽计划Ⅰ(莫队+哈希)
传送门 解题思路 刚开始写了个莫队+哈希+\(map\)的\(O(n\sqrt(n)log(n)\)的辣鸡做法,\(T\)飞了.后来看了看别人博客发现其实并不用拿\(map\)当桶存那些哈希值.因为只 ...
- 【BZOJ3207】花神的嘲讽计划Ⅰ Hash+主席树
[BZOJ3207]花神的嘲讽计划Ⅰ Description 背景 花神是神,一大癖好就是嘲讽大J,举例如下: “哎你傻不傻的![hqz:大笨J]” “这道题又被J屎过了!!” “J这程序怎么跑这么快 ...
- 【BZOJ】【3207】花神的嘲讽计划 I
字符串Hash+可持久化线段树 好神奇的转化…… 蒟蒻一开始还去想AC自动机去了……然而由于a[i]的范围是小于等于n,怎么也想不出一个时间复杂度合理的方法 膜拜了题解0.0原来是字符串Hash! 首 ...
- 【BZOJ3207】花神的嘲讽计划I 可持久化线段树/莫队
看到题目就可以想到hash 然后很自然的联想到可持久化权值线段树 WA:base取了偶数 这道题还可以用莫队做,比线段树快一些 可持久化线段树: #include<bits/stdc++.h&g ...
随机推荐
- 幻灯片slider
<script src="{$GetInstallDir}web/scripts/jquery-1.3.1.js"></script> <style& ...
- VBS基础篇 - 条件语句
经常地,当我们编写代码时,我们需要根据不同的判断执行不同操作,我们可以使用条件语句完成这个工作. If...Then...Else 在下面的情况中,您可以使用 If...Then...Else 语句: ...
- Awesome (and Free) Data Science Books[转]
Post Date: September 3, 2014By: Stephanie Miller Marty Rose, Data Scientist in the Acxiom Product an ...
- swift 类 与 结构体
这两天突然有人问我 swift里面 类和 结构体 有什么区别? 说实在的本人目前不太看好swift,相信很多人也是,oc 都 很成熟了. 本人目前不打算深入了解swift的原因swift 语言 ...
- Oppotunity land---China
China is a land of opportunity.Following the development of China,every sector has made their contri ...
- C++实现简单的内存池
多进程编程多用在并发服务器的编写上,当收到一个请求时,服务器新建一个进程处理请求,同时继续监听.为了提高响应速度,服务器采用进程池的方法,在初始化阶段创建一个进程池,池中有许多预创建的进程,当请求到达 ...
- sqlserver convert 日期时间 转换格式化
Select CONVERT(varchar(100), GETDATE(), 120): 2006-05-16 10:57:49 Select CONVERT(varchar(100), GET ...
- html+css学习笔记 5[表格、表单]
表格 -- 默认样式重置 表格标签: table 表格 thead 表格头 tbody 表格主体 tfoot 表格尾 tr 表格行 th 元素定义表头 ...
- php缓存
APC缓存退出舞台,APCU诞生,OPCACHE升级! 对于php5.5以后的新版本开发,使用apc习惯的开发者可能会发现php.5.5以后找不到了这个组件的更新,尤其是中文phper都找不到合适的资 ...
- hlsl 和cg 涉及 mul 左乘 右乘
error: 1. mul' implicit truncation of vector type 2. matrixXXX: array dimensions of(unknown scope en ...