BZOJ3207 花神的嘲讽计划

hash值建主席树。

垃圾题面没有熟虑范围害我MLE——>RE。

By:大奕哥

 1 #include<bits/stdc++.h>
 2 #define unll unsigned long long
 3 #define inf 18446744073709551615UL
 4 using namespace std;
 5 const int N=1000005;
 6 struct node{
 7     int l,r,s;
 8 }t[2000005];
 9 int a[N],rt[N],n,m,k,cnt;unll H[N],pos[N],num;
10 void change(int &x,unll l,unll r,unll w)
11 {
12     t[++cnt]=t[x];x=cnt;
13     if(l==r){
14         t[x].s++;return;
15     }
16     int mid=l+r>>1;
17     if(w<=mid)change(t[x].l,l,mid,w);
18     else change(t[x].r,mid+1,r,w);
19     t[x].s=t[t[x].l].s+t[t[x].r].s;
20 }
21 int query(int x,int y,unll l,unll r,unll w)
22 {
23     if(l==r)return t[x].s-t[y].s;
24     unll mid=l+r>>1;
25     if(w<=mid)return query(t[x].l,t[y].l,l,mid,w);
26     else return query(t[x].r,t[y].r,mid+1,r,w);
27 }
28 int main()
29 {
30     scanf("%d%d%d",&n,&m,&k);unll base=1;
31     for(int i=1;i<=n;++i)scanf("%d",&a[i]);
32     for(int i=1;i<=k;++i)base*=107;
33     for(int i=1;i<=n;++i)
34     {
35         H[i]=H[i-1]*107+a[i];
36         pos[++num]=H[i]-H[i-k]*base;
37     }
38     sort(pos+1,pos+1+num);num=unique(pos+1,pos+1+num)-pos-1;
39     for(int i=k;i<=n;++i)
40     rt[i]=rt[i-1],change(rt[i],1,num,lower_bound(pos+1,pos+1+num,H[i]-H[i-k]*base)-pos);
41     int l,r,x; unll w;
42     for(int i=1;i<=m;++i)
43     {
44         scanf("%d%d",&l,&r);w=0;
45         for(int j=1;j<=k;++j)
46         {
47             scanf("%d",&x);
48             w=w*107+x;
49         }
50         int p=lower_bound(pos+1,pos+1+num,w)-pos;
51         if(pos[p]!=w)puts("Yes");
52         else if(query(rt[r],rt[l+k-2],1,num,p))puts("No");
53         else puts("Yes");
54     }
55     return 0;
56 }

原文地址:https://www.cnblogs.com/nbwzyzngyl/p/8438363.html

时间: 2024-08-27 17:26:51

BZOJ3207 花神的嘲讽计划的相关文章

BZOJ3207 花神的嘲讽计划Ⅰ

Description 背景 花神是神,一大癖好就是嘲讽大J,举例如下: “哎你傻不傻的![hqz:大笨J]” “这道题又被J屎过了!!” “J这程序怎么跑这么快!J要逆袭了!” …… 描述 这一天DJ在给吾等众蒟蒻讲题,花神在一边做题无聊,就跑到了一边跟吾等众蒟蒻一起听.以下是部分摘录: 1. “J你在讲什么!” “我在讲XXX!” “哎你傻不傻的!这么麻烦,直接XXX再XXX就好了!” “……” 2. “J你XXX讲过了没?” “……” “那个都不讲你就讲这个了?哎你傻不傻的!” “……”

[BZOJ3207] 花神的嘲讽计划Ⅰ (主席树)

Description 背景 花神是神,一大癖好就是嘲讽大J,举例如下: “哎你傻不傻的![hqz:大笨J]” “这道题又被J屎过了!!” “J这程序怎么跑这么快!J要逆袭了!” …… 描述 这一天DJ在给吾等众蒟蒻讲题,花神在一边做题无聊,就跑到了一边跟吾等众蒟蒻一起听.以下是部分摘录: 1. “J你在讲什么!” “我在讲XXX!” “哎你傻不傻的!这么麻烦,直接XXX再XXX就好了!” “……” 2. “J你XXX讲过了没?” “……” “那个都不讲你就讲这个了?哎你傻不傻的!” “……”

