zoukankan      html  css  js  c++  java
  • bzoj3809 -- 莫队+分块

    题目大意:

    给出一个序列和m个询问,每个询问求[l,r]中权值∈[a,b]的权值的种类数

    由于询问是离线的,考虑莫队。显然可以用修改和查询为O(log2n)的树状数组维护权值种类数,但这种做法的总时间复杂度是O(n*sqrt(n)*log2m),可能会TLE。

    注意到总共有O(m)个查询、O(n*sqrt(n))个修改,所以可以使用O(sqrt(n))查询、O(1)修改的分块。总时间复杂度为O(m*sqrt(n)+n*sqrt(n))

    代码:

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<cmath>
     5 #include<algorithm>
     6 using namespace std;
     7 inline char nc(){
     8     static char buf[100000],*p1=buf,*p2=buf;
     9     if(p1==p2){
    10         p2=(p1=buf)+fread(buf,1,100000,stdin);
    11         if(p1==p2)return EOF;
    12     }
    13     return *p1++;
    14 }
    15 inline void Read(int& x){
    16     char c=nc();
    17     for(;c<'0'||c>'9';c=nc());
    18     for(x=0;c>='0'&&c<='9';x=(x<<3)+(x<<1)+c-48,c=nc());
    19 }
    20 #define N 100010
    21 #define M 1000010
    22 #define lowbit(x) x&-x
    23 struct Node{
    24     int l,r,a,b,F;
    25 }A[M];
    26 int i,j,l,r,k,n,m,c[N],a[N],S,Ans[M],Ma,Sum[350],Cnt[N],b[N];
    27 inline bool Cmp(Node x,Node y){
    28     return b[x.l]<b[y.l]||(b[x.l]==b[y.l]&&x.r<y.r);
    29 }
    30 inline void U(int x){
    31     Cnt[x]++;if(Cnt[x]==1)Sum[b[x]]++;
    32 }
    33 inline void D(int x){
    34     Cnt[x]--;if(Cnt[x]==0)Sum[b[x]]--;
    35 }
    36 inline int Query(int x,int y){
    37     int Ans=0;
    38     if(b[y]-b[x]<=1){
    39         for(;x<=y;x++)Ans+=(Cnt[x]?1:0);
    40         return Ans;
    41     }
    42     for(int i=b[x]+1;i<b[y];i++)Ans+=Sum[i];
    43     for(int i=x;b[i]==b[x];i++)Ans+=(Cnt[i]?1:0);
    44     for(int i=y;b[i]==b[y];i--)Ans+=(Cnt[i]?1:0);
    45     return Ans;
    46 }
    47 int s[20];
    48 int Len;
    49 inline void Print(int x){
    50     if(x==0){putchar(48);putchar('
    ');return;}
    51     for(Len=0;x;x/=10)s[++Len]=x%10;
    52     for(;Len;)putchar(s[Len--]+48);
    53     putchar('
    ');
    54 }
    55 int main()
    56 {
    57     Read(n);Read(m);
    58     S=sqrt((double)n);
    59     for(i=1;i<=n;i++)b[i]=(i-1)/S+1;
    60     for(i=1;i<=n;i++){
    61         Read(a[i]);
    62         if(a[i]>Ma)Ma=a[i];
    63     }
    64     for(i=1;i<=m;i++){
    65         Read(A[i].l);Read(A[i].r);Read(A[i].a);Read(A[i].b);
    66         A[i].F=i;
    67     }
    68     sort(A+1,A+m+1,Cmp);
    69     for(i=1,l=1,r=0;i<=m;i++){
    70         while(A[i].r>r)U(a[++r]);
    71         while(A[i].l>l)D(a[l++]);
    72         while(A[i].r<r)D(a[r--]);
    73         while(A[i].l<l)U(a[--l]);
    74         Ans[A[i].F]=Query(A[i].a,A[i].b);
    75     }
    76     for(i=1;i<=m;i++)Print(Ans[i]);
    77 } 
    bzoj3809
  • 相关阅读:
    [转]调试winlogon
    [转]整理一份我对Windows文件系统过滤驱动的sFilter工程代码的详细说明
    [转]在内核调试会话中设置用户态断点
    用Windbg调试GINA
    [转]文件过滤驱动开发
    [转]NDIS中间层驱动开发在Win7系统下和Windows XP系统下的区别
    [转]windbg下在kd模式也可以调试用户模式程序
    ProgressDialog多了一个外边框
    Dx trouble processing "java/nio/CharBuffer.class":
    ImageView图片重叠问题
  • 原文地址:https://www.cnblogs.com/gjghfd/p/6438639.html
Copyright © 2011-2022 走看看