数据结构与算法B代码编写作业,位查询,解题报告&AC代码

终于回来了,继续写解题报告。

这道题唯一的难点在于如何判断第i位是不是1,这一点可以用位运算实现。对于一个2进制数(我们举个栗子,比如11100101),当我们想查询它第i位(最低位是0)的值时,可以将它右移i位,模2即可。

查询11100101的第3位,右移3位变成00011100,模2为0,即第三位数字为0。伪代码如下:

//num:待检测数字;i:查询位数
cout << (num >> i % 2) << endl;

AC代码在下面,因为比较简单我就懒得写注释了= =

/*
ID: Moien_Podiene
PROG: STRING
LANG: C++
*/

#include <iostream>

using namespace std;

int main()
{
    int i, j;
    int N, M;
    int num[100001], val, sum, check;
    char op;
    cin >> N >> M;
    for(i = 0; i < N; i++)
    {
        cin >> num[i];
    }
    for(i = 0; i < M; i++)
    {
        cin >> op;
        cin >> val;
        if(op == 'C')
        {
            for(j = 0; j < N; j++)
            {
                num[j] += val;
                num[j] %= 65536;
            }
        }
        else if(op == 'Q')
        {
            sum = 0;
            for(j = 0; j < N; j++)
            {
                check = num[j] >> val;
                if(check % 2 == 1)
                {
                    sum++;
                }
            }
            cout << sum << endl;
        }
    }
    return 0;
}

传说中的惯例……最后是题目……


总时间限制:
    5000ms
内存限制:
    65536kB

描述

        给出N个范围在[0, 65535]的整数,编程支持以下的操作:


    (1)修改操作:C d,所有的数都增加d。如果超过65535,把结果模65536。 0 <= d <= 65535
    (2)查询操作:Q i,统计在N个正整数中有多少个整数其对应的二进制形式的第i位二进制位为非0。0 <= i <= 15。并且最低位i为0。


      最后,输出所有查询操作的统计值。
输入
    输入的第一行为两个正整数N,M,其中N为操作的整数的个数,而M为具体有多少个操作。
    输入的第二行为N个正整数,为进行操作的N个正整数。
    下面有M行,分别表示M个操作。

    N<=100000,M<=200000
输出
    输出所有查询操作Q的统计值,每一个查询操作统计结果输出为一行。
样例输入

    3 5
    1 2 4
    Q 1
    Q 2
    C 1
    Q 1
    Q 2

样例输出

    1
    1
    2
    1

提示
    只输出查询操作Q的统计值。 


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值