【bzoj4888】: [Tjoi2017]异或和 BIT-乱搞

【bzoj4888】: [Tjoi2017]异或和

题目大意:给定一个序列,求这个序列所有的连续和的异或值。(n<=1e5 ai<=1e6)

想了各种奇怪的方法就是不会做啊啊啊。。

Orz 参考了一下http://www.cnblogs.com/xiejiadong/p/6815269.html才会做的。。

恩因为不超过20位。。所以可以考虑枚举所有连续和在第i位1的个数

预处理完前缀和就可以O(1)求出任意一个连续和。。

当考虑到第i位的时候,把前缀和扫一遍

当扫到第x个前缀和sum[x],那么所有满足 第y个前缀和sum[y](y<x)的第i位=sum[x] 的第i位 且 sum[x]的i后面的位<sum[y]的i后面的位

                  或 第y个前缀和sum[y](y<x)的第i位!=sum[x] 的第i位 且 sum[x]的i后面的位>sum[y]的i后面的位

的sum[x]-sum[y]一定是一个对第i位有贡献的连续和。。

理解了半天。。手玩了几个数才明白。。在扫一遍的时候用BIT维护一下就好了。。

 1 /* http://www.cnblogs.com/karl07/ */
 2 #include <cstdlib>
 3 #include <cstdio>
 4 #include <cstring>
 5 #include <cmath>
 6 #include <algorithm>
 7 using namespace std;
 8
 9 #define lowbit(x) (x&-x)
10 const int N=1e5+5;
11 const int MX=1e6+1e5;
12 int n,m;
13 int a[N],b[2][MX],as[21];
14
15 int bt(int x,int y){
16     return (x>>(y-1))&1;
17 }
18
19 void PR(int x){
20     if (x) PR(x>>1);
21     printf("%d",x&1);
22 }
23 void pr(int x){
24     PR (x);
25     puts("");
26 }
27
28 int query(int p1,int x){
29     int ans=0;
30     while (x){
31         ans+=b[p1][x];
32         x-=lowbit(x);
33     }
34     return ans;
35 }
36
37 void modify(int p1,int x){
38     while (x<=MX){
39         b[p1][x]++;
40         x+=lowbit(x);
41     }
42 }
43
44 int main(){
45     scanf("%d",&n);
46     for (int i=1;i<=n;i++){
47         scanf("%d",&a[i]);
48         a[i]+=a[i-1];
49     }
50     for (int i=1,ba=1;i<=20;i++){
51         memset(b,0,sizeof(b));
52         for (int j=1;j<=n;j++){
53             as[i]+=query(bt(a[j],i),ba+1)-query(bt(a[j],i),a[j]%ba+1)+query(!bt(a[j],i),a[j]%ba+1)+bt(a[j],i);
54             modify(bt(a[j],i),a[j]%ba+1);
55         }
56         ba=ba*2;
57     }
58     int ans=0;
59     for (int i=1,ba=1;i<=20;i++,ba*=2) ans+=(as[i]&1)*ba;
60     printf("%d\n",ans);
61     return 0;
62 }

时间: 2025-01-02 19:00:59

【bzoj4888】: [Tjoi2017]异或和 BIT-乱搞的相关文章

【BZOJ-3578】GTY的人类基因组计划2 set + map + Hash 乱搞

3578: GTY的人类基因组计划2 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 367  Solved: 159[Submit][Status][Discuss] Description GTY召唤了n个人来做实验,GTY家的房子很大,有m个房间一开始所有人都在1号房间里,GTY会命令某人去某个房间等待做实验,或者命令一段区间的房间开始实验,实验会获得一些实验信息点数,点数为房间里的人数,如果一个房间里的一群人已经做过实验了那么这些人将不会增

【bzoj4917】Hash Killer IV 乱搞

题目描述 已知函数: unsigned int Hash(unsigned int v) { unsigned int t = v; t = t + (t << 10); t = t ^ (t >> 6); t = t + (t << 3); t = t ^ (t >> 11); t = t + (t << 16); return t; } 的返回值为t,求传入的参数v. 输入 第一行包含一个正整数Q(1<=Q<=100000),表示

