2 条题解

  • 0
    @ 2025-10-8 17:07:57
    #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
      @ 2025-10-8 17:07:50
      #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
      上传者