zoukankan      html  css  js  c++  java
  • P1972 [SDOI2009]HH的项链 线段树

      

    题目背景

    题目描述

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

    输入输出格式

    输入格式:

    第一行:一个整数N,表示项链的长度。

    第二行:N 个整数,表示依次表示项链中贝壳的编号(编号为0 到1000000 之间的整数)。

    第三行:一个整数M,表示HH 询问的个数。

    接下来M 行:每行两个整数,L 和R(1 ≤ L ≤ R ≤ N),表示询问的区间。

    输出格式:

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

    输入输出样例

    输入样例#1: 复制
    6
    1 2 3 4 3 5
    3
    1 2
    3 5
    2 6
    
    输出样例#1: 复制
    2
    2
    4

    说明

    数据范围:

    对于100%的数据,N <= 500000,M <= 500000。

    采用离线做法  

    以R为关键字升序排序

    当某个区间存在多个相同的数字时  只需要维护最右边那个  其他的删掉  思考一下~

    代码很简单

    #include<bits/stdc++.h>
    using namespace std;
    //input by bxd
    #define rep(i,a,b) for(int i=(a);i<=(b);i++)
    #define repp(i,a,b) for(int i=(a);i>=(b);--i)
    #define RI(n) scanf("%d",&(n))
    #define RII(n,m) scanf("%d%d",&n,&m)
    #define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)
    #define RS(s) scanf("%s",s);
    #define ll long long
    #define pb push_back
    #define REP(i,N)  for(int i=0;i<(N);i++)
    #define CLR(A,v)  memset(A,v,sizeof A)
    //////////////////////////////////
    #define inf 0x3f3f3f3f
    #define lson l,m,pos<<1
    #define rson m+1,r,pos<<1|1
    const int N=1000000+5;
    int c[N],n;
    int lowbit(int x)
    {
        return x&(-x);
    }
    void add(int x,int v)
    {
        for(int i=x;i<=n;i+=lowbit(i))
            c[i]+=v;
    }
    int sum(int x)
    {
        int ans=0;
        for(int i=x;i>0;i-=lowbit(i))
            ans+=c[i];
        return ans;
    }
    struct node
    {
        int L,R;
        int id;
    }s[N];
    int ans[N];
    bool cmp(node a,node b)
    {
        return a.R<b.R;
    }
    int a[N];
    int vis[N];
    int main()
    {
    
        RI(n);
        rep(i,1,n)
        RI(a[i]);
        int m;
        RI(m);
        rep(i,1,m)
        {
            RII(s[i].L,s[i].R);s[i].id=i;
        }
        sort(s+1,s+1+m,cmp);
    
        int nex=1;
        for(int i=1;i<=m;i++)
        {
            rep(j,nex,s[i].R)
            {
               if(vis[ a[j] ])add(vis[a[j]],-1);
               vis[ a[j] ]=j;
               add(j,1);
            }
            nex=s[i].R+1;
            ans[ s[i].id ]=sum( s[i].R )-sum( s[i].L-1 );
        }
        rep(i,1,m)
        cout<<ans[i]<<endl;
    }
    View Code
  • 相关阅读:
    python--网络通信协议
    python--网络编程之socket
    python--内置函数03
    在Mapper中sql语句字段与实体类属性名字之间的关系
    网站引入QQ登录
    子类继承父类时构造函数的相关问题
    java中字符串比较的问题
    Mybatis中一对多与多对一的配置
    Spring中的依赖注入(1)
    P1618 三连击(升级版)
  • 原文地址:https://www.cnblogs.com/bxd123/p/10806215.html
Copyright © 2011-2022 走看看