zoukankan      html  css  js  c++  java
  • HH的项链&采花

    1878: [SDOI2009]HH的项链

    Time Limit: 4 Sec  Memory Limit: 64 MB
    Submit: 8504  Solved: 4097
    [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
    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int maxn=1e6+10;
    int n,c,m;
    int color[maxn],nx[maxn],id[maxn];
    struct BIT{
        int c[maxn],tot;
        inline void init(int t){
            tot=t;
            //printf("tot = %d
    ",tot);
            memset(c,0,sizeof(c));
        }
        inline int lowbit(int x){
            return x&(-x);
        }
        inline void add(int pos,int val){
            while(pos<=tot){
                c[pos]+=val;
                pos+=lowbit(pos);
            }
        }
        inline int query(int pos){
            int res=0;
            while(pos){
                res+=c[pos];
                pos-=lowbit(pos);
            }
            return res;
        }
    }f;
    struct question{
        int l,r,pos,ans;
        bool operator<(const question &s)const {
            if(l==s.l){
                return r<s.r;
            }
            return l<s.l;
        }
    }e[maxn];
    bool cmp(question s,question t){
        return s.pos<t.pos;
    }
    int main() {
        //freopen("1.txt","r",stdin);
        scanf("%d%d%d",&n,&c,&m);
        for(register int i=1;i<=n;++i){
            scanf("%d",&color[i]);
        }
        for(register int i=n;i>=1;--i){
            nx[i]=id[color[i]];
            id[color[i]]=i;
        }
    //    for(register int i=1;i<=n;++i){
    //        printf("debug nx[%d] = %d
    ",i,nx[i]);
    //    }
        f.init(n+6);
        for(register int i=1;i<=c;++i){
            if(id[i]&&nx[id[i]]){
                f.add(nx[id[i]],1);
            }
        }
        for(register int i=1;i<=m;++i){
            scanf("%d%d",&e[i].l,&e[i].r);
            e[i].pos=i;
        }
        sort(e+1,e+1+m);
        int l=1;
        for(register int i=1;i<=m;++i){
            while(l<e[i].l){
                if(nx[l]){
                    f.add(nx[l],-1);
                }
                if(nx[nx[l]]){
                    f.add(nx[nx[l]],1);
                }
                ++l;
                //printf("l = %d
    ",l);
            }
            e[i].ans=f.query(e[i].r)-f.query(e[i].l-1);
        }
        sort(e+1,e+1+m,cmp);
        for(register int i=1;i<=m;++i){
            printf("%d
    ",e[i].ans);
        }
        return 0;
    }

    2743: [HEOI2012]采花

    Time Limit: 15 Sec  Memory Limit: 128 MB
    Submit: 3555  Solved: 1783
    [Submit][Status][Discuss]

    Description

    萧芸斓是Z国的公主,平时的一大爱好是采花。今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建的花园采花
    。花园足够大,容纳了n朵花,花有c种颜色(用整数1-c表示),且花是排成一排的,以便于公主采花。公主每次
    采花后会统计采到的花的颜色数,颜色数越多她会越高兴!同时,她有一癖好,她不允许最后自己采到的花中,某
    一颜色的花只有一朵。为此,公主每采一朵花,要么此前已采到此颜色的花,要么有相当正确的直觉告诉她,她必
    能再次采到此颜色的花。由于时间关系,公主只能走过花园连续的一段进行采花,便让女仆福涵洁安排行程。福涵
    洁综合各种因素拟定了m个行程,然后一一向你询问公主能采到多少朵花(她知道你是编程高手,定能快速给出答
    案!),最后会选择令公主最高兴的行程(为了拿到更多奖金!)。

    Input

    第一行四个空格隔开的整数n、c以及m。
    接下来一行n个空格隔开的整数,每个数在[1, c]间,第i个数表示第i朵花的颜色。
    接下来m行每行两个空格隔开的整数l和r(l ≤ r),表示女仆安排的行程为公主经过第l到第r朵花进行采花。

    Output

    共m行,每行一个整数,第i个数表示公主在女仆的第i个行程中能采到的花的颜色数。

    Sample Input

    5 3 5
    1 2 2 3 1
    1 5
    1 2
    2 2
    2 3
    3 5

    Sample Output

    2
    0
    0
    1
    0
    【样例说明】
    询问[1, 5]:公主采颜色为1和2的花,由于颜色3的花只有一朵,公主不采;询问[1, 2]:颜色1和颜色2的花均只有一朵,公主不采;
    询问[2, 2]:颜色2的花只有一朵,公主不采;
    询问[2, 3]:由于颜色2的花有两朵,公主采颜色2的花;
    询问[3, 5]:颜色1、2、3的花各一朵,公主不采。

    HINT

    【数据范围】

    对于100%的数据,1 ≤ n ≤    10^6,c ≤ n,m ≤10^6。

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int maxn=1e6+10;
    int n,m;
    struct BIT{
        int c[maxn],tot;
        inline void init(int s){
            tot=s;
            memset(c,0,sizeof(c));
        }
        inline int lowbit(int x){
            return x&(-x);
        }
        inline void add(int pos,int val){
            while(pos<=tot){
                c[pos]+=val;
                pos+=lowbit(pos);
            }
        }
        inline int query(int pos){
            int res=0;
            while(pos){
                res+=c[pos];
                pos-=lowbit(pos);
            }
            return res;
        }
    }f;
    struct question{
        int l,r,ans,pos;
        bool operator<(const question& cur)const {
            if(l==cur.l){
                return r<cur.r;
            }
            return l<cur.l;
        }
    }q[maxn];
    int w[maxn];
    int nx[maxn],id[maxn];
    bool cmp(question s,question t){
        return s.pos<t.pos;
    }
    int main() {
        int mx=0;
        //freopen("1.txt","r",stdin);
        scanf("%d",&n);
        for(register int i=1;i<=n;++i){
            scanf("%d",&w[i]);
            mx=max(mx,w[i]);
        }
        for(register int i=n;i>=1;--i){
            nx[i]=id[w[i]];
            id[w[i]]=i;
        }
        f.init(n+6);
        for(register int i=1;i<=mx;++i){
            if(id[i]){
                f.add(id[i],1);
            }
        }
        scanf("%d",&m);
        for(register int i=1;i<=m;++i){
            scanf("%d%d",&q[i].l,&q[i].r);
            q[i].pos=i;
        }
        sort(q+1,q+1+m);
        int l=1;
        for(register int i=1;i<=m;++i){
            while(l<q[i].l){
                if(nx[l]){
                    f.add(nx[l],1);
                }
                f.add(l,-1);
                ++l;
            }
            q[i].ans=f.query(q[i].r)-f.query(q[i].l-1);
        }
        sort(q+1,q+1+m,cmp);
        for(register int i=1;i<=m;++i){
            printf("%d
    ",q[i].ans);
        }
        return 0;
    }
  • 相关阅读:
    NHibernate初学者指南(12):日志
    NHibernate初学者指南(10):一级和二级缓存
    【翻译】EF 4.2 Code First 演示
    【翻译】EF 4.2 Model & Database First演示
    NHibernate初学者指南(14):配置的三种方式
    NHibernate初学者指南(16):条件查询
    NHibernate初学者指南(7):映射模型到数据库之方式三
    NHibernate初学者指南(13):监测与分析
    NHibernate初学者指南(6):映射模型到数据库之方式二
    NHibernate初学者指南(18):验证单个属性
  • 原文地址:https://www.cnblogs.com/czy-power/p/11398551.html
Copyright © 2011-2022 走看看