【bzoj5108】[CodePlus2017]可做题 拆位+乱搞

题目描述 给出一个长度为 $m$ 的序列 $a$ ,编号为 $a_1\sim a_m$,其中 $n$ 个位置的数已经确定,剩下的位置的数可以任意指定.现在令 $b$ 表示 $a$ 的前缀异或和,求 $\sum\limits_{i=1}^mb_i$ 的最小值. 输入 输入第一行两个非负整数n,m,分别表示原始序列a的长度及剩余元素的个数. 之后m行,每行2个数i,ai,表示一个剩余元素的位置和数值. 1<=N<=10^9,0<=M<=Min(n,10^5),0<=ai<=

UVA 11853 [dfs乱搞]

/* 大连热身E题 不要低头,不要放弃,不要气馁,不要慌张 题意: 在1000×1000的格子内有很多个炮弹中心,半径给定. 为某人能否从西部边界出发,从东部边界走出. 不能输出不能,能的话输出最北边的入口和出口的坐标. 思路: dfs乱搞题.把炮弹辐射范围连在一起的炮弹看作一个整体,记录下它围起来的边界区域. 然后找到最北边的输出. */ #include<bits/stdc++.h> using namespace std; double x[1005],y[1005],r[1005];

Codeforces 732e [贪心][stl乱搞]

/* 不要低头,不要放弃,不要气馁,不要慌张 题意: 给n个插座,m个电脑.每个插座都有一个电压,每个电脑都有需求电压. 每个插座可以接若干变压器,每个变压器可以使得电压变为x/2上取整. 有无限个变压器供应. 问最多能使得多少个插座与电脑匹配,使得电压一致. 如果有多种方案,输出需要变压器总数最小的那种. 输出匹配数量 输出每个插座需要接多少个变压器.输出每台电脑匹配哪个插座. 思路: 贪心 乱搞 先从小到大将插座排序,然后从地第一个插座开始,不断除以2上取整.不断找是否可以匹配.找到匹配就停

学渣乱搞系列之dp斜率优化

学渣乱搞系列之dp斜率优化 By 狂徒归来 貌似dp的斜率优化一直很难搞啊,尤其是像我这种数学很挫的学渣,压根不懂什么凸包,什么上凸下凸的,哎...说多了都是泪,跟wdd讨论了下,得出一些结论.本文很大部分参考了大神Accept的文章,不过此神貌似早已绝迹江湖,这篇文章写得好,也写得很差,前半部分叙述得很好,可是关键,关键部分说得很乱,有些许错误,很多大神都进行了评论指出,但是大神Accept貌似没有修改的意思,故重新总结下,以便自己以后查阅和复习啊. 下面看一个例题Print Article.

Bucharest, Romania 2013 H Red John Game 乱搞 未解

题意:给你一个无限的棋盘,里面有n×n的棋子,每个棋子可以跳过一个相邻(4个方向)棋子跳到下一个位置,并把他的相邻位(他跳过的那一位)删除. 解题思路:判断n%3 是否等于 0 , 原因未知. 解题代码: 1 #include<stdio.h> 2 int main(){ 3 int n ; 4 while(~scanf("%d",&n)) 5 { 6 if(n%3) 7 printf("1\n"); 8 else printf("0\

【BZOJ-4692】Beautiful Spacing 二分答案 + 乱搞(DP?)

4692: Beautiful Spacing Time Limit: 15 Sec  Memory Limit: 128 MBSubmit: 46  Solved: 21[Submit][Status][Discuss] Description 文章是一些单词组成的序列,单词由字母组成.你的任务是将一篇文章的单词填充到一个网格中,其中网格包含W列和足够多的行.为了布局之美,以下限制都需要满足. 1.文章中的文字需要按照原有的顺序放置.下图表示了将4个单词的文章“This is a pen”放入

hdu 4972 A simple dynamic programming problem (转化 乱搞 思维题) 2014多校10

题目链接 题意:给定一个数组记录两队之间分差,只记分差,不记谁高谁低,问最终有多少种比分的可能性 分析: 类似cf的题目,比赛的时候都没想出来,简直笨到极点..... 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cstdlib> 5 #include <cmath> 6 #include <vector> 7 #include &