2 条题解
-
0
#include<bits/stdc++.h> using namespace std; #define inf 18446744073709551615UL //2^64-1 typedef unsigned long long ULL; const int N=2e5+10; const ULL base=131; struct node{int ls,rs,siz;}tr[N*40];int trlen,rt[N]; ULL f[N],a[N]; void insert(int pre,int &now,ULL l,ULL r,ULL val) { now=++trlen; tr[now]=tr[pre]; tr[now].siz=tr[pre].siz+1; if(l==r) return; ULL mid=(l>>1)+(r>>1);if((l&1)&&(r&1)) mid++; if(val<=mid) insert(tr[pre].ls,tr[now].ls,l ,mid,val); else insert(tr[pre].rs,tr[now].rs,mid+1,r ,val); } int query(int pre,int now,ULL l,ULL r,ULL val) { if(now==pre) return 0; if(l==r) return tr[now].siz-tr[pre].siz; ULL mid=(l>>1)+(r>>1);if((l&1)&&(r&1)) mid++; if(val<=mid) return query(tr[pre].ls,tr[now].ls,l, mid,val); else return query(tr[pre].rs,tr[now].rs,mid+1,r,val); } int main() { int n,m,k;scanf("%d%d%d",&n,&m,&k); for(int i=1;i<=n;i++)scanf("%lu",&a[i]); f[0]=0;for(int i=1;i<=n;i++)f[i]=f[i-1]*base+a[i]; ULL s=1;for(int i=1;i<=k;i++) s=s*base; trlen=0; for(int i=1;i<=n-k+1;i++) { ULL val=f[i+k-1]-f[i-1]*s; insert(rt[i-1],rt[i],0,inf,val); } for(int i=1,l,r;i<=m;i++) { scanf("%d%d",&l,&r); r=r-k+1; ULL val=0;for(int i=1,x;i<=k;i++)scanf("%d",&x),val=val*base+x; if(query(rt[l-1],rt[r],0,inf,val)) printf("No\n"); else printf("Yes\n"); } return 0; } -
0
#include<bits/stdc++.h> using namespace std; #define inf 18446744073709551615UL //2^64-1 typedef unsigned long long ULL; const int N=2e5+10; const ULL base=131; struct node{int ls,rs,siz;}tr[N*40];int trlen,rt[N]; ULL f[N],a[N]; void insert(int pre,int &now,ULL l,ULL r,ULL val) { now=++trlen; tr[now]=tr[pre]; tr[now].siz=tr[pre].siz+1; if(l==r) return; ULL mid=(l>>1)+(r>>1);if((l&1)&&(r&1)) mid++; if(val<=mid) insert(tr[pre].ls,tr[now].ls,l ,mid,val); else insert(tr[pre].rs,tr[now].rs,mid+1,r ,val); } int query(int pre,int now,ULL l,ULL r,ULL val) { if(now==pre) return 0; if(l==r) return tr[now].siz-tr[pre].siz; ULL mid=(l>>1)+(r>>1);if((l&1)&&(r&1)) mid++; if(val<=mid) return query(tr[pre].ls,tr[now].ls,l, mid,val); else return query(tr[pre].rs,tr[now].rs,mid+1,r,val); } int main() { int n,m,k;scanf("%d%d%d",&n,&m,&k); for(int i=1;i<=n;i++)scanf("%lu",&a[i]); f[0]=0;for(int i=1;i<=n;i++)f[i]=f[i-1]*base+a[i]; ULL s=1;for(int i=1;i<=k;i++) s=s*base; trlen=0; for(int i=1;i<=n-k+1;i++) { ULL val=f[i+k-1]-f[i-1]*s; insert(rt[i-1],rt[i],0,inf,val); } for(int i=1,l,r;i<=m;i++) { scanf("%d%d",&l,&r); r=r-k+1; ULL val=0;for(int i=1,x;i<=k;i++)scanf("%d",&x),val=val*base+x; if(query(rt[l-1],rt[r],0,inf,val)) printf("No\n"); else printf("Yes\n"); } return 0; }
- 1
信息
- ID
- 4872
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 8
- 标签
- 递交数
- 101
- 已通过
- 14
- 上传者