• bzoj 3809 Gty的二逼妹子序列 —— 莫队+分块


    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3809

    据说一开始应该想到莫队+树状数组,然而我想的却是莫队+权值线段树...

    如果用权值线段树,则修改和查询都是 O(logn),总复杂度 O(n√nlogn),艰难...(而且仔细一看空间有点卡?)

    看了TJ,才发现权值也可以分块,则查询 O(√n) 但修改 O(1),就可以过咯~

    代码如下:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<cmath>
    using namespace std;
    int const xn=1e5+5,xm=1e6+5;
    int n,m,a[xn],blk[xn],c[xn],s[400],ans[xm];
    struct N{int l,r,a,b,id;}q[xm];
    bool cmp(N x,N y){return blk[x.l]==blk[y.l]?x.r<y.r:blk[x.l]<blk[y.l];}
    int rd()
    {
      int ret=0,f=1; char ch=getchar();
      while(ch<'0'||ch>'9'){if(ch=='-')f=0; ch=getchar();}
      while(ch>='0'&&ch<='9')ret=(ret<<3)+(ret<<1)+ch-'0',ch=getchar();
      return f?ret:-ret;
    }
    int query(int a,int b)
    {
      int ret=0;
      int x=blk[a],y=blk[b];
      for(int i=x+1;i<y;i++)ret+=s[i];
      if(x==y)
        {
          for(int i=a;i<=b;i++) if(c[i])ret++;
          return ret;
        }
      for(int i=a;blk[i]==blk[a];i++) if(c[i])ret++;
      for(int i=b;blk[i]==blk[b];i--) if(c[i])ret++;
      return ret;
    }
    void add(int ps)
    {
      int x=a[ps];
      if(!c[x])s[blk[x]]++; c[x]++;
    }
    void del(int ps)
    {
      int x=a[ps];
      if(c[x]==1)s[blk[x]]--; c[x]--;
    }
    int main()
    {
      n=rd(); m=rd(); int bs=sqrt(n);
      for(int i=1;i<=n;i++)a[i]=rd(),blk[i]=(i-1)/bs+1;
      for(int i=1;i<=m;i++)q[i].l=rd(),q[i].r=rd(),q[i].a=rd(),q[i].b=rd(),q[i].id=i;
      sort(q+1,q+m+1,cmp);
      add(1); int l=1,r=1;
      for(int i=1;i<=m;i++)
        {
          int ql=q[i].l,qr=q[i].r;
          while(l<ql)del(l),l++;
          while(l>ql)l--,add(l);
          while(r<qr)r++,add(r);
          while(r>qr)del(r),r--;
          ans[q[i].id]=query(q[i].a,q[i].b);
        }
      for(int i=1;i<=m;i++)printf("%d
    ",ans[i]);
      return 0;
    }
  • 相关阅读:
    IfcExternalReference
    IOException
    IfcExternalInformation
    IfcConnectionGeometry
    netty系列之:netty初探
    netty系列之:Event、Handler和Pipeline
    netty系列之:netty中的Channel详解
    防踩坑日记(一)(ES)elasticsearch中的对象QueryBuilder同时使用should和must查询不成功
    netty系列之:netty中的ByteBuf详解
    netty系列之:netty架构概述
  • 原文地址:https://www.cnblogs.com/Zinn/p/9745732.html
Copyright © 2020-2023  润新知