• bzoj3809 Gty的二逼妹子序列


    【bzoj3809】Gty的二逼妹子序列

    Description

    Autumn和Bakser又在研究Gty的妹子序列了!但他们遇到了一个难题。
    对于一段妹子们,他们想让你帮忙求出这之内美丽度∈[a,b]的妹子的美丽度的种类数。
    为了方便,我们规定妹子们的美丽度全都在[1,n]中。
    给定一个长度为n(1<=n<=100000)的正整数序列s(1<=si<=n),对于m(1<=m<=1000000)次询问“l,r,a,b”,每次输出sl…sr中,权值∈[a,b]的权值的种类数。

    Input

    第一行包括两个整数n,m(1<=n<=100000,1<=m<=1000000),表示数列s中的元素数和询问数。
    第二行包括n个整数s1…sn(1<=si<=n)。
    接下来m行,每行包括4个整数l,r,a,b(1<=l<=r<=n,1<=a<=b<=n),意义见题目描述。
    保证涉及的所有数在C++的int内。
    保证输入合法。

    Output

    对每个询问,单独输出一行,表示sl…sr中权值∈[a,b]的权值的种类数。

    Sample Input

    10 10
    4 4 5 1 4 1 5 1 2 1
    5 9 1 2
    3 4 7 9
    4 4 2 5
    2 3 4 7
    5 10 4 4
    3 9 1 1
    1 4 5 9
    8 9 3 3
    2 2 1 6
    8 9 1 4

    Sample Output

    2
    0
    0
    2
    1
    1
    1
    0
    1
    2

    HINT

    样例的部分解释:
    5 9 1 2
    子序列为4 1 5 1 2
    在[1,2]里的权值有1,1,2,有2种,因此答案为2。
    3 4 7 9
    子序列为5 1
    在[7,9]里的权值有5,有1种,因此答案为1。
    4 4 2 5
    子序列为1
    没有权值在[2,5]中的,因此答案为0。
    2 3 4 7
    子序列为4 5
    权值在[4,7]中的有4,5,因此答案为2。
    建议使用输入/输出优化。

    题解

      直接莫队+树状数组是不行的,会T飞︿( ̄︶ ̄)︿
     1 #include<cstdio>
     2 #include<cmath>
     3 #include<cstring>
     4 #include<iostream>
     5 #include<algorithm>
     6 
     7 #define N 100007
     8 #define M 1000007
     9 using namespace std;
    10 inline int read()
    11 {
    12     int x=0,f=1;char ch=getchar();
    13     while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
    14     while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    15     return x*f;
    16 }
    17 
    18 int n,m,blo,cnt;
    19 int a[N],ans[M];
    20 int bl[N],l[N],r[N];
    21 int c[N],bloans[N];
    22 struct Node
    23 {
    24     int l,r,a,b;
    25     int id;
    26 }res[M];
    27 
    28 bool operator<(Node a,Node b)
    29 {
    30     if(bl[a.l]!=bl[b.l])return a.l<b.l;
    31     return a.r<b.r;
    32 }
    33 int query(int x,int y)
    34 {
    35     int tmp=0;
    36     int L=bl[x],R=bl[y];
    37     for(int i=L+1;i<R;i++)
    38         tmp+=bloans[i];
    39     if(L==R)for(int i=x;i<=y;i++)if(c[i])tmp++;
    40     else 
    41     {
    42         for(int i=x;i<=r[L];i++)
    43             if(c[i])tmp++;
    44         for(int i=l[R];i<=y;i++)
    45             if(c[i])tmp++;
    46     }
    47     return tmp;
    48 }
    49 void del(int x)
    50 {
    51        c[x]--;
    52     if(c[x]==0)bloans[bl[x]]--;
    53 }
    54 void add(int x)
    55 {
    56     c[x]++;
    57     if(c[x]==1)bloans[bl[x]]++;
    58 }
    59 void solve()
    60 {
    61     for(int i=1,l=1,r=0;i<=m;i++)
    62     {
    63         for (;r<res[i].r;r++)add(a[r+1]);
    64         for (;r>res[i].r;r--)del(a[r]);
    65         for (;l<res[i].l;l++)del(a[l]);
    66         for (;l>res[i].l;l--)add(a[l-1]);
    67         ans[res[i].id]=query(res[i].a,res[i].b);
    68     }
    69 }
    70 int main()
    71 {
    72     freopen("fzy.in","r",stdin);
    73     freopen("1.out","w",stdout);
    74     
    75     n=read();m=read();blo=sqrt(n/2);
    76     cnt=n/blo+n%blo!=0;
    77     for(int i=1;i<=n;i++)bl[i]=(i-1)/blo+1;
    78     for(int i=1;i<=n;i++)
    79     {
    80         r[bl[i]]=i;
    81         if(!l[bl[i]])l[bl[i]]=i;
    82     }
    83     for(int i=1;i<=n;i++)
    84         a[i]=read();
    85     for(int i=1;i<=m;i++)
    86         res[i].l=read(),res[i].r=read(),res[i].a=read(),res[i].b=read(),res[i].id=i;
    87     sort(res+1,res+m+1);
    88     solve();
    89     for(int i=1;i<=m;i++)
    90         printf("%d
    ",ans[i]);
    91 }

    T飞代码

    所以需要权值分块,这个很优秀,保证了修改O(1),询问log n

     1 #include<cstdio>
     2 #include<cmath>
     3 #include<cstring>
     4 #include<iostream>
     5 #include<algorithm>
     6 
     7 #define N 100007
     8 #define M 1000007
     9 using namespace std;
    10 inline int read()
    11 {
    12     int x=0,f=1;char ch=getchar();
    13     while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
    14     while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    15     return x*f;
    16 }
    17 
    18 int n,m,blo,cnt;
    19 int a[N],ans[M];
    20 int bl[N],l[N],r[N];
    21 int c[N],bloans[N];
    22 struct Node
    23 {
    24     int l,r,a,b;
    25     int id;
    26 }res[M];
    27 
    28 bool operator<(Node a,Node b)
    29 {
    30     if(bl[a.l]!=bl[b.l])return a.l<b.l;
    31     return a.r<b.r;
    32 }
    33 int query(int x,int y)
    34 {
    35     int tmp=0;
    36     int L=bl[x],R=bl[y];
    37     for(int i=L+1;i<R;i++)
    38         tmp+=bloans[i];
    39     if(L==R){for(int i=x;i<=y;i++)if(c[i])tmp++;}
    40     else 
    41     {
    42         for(int i=x;i<=r[L];i++)
    43             if(c[i])tmp++;
    44         for(int i=l[R];i<=y;i++)
    45             if(c[i])tmp++;
    46     }
    47     return tmp;
    48 }
    49 void del(int x)
    50 {
    51        c[x]--;
    52     if(c[x]==0)bloans[bl[x]]--;
    53 }
    54 void add(int x)
    55 {
    56     c[x]++;
    57     if(c[x]==1)bloans[bl[x]]++;
    58 }
    59 void solve()
    60 {
    61     for(int i=1,l=1,r=0;i<=m;i++)
    62     {
    63         for (;r<res[i].r;r++)add(a[r+1]);
    64         for (;r>res[i].r;r--)del(a[r]);
    65         for (;l<res[i].l;l++)del(a[l]);
    66         for (;l>res[i].l;l--)add(a[l-1]);
    67         ans[res[i].id]=query(res[i].a,res[i].b);
    68     }
    69 }
    70 int main()
    71 {
    72 //    freopen("fzy.in","r",stdin);
    73 //    freopen("1.out","w",stdout);
    74     
    75     n=read();m=read();blo=sqrt(n/2);
    76     cnt=n/blo+n%blo!=0;
    77     for(int i=1;i<=n;i++)bl[i]=(i-1)/blo+1;
    78     for(int i=1;i<=n;i++)
    79     {
    80         r[bl[i]]=i;
    81         if(!l[bl[i]])l[bl[i]]=i;
    82     }
    83     for(int i=1;i<=n;i++)
    84         a[i]=read();
    85     for(int i=1;i<=m;i++)
    86         res[i].l=read(),res[i].r=read(),res[i].a=read(),res[i].b=read(),res[i].id=i;
    87     sort(res+1,res+m+1);
    88     solve();
    89     for(int i=1;i<=m;i++)
    90         printf("%d
    ",ans[i]);
    91 }
  • 相关阅读:
    [PTA练习] 愿天下有情人都是失散多年的兄妹(25分)
    sql server远程连接非1433端口
    java把double转化为long型
    StringUtils工具类
    JfreeChart折线图
    Log4j配置
    Ibatis,Spring整合(注解方式注入)
    Spring中的autowire属性(转)
    MyBatis3入门样例
    struts2 ibatis Spring系统架构图
  • 原文地址:https://www.cnblogs.com/fengzhiyuan/p/8142907.html
Copyright © 2020-2023  润新知