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 }
  • 相关阅读:
    Firemonkey 控件设定字型属性及颜色
    ListView 使用 LiveBindings 显示超过 200 条记录
    Firemonkey ListView 获取项目右方「>」(Accessory) 事件
    XE7 Update 1 选 iOS 8.1 SDK 发布 iPhone 3GS 实机测试
    Firemonkey Bitmap 设定像素颜色 Pixel
    Firemonkey 移动平台 Form 显示使用 ShowModal 范例
    XE7 提交 App(iOS 8)提示「does not contain the correct beta entitlement」问题修复
    XE7 Android 中使用 MessageDlg 范例
    导出 XE6 预设 Android Style (*.style) 档案
    修正 Memo 設定為 ReadOnly 後, 無法有複製的功能
  • 原文地址:https://www.cnblogs.com/fengzhiyuan/p/7656243.html
Copyright © 2011-2022 走看看