[每日一题] [NC18979] 毒瘤xor

题目大意:有一个数组,每次询问数组的第L个到第R个数和某个数x的xor的总和最大的那个x。

https://ac.nowcoder.com/acm/problem/18979

其实很简单,没个bit可以分开,那么就是要么这个bit不变,要么全部flip,问哪种剩下的1个数多,只要能飞快地知道这一位0和1的个数就知道该不该flip了。用一个前缀和就可以存[0, R]的1的个数,那么就很容易知道[L, R]的1的个数,0的个数就是(R - L + 1)减去1的个数。

int N;
#define MAXN 100005
int a[MAXN];
int Q;
int L, R;
#define MAXH 31
int counter[MAXN][MAXH];
int doit(int L, int R) {
  int tot = R - L + 1;
  int ans = 0;
  for (int h = 0; h < MAXH; ++h) {
    int one_count = counter[R][h] - (L ? counter[L - 1][h] : 0);
    int zero_count = tot - one_count;
    if (one_count < zero_count) {
      ans |= (1 << h);
    }
  }
  return ans;
}
int main(int argc, char* argv[]) {
  read(N);
  read(a, N);
  for (int h = 0; h < MAXH; ++h) {
    for (int i = 0; i < N; ++i) {
      if (i) counter[i][h] = counter[i - 1][h];
      if (a[i] & (1 << h)) {
        counter[i][h]++;
      }
    }
  }
  read(Q);
  REP(q, Q) {
    read(L, R);
    --L,--R;
    print(doit(L, R));
  }
  return 0;
}
全部评论

相关推荐

找个工作&nbsp;学历是要卡的&nbsp;要求是高的&nbsp;技能不足是真的&nbsp;实习经验是0的&nbsp;简历无处可写是事实的&nbsp;钱不好赚是真的&nbsp;想躺平又不敢躺&nbsp;也不甘心躺&nbsp;怕自己的灵感和才华被掩埋甚至从未被自己发现&nbsp;又质疑自己是否真正有才华
码农索隆:你现在啊,你心里都明白咋回事,但是你没办法改变现状,一想到未来,你又没有信心狠下心来在当下努力。 得走出这种状态,不能一直困在那里面,哪不行就去提升哪,你一动不动那指定改变不了未来,动起来,积少成多才能越来越好
点赞 评论 收藏
分享
屌丝逆袭咸鱼计划:心态摆好,man,晚点找早点找到最后都是为了提升自己好进正职,努力提升自己才是最关键的😤难道说现在找不到找的太晚了就炸了可以鸡鸡了吗😤早实习晚实习不都是为了以后多积累,大四学长有的秋招进的也不妨碍有的春招进,人生就这样
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务