zoukankan      html  css  js  c++  java
  • 【bzoj1878】[SDOI2009]HH的项链

    [SDOI2009]HH的项链

    Time Limit: 4 Sec  Memory Limit: 64 MB
    Submit: 4834  Solved: 2384
    [Submit][Status][Discuss]

    Description

    HH有一串由各种漂亮的贝壳组成的项链。HH相信不同的贝壳会带来好运,所以每次散步 完后,他都会随意取出一
    段贝壳,思考它们所表达的含义。HH不断地收集新的贝壳,因此他的项链变得越来越长。有一天,他突然提出了一
    个问题:某一段贝壳中,包含了多少种不同的贝壳?这个问题很难回答。。。因为项链实在是太长了。于是,他只
    好求助睿智的你,来解决这个问题。

    Input

    第一行:一个整数N,表示项链的长度。 
    第二行:N个整数,表示依次表示项链中贝壳的编号(编号为0到1000000之间的整数)。 
    第三行:一个整数M,表示HH询问的个数。 
    接下来M行:每行两个整数,L和R(1 ≤ L ≤ R ≤ N),表示询问的区间。
    N ≤ 50000,M ≤ 200000。

    Output

    M行,每行一个整数,依次表示询问对应的答案。

    Sample Input

    6
    1 2 3 4 3 5
    3
    1 2
    3 5
    2 6

    Sample Output

    2
    2
    4

    HINT

     

    Source

    题解:这道题目有更新的必要,就是求一段区间不同颜色数,因为询问是离线的,
    所以可以将询问l,r以l排序,来做,区间顺序下去就可以了。
    预处理next表示下一个与当前颜色相同的位置,如果区间l已经超过了当前节点,
    则它下一个节点加入树状数组中。
     1 #include<iostream>
     2 #include<cstdio>
     3 #include<algorithm>
     4 #include<cstring>
     5 #include<cmath>
     6 #define N 50007
     7 using namespace std;
     8 
     9 int n,m,mx;
    10 int a[N],next[N],t[N];
    11 int p[1000005];
    12 struct data{int l,r,id,ans;}q[200005];
    13 
    14 bool cmp1(data a,data b){return a.l==b.l?a.r<b.r:a.l<b.l;}
    15 bool cmp2(data a,data b){return a.id<b.id;}
    16 int lowbit(int x){return x&(-x);}
    17 void update(int x,int v){for(int i=x;i<=n;i+=lowbit(i)) t[i]+=v;}
    18 int ask(int x)
    19 {
    20     int tmp=0;
    21     for(int i=x;i>0;i-=lowbit(i))
    22         tmp+=t[i];
    23     return tmp;
    24 }
    25 int main()
    26 {
    27     scanf("%d",&n);
    28     for(int i=1;i<=n;i++)
    29         scanf("%d",&a[i]),mx=max(mx,a[i]);
    30     for(int i=n;i>=1;i--) next[i]=p[a[i]],p[a[i]]=i;
    31     for(int i=1;i<=mx;i++)
    32         if (p[i]) update(p[i],1);
    33     scanf("%d",&m);
    34     for(int i=1;i<=m;i++)
    35        scanf("%d%d",&q[i].l,&q[i].r),q[i].id=i;
    36     sort(q+1,q+m+1,cmp1);
    37     int l=1;
    38     for(int i=1;i<=m;i++)
    39     {
    40         while(l<q[i].l){if(next[l])    update(next[l],1); l++;}
    41         q[i].ans=ask(q[i].r)-ask(q[i].l-1);
    42     }
    43     sort(q+1,q+m+1,cmp2);
    44     for(int i=1;i<=m;i++) printf("%d
    ",q[i].ans);
    45 }
  • 相关阅读:
    Js实现页面跳转的几种方式
    android给View设置上下左右边框
    mac下安装tomcat
    Series.str方法
    loc() iloc() at() iat()函数
    sudo: pip:找不到命令
    杀死进程方法
    unique()与nunique()
    object数据类型
    set_index()与reset_index()函数
  • 原文地址:https://www.cnblogs.com/fengzhiyuan/p/7656243.html
Copyright © 2011-2022 走看看