zoukankan      html  css  js  c++  java
  • COGS 2685. 迷妹

    ★   输入文件:fans.in   输出文件:fans.out   简单对比
    时间限制:1 s   内存限制:256 MB

    【题目描述】

    小钟、小皓和小曦都是著名偶像派OI选手,他们都有很多迷妹。

    现在,有n个妹子排成了一行,从左到右编号为1到n。这些妹子中,任意一个都是其中一个人的迷妹。

    现在,蒟蒻wyz有Q个问题,第i个问题为:编号在l[i]到r[i]范围内的妹子中,分别有几个小钟的迷妹、小皓的迷妹、和小曦的迷妹。

    【输入格式】

    输入到fans.in

    第一行2个正整数n,Q。

    第2行到第n+1行每行一个正整数a[i],描述了第i个妹子是谁的迷妹。a[i]=1表示小钟的迷妹,a[i]=2表示小皓的迷妹,a[i]=3表示小曦的迷妹。

    第n+2行到第n+Q+1行,每行2个整数,表示第i个问题。

    【输出格式】

    输出到fans.out

    共Q行,每行3个用空格分开的整数,分别表示对于第i个问题,有多少小钟、小皓、小曦的迷妹。

    【样例输入】

    6 3

    2

    1

    1

    3

    2

    1

    1 6

    3 3

    2 4

    【样例输出】

    3 2 1

    1 0 0

    2 0 1

    【提示】

    【数据范围】

    对于10%的数据,保证1<=n<=10,Q<=10,

    对于25%的数据,保证1<=n<=100,Q<=100,

    对于45%的数据,保证1<=n<=1000,Q<=1000,

    对于100%的数据,保证1<=n<=100,000,Q<=100,000。

    保证1<=a[i]<=3,1<=l[i]<=r[i]<=n。

    【来源】

    QBXT2017春令营第一次测试T1

     屠龙宝刀点击就送

    做法1

      很水的前缀和

    #include <ctype.h>
    #include <cstdio>
    
    void read(int &x)
    {
        x=0;bool f=0;
        register char ch=getchar();
        for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=1;
        for(; isdigit(ch);ch=getchar()) x=x*10+ch-'0';
        x=f?(~x)+1:x;
    }
    int n,q,sum[100005][4];
    int main()
    {
        freopen("fans.in","r",stdin);freopen("fans.out","w",stdout);
        read(n);read(q);
        for(int opt,i=1;i<=n;i++)
        {
            read(opt);
            if(opt==1)
            {
                sum[i][1]=sum[i-1][1]+1;
                sum[i][2]=sum[i-1][2];
                sum[i][3]=sum[i-1][3];
            }
            else if(opt==2)
            {
                sum[i][1]=sum[i-1][1];
                sum[i][2]=sum[i-1][2]+1;
                sum[i][3]=sum[i-1][3];
            }
            else 
            {
                sum[i][1]=sum[i-1][1];
                sum[i][2]=sum[i-1][2];
                sum[i][3]=sum[i-1][3]+1;
            }
        }
        for(int x,y;q--;)
        {
            read(x);read(y);
            printf("%d %d %d
    ",sum[y][1]-sum[x-1][1],sum[y][2]-sum[x-1][2],sum[y][3]-sum[x-1][3]);
        }
        return 0;
    }

     改掉我前缀和的脑残求和 竟然慢了 !。。 

    #include <ctype.h>
    #include <cstdio>
    void read(int &x)
    {
        x=0;bool f=0;
        register char ch=getchar();
        for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=1;
        for(; isdigit(ch);ch=getchar()) x=x*10+ch-'0';
        x=f?(~x)+1:x;
    }
    int n,q,sum[100005][4];
    int main()
    {
        freopen("fans.in","r",stdin);freopen("fans.out","w",stdout);
        read(n);read(q);
        for(int opt,i=1;i<=n;i++)
        {
            read(opt);
            sum[i][opt]=1;
            sum[i][1]+=sum[i-1][1];
            sum[i][2]+=sum[i-1][2];
            sum[i][3]+=sum[i-1][3];
        }
        for(int x,y;q--;)
        {
            read(x);read(y);
            printf("%d %d %d
    ",sum[y][1]-sum[x-1][1],sum[y][2]-sum[x-1][2],sum[y][3]-sum[x-1][3]);
        }
        return 0;
    }
    View Code

     做法2

      很水的树状数组

    #include <ctype.h>
    #include <cstdio>
    
    void read(int &x)
    {
        x=0;
        bool f=0;
        register char ch=getchar();
        for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=1;
        for(; isdigit(ch);ch=getchar()) x=x*10+ch-'0';
        x=f?(~x)+1:x;
    }
    int n,q;
    struct bit
    {
        int sum[100005];
        int lowbit(int x) {return x&((~x)+1);}
        int query(int x)
        {
            int ans=0;
            for(;x;x-=lowbit(x)) ans+=sum[x];
            return ans;
        }
        void plus(int x,int y)
        {
            for(;x<=n;x+=lowbit(x)) sum[x]+=y;
        }
    }a[5];
    int main()
    {
        freopen("fans.in","r",stdin);
        freopen("fans.out","w",stdout);
        read(n);read(q);
        for(int opt,i=1;i<=n;i++)
        {
            scanf("%d",&opt);
            a[opt].plus(i,1); 
        }
        for(int x,y;q--;)
        {
            read(x);read(y);
            printf("%d %d %d
    ",a[1].query(y)-a[1].query(x-1),a[2].query(y)-a[2].query(x-1),a[3].query(y)-a[3].query(x-1));
        }
        return 0;
    }
    我们都在命运之湖上荡舟划桨,波浪起伏着而我们无法逃脱孤航。但是假使我们迷失了方向,波浪将指引我们穿越另一天的曙光。
  • 相关阅读:
    JSP Web第五章整理复习 JSP访问数据库
    JSP Web第四章整理复习 JSP技术基础
    JSP Web第三章整理复习 开发环境搭建
    在n个球中,任意取出m个(不放回),求共有多少种取法
    递归比较字符串是否相等
    数组求和的3种常见递归方法
    打印begin~end
    jQuery简单实现图片预加载
    HTML5语义化标签重构页面
    jQuery插件slick实现响应式移动端幻灯片图片切换特效—大全
  • 原文地址:https://www.cnblogs.com/ruojisun/p/7300839.html
Copyright © 2011-2022 走看看