[bzoj5294]二进制
首先可以发现$2^k$模3意义下有循环节,也就是1,-1,1,-1……
考虑对于x个1,y个0,判断是否存在3的倍数
1.x为偶数时一定可以,选择等量的1和-1即可
2.x为奇数,要满足$x\ge 3$且$y\ge 2$,这是可以用3个0*(-1)和3个1*1来抵消掉(如果y=2时也可以,因为此时总共有奇数位),同时$x-3$显然为偶数
看上去难以维护,考虑反过来,求不是3的倍数的区间个数,那么即要求$x=1$或x为奇数且$y=0/1$
线段树维护区间,对于每一个区间维护0的数量,1的数量和一个三维数组a[3][4][3]表示在任意/以左端点为开头/右端点为结尾的区间中,x为0/1/非0偶数/非1奇数,y为0/1/(>1)的数量,转移详见代码(比较丑陋)

1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 100005
4 #define L (k<<1)
5 #define R (L+1)
6 #define mid (l+r>>1)
7 #define ll long long
8 struct ji{
9 int s[2];
10 ll a[3][4][3];
11 }o,f[N<<2];
12 int n,m,p,x,y,a[N];
13 int fx(int x){
14 if (x<2)return x;
15 return ((x&1)+2);
16 }
17 int fy(int y){
18 return min(y,2);
19 }
20 ji up(ji x,ji y){
21 if (x.s[0]<0)return y;
22 if (y.s[0]<0)return x;
23 for(int i=0;i<2;i++)o.s[i]=x.s[i]+y.s[i];
24 memset(o.a[0],0,sizeof(o.a[0]));
25 memcpy(o.a[1],x.a[1],sizeof(o.a[1]));
26 memcpy(o.a[2],y.a[2],sizeof(o.a[2]));
27 for(int i1=0;i1<4;i1++)
28 for(int j1=0;j1<3;j1++){
29 o.a[0][i1][j1]+=x.a[0][i1][j1]+y.a[0][i1][j1];
30 o.a[1][fx(i1+x.s[1])][fy(j1+x.s[0])]+=y.a[1][i1][j1];
31 o.a[2][fx(i1+y.s[1])][fy(j1+y.s[0])]+=x.a[2][i1][j1];
32 for(int i2=0;i2<4;i2++)
33 for(int j2=0;j2<3;j2++)
34 o.a[0][fx(i1+i2)][fy(j1+j2)]+=x.a[2][i1][j1]*y.a[1][i2][j2];
35 }
36 return o;
37 }
38 void update(int k,int l,int r,int x,int y){
39 if (l==r){
40 f[k].s[y]=1;
41 f[k].s[y^1]=0;
42 memset(f[k].a,0,sizeof(f[k].a));
43 for(int i=0;i<3;i++)f[k].a[i][y][y^1]=1;
44 return;
45 }
46 if (x<=mid)update(L,l,mid,x,y);
47 else update(R,mid+1,r,x,y);
48 f[k]=up(f[L],f[R]);
49 }
50 ji query(int k,int l,int r,int x,int y){
51 if ((l>y)||(x>r))return f[0];
52 if ((x<=l)&&(r<=y))return f[k];
53 return up(query(L,l,mid,x,y),query(R,mid+1,r,x,y));
54 }
55 int main(){
56 scanf("%d",&n);
57 for(int i=1;i<=n;i++)scanf("%d",&a[i]);
58 for(int i=1;i<=n;i++)update(1,1,n,i,a[i]);
59 f[0].s[0]=-1;
60 scanf("%d",&m);
61 for(int i=1;i<=m;i++){
62 scanf("%d%d",&p,&x);
63 if (p==1)update(1,1,n,x,a[x]^=1);
64 else{
65 scanf("%d",&y);
66 ll ans=(y-x+2LL)*(y-x+1)/2;
67 o=query(1,1,n,x,y);
68 for(int j=0;j<3;j++)ans-=o.a[0][1][j];
69 for(int j=0;j<2;j++)ans-=o.a[0][3][j];
70 printf("%lld\n",ans);
71 }
72 }
73 }
[bzoj5294]二进制的更多相关文章
- 【BZOJ5294】[BJOI2018]二进制(线段树)
[BZOJ5294][BJOI2018]二进制(线段树) 题面 BZOJ 洛谷 题解 二进制串在模\(3\)意义下,每一位代表的余数显然是\(121212\)这样子交替出现的. 其实换种方法看,就是\ ...
- 2019.02.12 bzoj5294: [Bjoi2018]二进制(线段树)
传送门 题意简述: 给出一个长度为nnn的二进制串. 你需要支持如下操作: 修改每个位置:1变0,0变1 询问对于一个区间的子二进制串有多少满足重排之后转回十进制值为333的倍数(允许前导000). ...
- BZOJ5294 BJOI2018二进制(线段树)
二进制数能被3整除相当于奇数.偶数位上1的个数模3同余.那么如果有偶数个1,一定存在重排方案使其合法:否则则要求至少有两个0且至少有3个1,这样可以给奇数位单独安排3个1. 考虑线段树维护区间内的一堆 ...
- 中国石油大学(华东)暑期集训--二进制(BZOJ5294)【线段树】
问题 C: 二进制 时间限制: 1 Sec 内存限制: 128 MB提交: 8 解决: 2[提交] [状态] [讨论版] [命题人:] 题目描述 pupil发现对于一个十进制数,无论怎么将其的数字 ...
- BZOJ5294 BJOI2018 二进制 线段树
传送门 因为每一位\(\mod 3\)的值为\(1,2,1,2,...\),也就相当于\(1,-1,1,-1,...\) 所以当某个区间的\(1\)的个数为偶数的时候,一定是可行的,只要把这若干个\( ...
- BZOJ5294 [BJOI2018] 二进制 【线段树】
BJOI的题目感觉有点难写 题目分析: 首先推一波结论.接下来的一切都在模3意义下 现在我们将二进制位重组,不难发现的是2^0≡1,2^1≡2,2^2≡1,2^3≡2....所以我们考虑这样的式子 2 ...
- Bzoj5294/洛谷P4428 [Bjoi2018]二进制(线段树)
题面 Bzoj 洛谷 题解 考虑一个什么样的区间满足重组之后可以变成\(3\)的倍数.不妨设\(tot\)为一个区间内\(1\)的个数.如果\(tot\)是个偶数,则这个区间一定是\(3\)的倍数,接 ...
- 使用struct处理二进制
有的时候需要用python处理二进制数据,比如,存取文件.socket操作时.这时候,可以使用python的struct模块来完成. struct模块中最重要的三个函数是pack(), unpack( ...
- 如何开启MySQL 5.7.12 的二进制日志
1. 打开/etc下的my.cnf文件 2. 编辑它,添加内容: log_bin=binary-log #二进制日志的文件名 server_id=1 #必须指定server_id,这是MySQL ...
随机推荐
- java笔记(一直更新)
.equals()调用时,最好把equals前面放常量或者是确定有的,如果是前面是null,则会报空指针错误 也可以在调用前判断是否为null
- FastAPI 学习之路(四)
系列文章: FastAPI 学习之路(一)fastapi--高性能web开发框架 FastAPI 学习之路(二) FastAPI 学习之路(三) 之前的文章分享了如何去在请求中增加参数,本文我们将分享 ...
- DFS与BFS题解:[kaungbin]带你飞 简单搜索 解题报告
DFS and BFS 在解题前我们还是大致讲一下dfs与bfs的.(我感觉我不会bfs) 1.DFS dfs(深度优先算法) 正如其名,dfs是相当的深度,不走到最深处绝不回头的那种. 深度优先搜 ...
- Intellij IDEA使用姿势
Intellij IDEA 智能补全的 10 个姿势,太牛逼了.. Intellij Idea非常6的10个姿势
- 240.搜索二维矩阵II
从左下角位置开始搜索 时间复杂度:O(行数+列数). 想法有点像二分法,大了往一个方向找,小了往另一个方向找.由于矩阵横向和纵向都是递增,如果从(0,0)位置开始找,往右和往下都是增大,因此不知道实际 ...
- Codeforces1575D
思路分析 此题采用dfs,注意X选中了之后所有的X值相同,所以需要一个flag来存储X的值. 注意前导0要单独讨论,然后就是当'X'或者'_'在第一位时不能选0,其它位可以选0 - 9 任意一个数. ...
- Beta版本发布计划
Beta版本新功能 小程序v2.0新功能 新功能列表 页面 新功能描述 图片涂鸦页 增加了马赛克方块形式的涂鸦,同样支持撤销和保存 图片裁切页 增加了图片裁切功能,实现对目标图片的尺寸进行裁切 编辑图 ...
- “介绍一下自己吧”——记2020BUAA软工团队介绍和采访
写在前面 项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任建) 这个作业的要求在哪里 团队作业-团队介绍和采访 团队介绍 团队名称 我们是 BUAA软软软件工程小队 ,简称 ...
- freemarker中使用String字符串作为模板
在日常开发中,我们有时候需要发送短信.邮件等通知,但是这些通知的内容通常都是动态的,而且可能会发生变动,为了程序的灵活性,我们通常会将通知的内容配置在页面上,然后后台通过渲染这些模板,来获取具体的内容 ...
- Stack2 攻防世界题目分析
---XCTF 4th-QCTF-2018 前言,怎么说呢,这题目还是把我折磨的可以的,我一开始是没有看到后面的直接狙击的,只能说呢. 我的不经意间的粗心,破坏了你许多的温柔 1.气的我直接检查保护: ...