• P1972 [SDOI2009] HH的项链


    题目描述

    HH 有一串由各种漂亮的贝壳组成的项链。HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含义。HH 不断地收集新的贝壳,因此,他的项链变得越来越长。

    有一天,他突然提出了一个问题:某一段贝壳中,包含了多少种不同的贝壳?这个问题很难回答…… 因为项链实在是太长了。于是,他只好求助睿智的你,来解决这个问题。

    输入格式

    一行一个正整数 n,表示项链长度。
    第二行 nn 个正整数 ai​,表示项链中第 ii 个贝壳的种类。

    第三行一个整数 m,表示 HH 询问的个数。
    接下来 m 行,每行两个整数 l,rl,r,表示询问的区间。

    输出格式

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

    输入输出样例

    输入 #1复制

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

    输出 #1复制

    2
    2
    4

    说明/提示

    【数据范围】

    对于20% 的数据,1≤n,m≤5000;
    对于 40% 的数据,1≤n,m≤10^5;
    对于60% 的数据,1≤n,m≤5×10^5;
    对于 100% 的数据,1≤n,m,ai​≤10^6,1≤l≤r≤n。

    本题可能需要较快的读入方式,最大数据点读入数据约 20MB

    1. #include<bits/stdc++.h>
    2. using namespace std;
    3. const int MAXN=2000005;
    4. int pre[MAXN],tot,a[MAXN],m,c[MAXN],n,l,r,ans[MAXN];
    5. struct node
    6. {
    7. int id;
    8. int pos;
    9. };
    10. vector<node>q[MAXN];
    11. int lowbit(int x)
    12. {
    13. return x&-x;
    14. }
    15. void change(int x,int y)
    16. {
    17. while(x<=n)
    18. {
    19. c[x]+=y;
    20. x+=lowbit(x);
    21. }
    22. return;
    23. }
    24. int sum(int x)
    25. {
    26. int ans=0;
    27. while(x)
    28. {
    29. ans+=c[x];
    30. x-=lowbit(x);
    31. }
    32. return ans;
    33. }
    34. int main()
    35. {
    36. scanf("%d",&n);
    37. for(int i=1;i<=n;++i)
    38. {
    39. scanf("%d",&a[i]);
    40. }
    41. scanf("%d",&m);
    42. for(int i=1;i<=m;++i)
    43. {
    44. scanf("%d %d",&l,&r);
    45. q[r].push_back(node{i,l});
    46. }
    47. for(int i=1;i<=n;++i)
    48. {
    49. if(pre[a[i]])
    50. {
    51. change(pre[a[i]],-1);
    52. change(i,1);
    53. pre[a[i]]=i;
    54. }
    55. else
    56. {
    57. change(i,1);
    58. pre[a[i]]=i;
    59. }
    60. for(auto &j:q[i])
    61. {
    62. ans[j.id]=sum(i)-sum(j.pos-1);
    63. }
    64. }
    65. for(int i=1;i<=m;++i)
    66. {
    67. printf("%d\n",ans[i]);
    68. }
    69. return 0;
    70. }

     

    1. #include<bits/stdc++.h>
    2. using namespace std;
    3. const int MAXN=2000005;
    4. int pre[MAXN],tot,a[MAXN],m,c[MAXN],n,l,r,ans[MAXN];
    5. struct query_node
    6. {
    7. int id;
    8. int pos;
    9. query_node(){}
    10. query_node(int _id,int _pos)
    11. {
    12. id=_id;
    13. pos=_pos;
    14. }
    15. };
    16. vector<query_node>q[MAXN];
    17. int lowbit(int x)
    18. {
    19. return x&-x;
    20. }
    21. void change(int x,int y)
    22. {
    23. while(x<=n)
    24. {
    25. c[x]+=y;
    26. x+=lowbit(x);
    27. }
    28. return;
    29. }
    30. int sum(int x)
    31. {
    32. int ans=0;
    33. while(x)
    34. {
    35. ans+=c[x];
    36. x-=lowbit(x);
    37. }
    38. return ans;
    39. }
    40. int main()
    41. {
    42. scanf("%d",&n);
    43. for(int i=1;i<=n;++i)
    44. {
    45. scanf("%d",&a[i]);
    46. }
    47. scanf("%d",&m);
    48. for(int i=1;i<=m;++i)
    49. {
    50. scanf("%d %d",&l,&r);
    51. q[r].push_back(query_node(i,l));
    52. }
    53. for(int i=1;i<=n;++i)
    54. {
    55. if(pre[a[i]])
    56. {
    57. change(pre[a[i]],-1);
    58. change(i,1);
    59. pre[a[i]]=i;
    60. }
    61. else
    62. {
    63. change(i,1);
    64. pre[a[i]]=i;
    65. }
    66. for(auto &j:q[i])
    67. {
    68. ans[j.id]=sum(i)-sum(j.pos-1);
    69. }
    70. }
    71. for(int i=1;i<=m;++i)
    72. {
    73. printf("%d\n",ans[i]);
    74. }
    75. return 0;
    76. }

     

  • 相关阅读:
    推荐一个日历转换开源工具库,支持C#、Java、PHP等主流的语言
    paddleocr检测模型训练记录
    【JVM篇】有哪些垃圾回收算法
    批量获取CSDN文章对文章质量分进行检测,有助于优化文章质量
    Vue3中使用v-model高级用法参数绑定传值
    Kaldi语音识别工具编译问题记录(踩坑记录)
    未来的应用为什么需要安全沙箱
    Arrays.asList 和 null 类型
    redis缓存三大问题及内存满了该怎么办
    重新认识Java中的死锁问题
  • 原文地址:https://blog.csdn.net/m0_61949623/article/details/126520050