BZOJ3207 花神的嘲讽计划

Posted nbwzyzngyl

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 }

 

以上是关于BZOJ3207 花神的嘲讽计划的主要内容,如果未能解决你的问题,请参考以下文章

BZOJ3207 花神的嘲讽计划

BZOJ3207 花神的嘲讽计划Ⅰ

bzoj 3207 花神的嘲讽计划Ⅰ

BZOJ3207: 花神的嘲讽计划Ⅰ

bzoj 3207: 花神的嘲讽计划Ⅰ

BZOJ_3207_花神的嘲讽计划1_(Hash+主席树)