【字符串哈希】【莫队算法】bzoj3207 花神的嘲讽计划Ⅰ

既然询问的长度是确定的,那么我们可以将所有长度为K的字串弄个哈希值出来,这样字串存在性=>哈希值存在性. 自然上溢哈希,base=107比较不错. 序列长度n=>n-K+1 询问区间[x,y]=>[x,y-K+1] 注意特判x是否>y-K+1 然后我们注意到没有修改,于是将哈希值离散化后,莫队大法好. #include<cstdio> #include<cmath> #include<algorithm> using namespace std;

bzoj3207: 花神的嘲讽计划Ⅰ hash+stl

显然hash,然后stl随便搞. #include<bits/stdc++.h> #define N 100005 using namespace std; typedef unsigned long long ull; map<ull,vector<int> >q; int n,m,k,s,t,v,a[N]; int main(){ scanf("%d%d%d",&n,&m,&k); for(int i=1;i<=n;

[bzoj3207]花神的嘲讽计划Ⅰ[可持久化线段树,hash]

将每k个数字求一个哈希值,存入可持久化线段树,直接查询即可 1 #include <iostream> 2 #include <algorithm> 3 #include <cstdio> 4 #include <cstdlib> 5 #include <cstring> 6 #include <cmath> 7 #include <ctime> 8 9 using namespace std; 10 11 #define

【BZOJ3207】花神的嘲讽计划Ⅰ Hash+主席树

[BZOJ3207]花神的嘲讽计划Ⅰ Description 背景 花神是神,一大癖好就是嘲讽大J,举例如下: “哎你傻不傻的![hqz:大笨J]” “这道题又被J屎过了!!” “J这程序怎么跑这么快!J要逆袭了!” …… 描述 这一天DJ在给吾等众蒟蒻讲题,花神在一边做题无聊,就跑到了一边跟吾等众蒟蒻一起听.以下是部分摘录: 1. “J你在讲什么!” “我在讲XXX!” “哎你傻不傻的!这么麻烦,直接XXX再XXX就好了!” “……” 2. “J你XXX讲过了没?” “……” “那个都不讲你就

【BZOJ3207】花神的嘲讽计划I 可持久化线段树/莫队

看到题目就可以想到hash 然后很自然的联想到可持久化权值线段树 WA:base取了偶数 这道题还可以用莫队做,比线段树快一些 可持久化线段树: 1 #include<bits/stdc++.h> 2 #define ll long long 3 #define uint unsigned int 4 #define ull unsigned long long 5 #define inf 4294967295 6 #define N 100005 7 #define M 100005 8 #

BZOJ 3207: 花神的嘲讽计划Ⅰ( hash + 可持久化线段树 )

O(NK)暴力搞出所有子串的哈希值, 然后就对哈希值离散化建权值线段树, 就是主席树的经典做法了.总时间复杂度O(NK+(N+Q)logN) -------------------------------------------------------------------------- #include<cstdio> #include<algorithm> #include<cstring> #include<cctype> using namespa

【BZOJ】【1046】【HAOI2007】花神的嘲讽计划 I

字符串Hash+可持久化线段树 好神奇的转化…… 蒟蒻一开始还去想AC自动机去了……然而由于a[i]的范围是小于等于n,怎么也想不出一个时间复杂度合理的方法 膜拜了题解0.0原来是字符串Hash! 首先每个询问的长度都是固定的!K!那么我们就可以看作一个长度为K的数!然后就可以利用字符串Hash将一个长度为n的数列转化成一个长度为n-k+1的数列!查询一个特定的序列在一个区间中是否出现过,就变成了在一段区间中,某个数是否出现过!然后就可以用可持久化线段树来维护了…… 长度为K这个条件好神啊……居