Description
背景
花神是神,一大癖好就是嘲讽大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尴尬【说不出话来】。
Solution
题面一大坨
可以想到哈希一串来O(1)判断,主席树区间插入查询就ojbk
其实第一眼想到的是离线莫队,据说这样反而比较快?!
Code
#include <stdio.h>
#include <string.h>
#include <algorithm>
#define rep(i,st,ed) for (int i=st;i<=ed;++i)
typedef long long LL;
const LL HASH=998244353;
const int N=2000005;
struct treeNode {int l,r,v;} t[N];
int a[N],root[N],cnt;
int qx[N],qy[N];
LL sum[N],q[N],b[N];
void modify(int &now,int pre,int tl,int tr,int x,int v) {
t[now=++cnt]=t[pre]; t[now].v+=v;
if (tl==tr) return ;
int mid=(tl+tr)>>1;
if (x<=mid) modify(t[now].l,t[pre].l,tl,mid,x,v);
else modify(t[now].r,t[pre].r,mid+1,tr,x,v);
}
int query(int now,int pre,int tl,int tr,int x) {
// if (!pre) return t[now].v;
if (tl==tr) return (t[now].v-t[pre].v)!=0;
int mid=(tl+tr)>>1;
if (x<=mid) return query(t[now].l,t[pre].l,tl,mid,x);
else return query(t[now].r,t[pre].r,mid+1,tr,x);
}
int main(void) {
freopen("data.in","r",stdin);
int n,m,k; scanf("%d%d%d",&n,&m,&k);
int tot=0;
rep(i,1,n) scanf("%d",&a[i]);
rep(i,1,n-k+1) {
rep(j,i,i+k-1) {
sum[i]=sum[i]*HASH+(LL)a[j];
}
b[++tot]=sum[i];
}
rep(i,1,m) {
scanf("%d%d",&qx[i],&qy[i]);
rep(j,1,k) {
LL w; scanf("%lld",&w);
q[i]=q[i]*HASH+w;
}
b[++tot]=q[i];
}
std:: sort(b+1,b+tot+1); int size=std:: unique(b+1,b+tot+1)-b-1;
rep(i,1,n-k+1) sum[i]=std:: lower_bound(b+1,b+size+1,sum[i])-b;
rep(i,1,m) q[i]=std:: lower_bound(b+1,b+size+1,q[i])-b;
root[0]=cnt=1;
rep(i,1,n-k+1) modify(root[i],root[i-1],1,size,sum[i],1);
rep(i,1,m) {
if (query(root[qy[i]-k+1],root[qx[i]-1],1,size,(int)q[i])) puts("No");
else puts("Yes");
}
return 0;
}

本文介绍了一个算法竞赛题目,通过使用哈希和主席树的数据结构解决了一个关于讲课内容与嘲讽时机匹配的问题。该解决方案巧妙地利用了哈希一串来实现O(1)判断,并通过主席树进行区间插入查询。
642

被折叠的 条评论
为什么被折叠?



