Breed Counting(水?)

2386: Breed Counting

时间限制: 1 Sec   内存限制: 64 MB
提交: 81   解决: 31
[ 提交][ 状态][ 讨论版]

题目描述

Farmer John's N cows, conveniently numbered 1…N, are all standing in a row (they seem to do so often that it now takes very little prompting from Farmer John to line them up). Each cow has a breed ID: 1 for Holsteins, 2 for Guernseys, and 3 for Jerseys. Farmer John would like your help counting the number of cows of each breed that lie within certain intervals of the ordering. 

输入

The first line of input contains N and Q (1≤N≤100,000, 1≤Q≤100,000).

The next N  lines contain an integer that is either 1, 2, or 3, giving the breed ID of a single cow in the ordering.

The next Q  lines describe a query in the form of two integers a,b (a≤b). 

输出

For each of the Q queries (a,b), print a line containing three numbers: the number of cows numbered a…b that are Holsteins (breed 1), Guernseys (breed 2), and Jerseys (breed 3). 

样例输入

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

样例输出

3 2 1
1 0 0
2 0 1


比赛时直接用线段树开了3个数组做的。

其实还有更好的方法。

同样是开3个数组。

通过记录每个位置的前缀和,查询的时候直接输出 num[r] - num[l-1],就行了,就是这一段的和。 赞一个给力的孙学弟

源代码

#include<cstring>
#include<iostream>
#include<cstdio>
#include<vector>
#include<algorithm>
#include<queue>
using namespace std;
#define maxn 100005
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define mem(a,x) memset(a,x,sizeof(a))
int num1[maxn];
int num2[maxn];
int num3[maxn];
int main(){
    int n,m;
    while(scanf("%d%d",&n,&m)!=EOF){
        int tmp;
        mem(num1,0);
        mem(num2,0);
        mem(num3,0);
        for(int i=1;i<=n;i++){
            num1[i] += num1[i-1];
            num2[i] += num2[i-1];
            num3[i] += num3[i-1];
            scanf("%d",&tmp);
            if(tmp == 1) num1[i]++;
            if(tmp == 2) num2[i]++;
            if(tmp == 3) num3[i]++;
        }
        while(m--){
            int a,b;scanf("%d%d",&a,&b);
            printf("%d ",num1[b] - num1[a-1]);
            printf("%d ",num2[b] - num2[a-1]);
            printf("%d\n",num3[b] - num3[a-1]);
        }
    }
    return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
不死固件(breed)是一种在路由器上运行的嵌入式固件,它允许用户进行路由器的刷机操作。breed具有更丰富的功能和更强大的稳定性,可以提供更好的网络体验。 要下载breed,首先需要找到适用于你的路由器型号的breed固件版本。在互联网上搜索相关的breed固件下载网站或论坛,比如openwrt官网或者各大路由器爱好者社区。 在下载breed固件之前,建议确保你的路由器型号和硬件版本与要下载的固件版本兼容。不同型号的路由器可能需要不同版本的breed固件。 下载breed固件之后,可以将其保存到计算机的硬盘上。然后,将计算机与路由器通过网线连接,并确保两者在同一个局域网内。接下来,在计算机的浏览器中输入路由器的IP地址,打开路由器的管理界面。 在路由器管理界面中,找到固件升级或刷机的选项。选择刷机选项后,浏览并选择你之前下载的breed固件文件,然后点击确定或开始刷机进行安装。 刷机过程可能需要一些时间,请耐心等待。在安装完成后,路由器会自动重启。然后,你就可以享受到breed固件所带来的新功能和性能优化了。 需要注意的是,刷机操作可能存在一定的风险,一些错误或不正确的操作可能导致路由器无法正常工作。在进行刷机操作之前,请务必备份好重要的数据,并确保对刷机过程有足够的了解。如果不确定如何操作,建议咨询专业人士的建议或寻求技术支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值