博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【bzoj3207】花神的嘲讽计划Ⅰ Hash+STL-map+莫队算法
阅读量:5115 次
发布时间:2019-06-13

本文共 2509 字,大约阅读时间需要 8 分钟。

题目描述

背景
花神是神,一大癖好就是嘲讽大J,举例如下:
“哎你傻不傻的!【hqz:大笨J】”
“这道题又被J屎过了!!”
“J这程序怎么跑这么快!J要逆袭了!”
……
描述
这一天DJ在给吾等众蒟蒻讲题,花神在一边做题无聊,就跑到了一边跟吾等众蒟蒻一起听。以下是部分摘录:
1.
“J你在讲什么!”
“我在讲XXX!”
“哎你傻不傻的!这么麻烦,直接XXX再XXX就好了!”
“……”
2.
“J你XXX讲过了没?”
“……”
“那个都不讲你就讲这个了?哎你傻不傻的!”
“……”
DJ对这种情景表示非常无语,每每出现这种情况,DJ都是非常尴尬的。
经过众蒟蒻研究,DJ在讲课之前会有一个长度为N方案,我们可以把它看作一个数列;
同样,花神在听课之前也会有一个嘲讽方案,有M个,每次会在x到y的这段时间开始嘲讽,为了减少题目难度,每次嘲讽方案的长度是一定的,为K。
花神嘲讽DJ让DJ尴尬需要的条件:
在x~y的时间内DJ没有讲到花神的嘲讽方案,即J的讲课方案中的x~y没有花神的嘲讽方案【这样花神会嘲讽J不会所以不讲】。
经过众蒟蒻努力,在一次讲课之前得到了花神嘲讽的各次方案,DJ得知了这个消息以后欣喜不已,DJ想知道花神的每次嘲讽是否会让DJ尴尬【说不出话来】。

输入

第1行3个数N,M,K;
第2行N个数,意义如上;
第3行到第3+M-1行,每行K+2个数,前两个数为x,y,然后K个数,意义如上;

输出

对于每一个嘲讽做出一个回答会尴尬输出‘Yes’,否则输出‘No’

样例输入

8 5 3

1 2 3 4 5 6 7 8
2 5 2 3 4
1 8 3 2 1
5 7 4 5 6
2 5 1 2 3
1 7 3 4 5

样例输出

No

Yes
Yes
Yes
No


题目大意

给出一个长度为n的序列和m个询问,每次询问需要判断给出的长度为k的序列是否在原序列的[l,r]范围内出现过,是则输出"No",否则输出"Yes"

题解

Hash+STL-map+莫队算法

由于询问序列长度是给定的且不超过20,所以我们可以把原序列中所有长度为k的连续子序列预处理出来,并使用Hash的方法储存起来,放在一起用map离散化。

对于每个询问把它Hash出来,如果它不在原序列中出现过直接答案为0,否则用莫队算法跑一下就好了。

注意每个Hash值对应的离散化的值要先预处理出来,用桶维护出现次数,而不是用 map<unsigned long long , int> cnt 来存储出现次数,否则会TLE。

时间复杂度大概是$O((n+m)(k+\log n)+m\sqrt n)$。

#include 
#include
#include
#include
#define N 100010using namespace std;typedef unsigned long long ull;const ull base = 1000003;struct data{ int l , r , bl , id; ull x;}q[N];map
ref;ull a[N] , val[N];int pos[N] , cnt[N] , ans[N];bool cmp(data a , data b){ return a.bl == b.bl ? a.r < b.r : a.bl < b.bl;}int main(){ int n , m , k , i , j , si , lp = 1 , rp = 0; ull t; scanf("%d%d%d" , &n , &m , &k) , si = (int)sqrt(n); for(i = 1 ; i <= n ; i ++ ) scanf("%llu" , &a[i]); for(i = 1 ; i <= n - k + 1 ; i ++ ) { for(j = 1 ; j <= k ; j ++ ) val[i] = val[i] * base + a[i + j - 1]; if(ref.find(val[i]) == ref.end()) ref[val[i]] = i; pos[i] = ref[val[i]]; } for(i = 1 ; i <= m ; i ++ ) { scanf("%d%d" , &q[i].l , &q[i].r) , q[i].bl = (q[i].l - 1) / si , q[i].r -= k - 1 , q[i].id = i; for(j = 1 ; j <= k ; j ++ ) scanf("%llu" , &t) , q[i].x = q[i].x * base + t; } sort(q + 1 , q + m + 1 , cmp); for(i = 1 ; i <= m ; i ++ ) { if(ref.find(q[i].x) == ref.end()) continue; while(rp < q[i].r) rp ++ , cnt[pos[rp]] ++ ; while(lp > q[i].l) lp -- , cnt[pos[lp]] ++ ; while(rp > q[i].r) cnt[pos[rp]] -- , rp -- ; while(lp < q[i].l) cnt[pos[lp]] -- , lp ++ ; ans[q[i].id] = cnt[ref[q[i].x]]; } for(i = 1 ; i <= m ; i ++ ) printf("%s\n" , ans[i] ? "No" : "Yes"); return 0;}

 

 

转载于:https://www.cnblogs.com/GXZlegend/p/7043418.html

你可能感兴趣的文章
第二次团队冲刺--2
查看>>
查询数据(后台到前台传递数据,显示数据)
查看>>
集群tomcat+apache配置文档
查看>>
VMware Tools安装
查看>>
Linux上架设boost的安装及配置过程
查看>>
[转载]加密算法库Crypto——nodejs中间件系列
查看>>
zoj 2286 Sum of Divisors
查看>>
OO5~7次作业总结
查看>>
如何判断主机是大端还是小端(字节序)
查看>>
Centos7 日志查看工具
查看>>
使用Xshell密钥认证机制远程登录Linux
查看>>
BZOJ2459 : [BeiJing2011]神秘好人
查看>>
OpenCV之响应鼠标(三):响应鼠标信息
查看>>
python7 数据类型的相互转化 字符编码
查看>>
Android 画图之 Matrix(一)
查看>>
List<T>列表通用过滤模块设计
查看>>
【模板】最小生成树
查看>>
设计模式之结构型模式
查看>>
iis7规范URL及利用web.config进行重定向
查看>>
poj2569
查看>>