NEU 1252 (拆位)

原创 2015年11月18日 16:50:07

题目很水意思是求区间内的与和。

很容易想到用在线线段树或者RMQ或者离线树状数组搞,但是我偏偏不用这些数据结构。

可以把每个数拆位求每一位的前缀和,如果这一位的区间的和刚好等于区间长度那么与和的结果这一位就是1,否则这一位就是0.

#include <bits/stdc++.h>
using namespace std;
#define maxn 111111

int sum[maxn][66]; //1到i的二进制数的第j位的和
int n, m, l, r;
long long a[maxn];

void solve (int l, int r) {
    long long ans = 0;
    for (long long i = 1, num = 1; i < 63; i++, num <<= 1) {
        if (sum[r][i]-sum[l-1][i] == r-l+1) {
            ans += num;
        }
    }
    printf ("%lld\n", ans);
}

int main () {
    while (scanf ("%d%d", &n, &m) == 2) {
        memset (sum, 0, sizeof sum);
        for (int i = 1; i <= n; i++) {
            scanf ("%lld", &a[i]);
            for (long long bit = 1, num = 1; bit < 63; bit++, num <<= 1) {
                sum[i][bit] = sum[i-1][bit] + ((a[i]&num)>0);
            }
        }
        while (m--) {
            scanf ("%d%d", &l, &r);
            solve (l, r);
        }
        printf ("\n");
    }
    return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

UVa 1252 - Twenty Questions(记忆化搜索,状态压缩dp)

题目大意 有n个长度为m的二进制串,每个都是不同的。 为了把所有字符串区分开,你可以询问,每次可以问某位上是0还是1。 问最少提问次数,可以把所有字符串区分开来。...
  • shuangde800
  • shuangde800
  • 2013年08月08日 00:15
  • 2946

uva1252 20个问题

1. 遇到集合个数太多的情况想办法转换表达方式,再用数组存储,相当于用状态做一个映射。 2. 需要得到第几个的时候就不太好s++这样枚举,适合多次枚举第几个数,再判断是否曾经枚举过。 3. 分阶段的思...
  • cFarmerReally
  • cFarmerReally
  • 2016年08月06日 11:55
  • 535

记忆化搜索,状压DP(20个问题,uva 1252)

要学会找到“决策”和“状态”。 在这题中,“决策”无非就是问哪个问题,而问过的问题就不能再问了,因此需要已问过哪些问题的“状态”。每次询问,无非得到两个结果,是或不是,所以还需要“状态”:问过的问题...
  • xl2015190026
  • xl2015190026
  • 2016年09月21日 18:40
  • 235

GalaxyOJ-752 (拆位)

题目 Problem Description Tmk无聊的时候,拿了n张纸,一张纸写了一个数字,然后把它们丢进了一个箱子里面,然后他在里面抽出了两张纸,然后他想知道这两张纸上的...
  • jackypigpig
  • jackypigpig
  • 2017年07月14日 09:27
  • 288

cf-778B (拆位)

题目 Problem Description Bob recently read about bitwise operations used in computers: AND...
  • jackypigpig
  • jackypigpig
  • 2017年03月12日 08:38
  • 453

UVA 1252 Twenty Questions

状态压缩DP 题意: 有n个长度为m的二进制串,每个都是不同的。为了把所有字符串区分开,你可以询问,每次可以问某位上是0还是1。问最少提问次数,可以把所有字符串区分开来。 解法: 设dp[s1][...
  • z286830682
  • z286830682
  • 2013年08月28日 19:04
  • 1147

UVA 1252 Twenty Questions 状压DP

简单状压DP: 当前状态s如果这个物品有状态a个属性,枚举下一个要猜测的特征k dp[s][a]=min(dp[s][a],max(dp[s+k][a],dp[s+k][a+k])+1);...
  • u012797220
  • u012797220
  • 2015年02月22日 16:52
  • 891

用户、权限和角色

2 1 programming 1 Oracle SQL开发基础 2 2 programming 课程结构 内容 课时(H) 第一章 Oracle数据库基础 2....
  • jiangjiewudi
  • jiangjiewudi
  • 2013年07月29日 16:46
  • 1065

鲜为人知的光驱拆卸方法介绍

有些用户对电脑内部构造十分感兴趣,总喜欢对电脑进行拆卸观摩,但是对于光驱这个敏感的部分,它的拆卸有一定的难度,需要一定的细心和技巧,感兴趣的用户可以跟着拆卸高手的脚步一起来学习一下。   1.前面板...
  • czhpyy
  • czhpyy
  • 2014年07月09日 11:09
  • 922

poj1252

非常经典的背包题目 /* +和-的顺更新序不一样,+是从小到大依次更新,-是从大到小依次更新,所以不能同时更新两个变量,故要进行两次完全背包 除此之外,由于有可能先大于100,然后再减去某数获得...
  • u011663071
  • u011663071
  • 2014年02月19日 22:00
  • 681
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:NEU 1252 (拆位)
举报原因:
原因补充:

(最多只允许输入30个字)