#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define ull unsigned long long
using namespace std;
ull deal(ull a)
{
if(a == 2)return 1;
ull flag = 0;
while(a-1)
{
if(a%2)a--;
else(a /= 2);
flag++;
}
return flag;
}
ull map_[100010];//
ull sum[10010];
int main()
{
int k;
scanf("%d", &k);
ull m,n;
while(k--)
{//不把数组放在这定义,可以避免超时
memset(map_, 0, sizeof(map_));
memset(sum, 0, sizeof(sum));
ull t;
scanf("%llu%llu", &m, &n);
for(ull i = 1; i <= m; i++)
{
scanf("%llu", &t);
map_[i] = deal(t);
}
sum[1] = map_[1];
for(ull i = 2; i <= m; i++)
sum[i] = map_[i] + sum[i-1];
ull x, y;
while(n--)
{
scanf("%llu%llu", &x, &y);
printf("%llu\n", sum[y] - sum[x-1]);
}
}
return 0;
}
本文介绍了一个使用位操作进行数值处理的C++程序实例。该程序通过定义一系列位操作来计算特定数值属性,并利用数组存储中间结果以加速后续查询过程。通过对输入数据的预处理,实现了高效的数据查询功能。
2335

被折叠的 条评论
为什么被折叠?



