题面

戳这里

简要题解

做法一

因为所有数的和才100w,所以我们可以直接求出所有区间和。

直接把前缀和存到一个权值数组,再倒着存一遍,大力卷积一波。

这样做在bzoj目前还过不了,但是luogu开O2,最慢的点才500ms左右。

#include<bits/stdc++.h>
#define For(i,x,y) for (register int i=(x);i<=(y);i++)
#define Dow(i,x,y) for (register int i=(x);i>=(y);i--)
#define cross(i,u) for (register int i=first[u];i;i=last[i])
using namespace std;
typedef long long ll;
inline ll read(){
ll x=0;int ch=getchar(),f=1;
while (!isdigit(ch)&&(ch!='-')&&(ch!=EOF)) ch=getchar();
if (ch=='-'){f=-1;ch=getchar();}
while (isdigit(ch)){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
return x*f;
}
const int N = 4e6+10;
int m,ans,pre[N];
struct node{
double x,y;
inline node operator + (const node &b)const{return (node){x+b.x,y+b.y};}
inline node operator - (const node &b)const{return (node){x-b.x,y-b.y};}
inline node operator * (const node &b)const{return (node){x*b.x-y*b.y,x*b.y+y*b.x};}
}a[N],b[N];
int n,l,pos[N];
inline void init(){
for (n=1;n<=(pre[m]<<1);n<<=1,l++);
For(i,0,n-1) pos[i]=(pos[i>>1]>>1)|((i&1)<<(l-1));
}
const double pi = 3.1415926535897932;
inline void FFT(node *a,int f){
For(i,0,n-1) if (i<pos[i]) swap(a[i],a[pos[i]]);
node x,y;
for (register int i=1;i<n;i<<=1){
node wn=(node){cos(pi/i),f*sin(pi/i)};
for (register int j=0;j<n;j+=i<<1){
node w=(node){1,0};
for (register int k=0;k<i;k++,w=w*wn) x=a[j+k],y=w*a[j+k+i],a[j+k]=x+y,a[j+k+i]=x-y;
}
}
if (f<0) For(i,0,n-1) a[i].x=a[i].x/n+0.5;
}
int main(){
m=read(),a[0].x=1;
For(i,1,m) pre[i]=pre[i-1]+read(),++a[pre[i]].x;
For(i,0,pre[m]) b[pre[m]-i].x=a[i].x;
init();FFT(a,1),FFT(b,1);
For(i,0,n-1) a[i]=a[i]*b[i];
FFT(a,-1);
//For(i,0,n-1) printf("%d ",(int)a[i].x);puts("");
For(i,0,pre[m]) if ((int)a[i].x&1) ans^=(-(i-pre[m]));
printf("%d",ans);
}

做法二

考虑拆位,大力分类讨论,两个树状数组维护下。

#include<bits/stdc++.h>
#define For(i,x,y) for (register int i=(x);i<=(y);i++)
#define Dow(i,x,y) for (register int i=(x);i>=(y);i--)
#define cross(i,u) for (register int i=first[u];i;i=last[i])
using namespace std;
typedef long long ll;
inline ll read(){
ll x=0;int ch=getchar(),f=1;
while (!isdigit(ch)&&(ch!='-')&&(ch!=EOF)) ch=getchar();
if (ch=='-'){f=-1;ch=getchar();}
while (isdigit(ch)){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
return x*f;
}
const int N = 1e6+10;
int n,cnt,Max,ans,pre[N];
struct BIT{
int c[N];
inline void Add(int x,int y){for (;x<=pre[n];x+=x&-x) c[x]+=y;}
inline int Query(int x){int ans=0;for (;x;x-=x&-x) ans+=c[x];return ans;}
}t[2];
int main(){
n=read();
For(i,1,n) pre[i]=pre[i-1]+read();
for (int i=1;i<=pre[n];i<<=1){
cnt=Max=0;
For(j,0,n){
int x=((pre[j]&i)>0),y=pre[j]&(i-1);
Max=max(Max,y),cnt+=t[x^1].Query(y+1)+t[x].Query(Max+1)-t[x].Query(y+1),t[x].Add(y+1,1);
}
For(j,0,pre[n]) t[0].c[j]=t[1].c[j]=0;
ans|=(cnt&1)*i;
}
printf("%d",ans);
}

BZOJ4888 [Tjoi2017]异或和 FFT或树状数组+二进制拆位的更多相关文章

  1. 【bzoj4889】[Tjoi2017]不勤劳的图书管理员 树状数组+分块+二分

    题目描述(转自洛谷) 加里敦大学有个帝国图书馆,小豆是图书馆阅览室的一个书籍管理员.他的任务是把书排成有序的,所以无序的书让他产生厌烦,两本乱序的书会让小豆产生这两本书页数的和的厌烦度.现在有n本被打 ...

  2. CF #365 (Div. 2) D - Mishka and Interesting sum 离线树状数组

    题目链接:CF #365 (Div. 2) D - Mishka and Interesting sum 题意:给出n个数和m个询问,(1 ≤ n, m ≤ 1 000 000) ,问在每个区间里所有 ...

  3. CF #365 (Div. 2) D - Mishka and Interesting sum 离线树状数组(转)

    转载自:http://www.cnblogs.com/icode-girl/p/5744409.html 题目链接:CF #365 (Div. 2) D - Mishka and Interestin ...

  4. 【BZOJ】3173: [Tjoi2013]最长上升子序列(树状数组)

    [题意]给定ai,将1~n从小到大插入到第ai个数字之后,求每次插入后的LIS长度. [算法]树状数组||平衡树 [题解] 这是树状数组的一个用法:O(n log n)寻找前缀和为k的最小位置.(当数 ...

  5. 洛谷P3287 [SCOI2014]方伯伯的玉米田(树状数组)

    传送门 首先要发现,每一次选择拔高的区间都必须包含最右边的端点 为什么呢?因为如果拔高了一段区间,那么这段区间对于它的左边是更优的,对它的右边会更劣,所以我们每一次选的区间都得包含最右边的端点 我们枚 ...

  6. hdu2492树状数组

    题目链接:http://icpc.njust.edu.cn/Problem/Hdu/2492/ 题目大意:给定一个序列,求长度为三的子序列(a,b,c)使得a<b<c或a>b> ...

  7. 【BZOJ4888】[TJOI2017]异或和(树状数组)

    [BZOJ4888][TJOI2017]异或和(树状数组) 题面 BZOJ 洛谷 题解 考虑每个位置上的答案,分类讨论这一位是否存在一,值域树状数组维护即可. #include<iostream ...

  8. BZOJ4888 [Tjoi2017]异或和 【树状数组】

    题目链接 BZOJ4888 题解 要求所有连续异或和,转化为任意两个前缀和相减 要求最后的异或和,转化为求每一位\(1\)的出现次数 所以我们只需要对每一个\(i\)快速求出\(sum[i] - su ...

  9. [BZOJ4888][TJOI2017]异或和(树状数组)

    题目描述 在加里敦中学的小明最近爱上了数学竞赛,很多数学竞赛的题都是与序列的连续和相关的.所以对于一个序列,求出它们所有的连续和来说,小明觉得十分的简单.但今天小明遇到了一个序列和的难题,这个题目不仅 ...

随机推荐

  1. Dubbo重试次数

    服务超时后重试次数[retries],不包含第一次调用,0代表不重试 *我们应该在幂等方法上设置重试次数[查询.删除.修改],在非幂等方法上禁止设置重试次数. ★幂等:指多次运行方法所产生的最终效果是 ...

  2. WPF工具开发: 第三库选择

    PropertyGrid Winforms's PropertyGrid 非WPF原生支持, 需要借助WinFormHost 风格不可定制 PropertyInspectorView 算是" ...

  3. Java 集合系列0、概述

    概述: Collection 框架中 从最上层的核心主干可以看到:Iterator.Collection.Map 三个接口(拓展思考1)1.Collection 接口:主要包括了集合中的一些常用操作, ...

  4. v4l2功能列表大全【转】

    一,功能参考 目录 V4L2 close() - 关闭一个V4L2设备 V4L2 ioctl() - 创建的V4L2设备 ioctl VIDIOC_CROPCAP - 视频裁剪和缩放功能信息 ioct ...

  5. CONFIG_DEBUG_USER【转】

    转自:https://blog.csdn.net/adaptiver/article/details/12778621 关于CONFIG_DEBUG_USER 把menuconfig中查到的 CONF ...

  6. MISC混杂设备 struct miscdevice /misc_register()/misc_deregister()【转】

    本文转自:http://blog.csdn.net/angle_birds/article/details/8330407 在Linux系统中,存在一类字符设备,他们共享一个主设备号(10),但此设备 ...

  7. 读SRE Google运维解密有感(四)-聊聊问题排查

    前言 这是读“SRE Google运维解密”有感第四篇,之前的文章可访问www.addops.cn来查看.今天我们来聊聊“问题排查”这个话题,本人到目前为止还在参与一线运维的工作,遇到过很多“稀奇古怪 ...

  8. Linux安全配置步骤简述

    一.磁盘分区  1.如果是新安装系统,对磁盘分区应考虑安全性:   1)根目录(/).用户目录(/home).临时目录(/tmp)和/var目录应分开到不同的磁盘分区:   2)以上各目录所在分区的磁 ...

  9. ThinkPHP 3.1.3及之前的版本使用不当可造成SQLi

    Lib/Core/Model.class.php中解析SQL语句的函数parseSql没有对SQL语句进行过滤,使用不当可导致SQL注入.(哈哈,其实用再安全的框架使用不当都可能造成SQLi) 函数: ...

  10. 解决win 10下git bash中文乱码

    解决步骤如下: 1.在git bash窗体下右键,选择options 2.在打开的配置窗口左侧选择  Text,然后在右侧选择locale为zh_CN,Character set 为GBK,点击OK保 ...