终于回来了,继续写解题报告。
这道题唯一的难点在于如何判断第i位是不是1,这一点可以用位运算实现。对于一个2进制数(我们举个栗子,比如11100101),当我们想查询它第i位(最低位是0)的值时,可以将它右移i位,模2即可。
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的统计值。