• 【SDOI2009】HH的项链


    洛谷题目链接

    题意:

    给定一个长5w静态的序列,询问20w次,每次询问查找一个区间内的元素种类数


    染色问题神烦啊,最近刚会做,感觉都可以用统一的方法

    首先要算出与一个元素相同的最邻近的上一个元素的位置,这样的话只要求出区间内上一位置小于下限的就是元素种类数

    ——非常有道理的样子,但是第一次见肯定想不到

    于是实现了          颜色种类问题->范围内数的个数          的问题转化

    然后就简单了,交给权值主席树就好了

    算是第二道主席树练习题吧

    深井冰错误:构造权值线段树的时候忘记把0构造进去,MDZZ

     1 #include <cstdio>
     2 #define mid (l+r)/2
     3 struct node{int size,ls,rs;} t[4000000];
     4 int cnt=0,n,m,x,y,a[50001],p[50001],c[1000001],root[50001];
     5 int add(int now,int l,int r,int x)
     6 {
     7     int po=++cnt;
     8     t[po]=(node){t[now].size+1,(l<r && x<=mid)?add(t[now].ls,l,mid,x):t[now].ls,(l<r && x>mid)?add(t[now].rs,mid+1,r,x):t[now].rs};
     9     return po;
    10 }
    11 int que(int x,int y,int l,int r,int z)
    12 {
    13     if(l==r) return t[y].size-t[x].size;
    14     return (z<=mid)?que(t[x].ls,t[y].ls,l,mid,z):t[t[y].ls].size-t[t[x].ls].size+que(t[x].rs,t[y].rs,mid+1,r,z);
    15 }
    16 int main()
    17 {
    18     scanf("%d",&n);
    19     for(int i=1;i<=n;i++)
    20         scanf("%d",&a[i]),p[i]=c[a[i]],c[a[i]]=i,root[i]=add(root[i-1],0,n,p[i]);
    21     scanf("%d",&m);
    22     for(int i=1;i<=m;i++)
    23         scanf("%d%d",&x,&y),printf("%d
    ",que(root[x-1],root[y],0,n,x-1));
    24     return 0;
    25 }

    老板娘你还我代码风格!!!

  • 相关阅读:
    趣味算法:国王和100个囚犯(据说是腾讯的面试题)
    限制文本框的输入(兼容FF,IE)
    切换家里和公司网络的脚本
    onchange,onpropertychange,oninput的使用
    正则匹配html标记
    javascript清空数组的三种方法
    正则查找重复
    (正则)提取页面里的img标签
    javascript类型检测(转载)
    查看sqlserver信息
  • 原文地址:https://www.cnblogs.com/wanglichao/p/5674685.html
Copyright © 2020-2023  润新知