wannafly 17D 01序列2
水题。
假设有两个二进制数a,b,c=a+b(a,b拼接起来)
那么显然如果b长度为偶数\(c\mod 3=(b\mod 3+a\mod 3)\mod 3\)
否则\(c\mod 3=(b\mod 3+(a\mod 3)*2)\mod 3\)
那么只要记一个区间的前缀和后缀就行了,合并的时候左儿子的后缀和右儿子的前缀合并。
具体见代码
#include<bits/stdc++.h>
#define il inline
#define vd void
typedef long long ll;
il int gi(){
int x=0,f=1;
char ch=getchar();
while(!isdigit(ch)){
if(ch=='-')f=-1;
ch=getchar();
}
while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
return x*f;
}
int a[500010];
struct yyb{
bool len;
ll l[3][2],r[3],ans,num;
//len表示长度是奇数/偶数
//l[i][j]表示长度为奇数/偶数膜3余0/1/2的前缀数量
//r[i]表示膜3余0/1/2的前缀数量
//ans表示答案
//num表示这个区间膜3
}s[500010<<2];
il yyb operator +(const yyb&a,const yyb&b){
yyb c;
c.len=a.len^b.len;
for(int i=0;i<3;++i)c.l[i][0]=a.l[i][0],c.l[i][1]=a.l[i][1],c.r[i]=b.r[i];
c.ans=a.ans+b.ans;
for(int i=0;i<3;++i)//答案加上中间部分
for(int j=0;j<3;++j)
for(int k=0;k<2;++k)
if((i*(k?2:1)+j)%3==0)c.ans+=a.r[i]*b.l[j][k];
for(int i=0;i<3;++i)
for(int j=0;j<2;++j)
c.l[(a.num*(j?2:1)+i)%3][j^a.len]+=b.l[i][j];
for(int i=0;i<3;++i)c.r[(i*(b.len?2:1)+b.num)%3]+=a.r[i];
c.num=(a.num*(b.len?2:1)+b.num)%3;
return c;
}
#define mid ((l+r)>>1)
il vd set(int x,int p){
s[x].len=1;
memset(s[x].l,0,sizeof s[x].l);
memset(s[x].r,0,sizeof s[x].r);
s[x].ans=!a[p];s[x].num=a[p];
s[x].l[a[p]][1]=s[x].r[a[p]]=1;
}
il vd build(int x,int l,int r){
if(l==r){set(x,l);return;}
build(x<<1,l,mid),build(x<<1|1,mid+1,r);
s[x]=s[x<<1]+s[x<<1|1];
}
il vd update(int x,int l,int r,const int&p){
if(l==r){set(x,l);return;}
if(p<=mid)update(x<<1,l,mid,p);
else update(x<<1|1,mid+1,r,p);
s[x]=s[x<<1]+s[x<<1|1];
}
il yyb query(int x,int l,int r,const int&L,const int&R){
if(L<=l&&r<=R)return s[x];
if(L<=mid)
if(mid<R)return query(x<<1,l,mid,L,R)+query(x<<1|1,mid+1,r,L,R);
else return query(x<<1,l,mid,L,R);
else return query(x<<1|1,mid+1,r,L,R);
}
int main(){
int n=gi(),m=gi();
for(int i=1;i<=n;++i)a[i]=gi();
build(1,1,n);
int o,l,r;
while(m--){
o=gi(),l=gi();
if(o==1)a[l]^=1,update(1,1,n,l);
else r=gi(),printf("%lld\n",query(1,1,n,l,r).ans);
}
return 0;
}
wannafly 17D 01序列2的更多相关文章
- Wannafly挑战赛17D 01序列2
传送门 先考虑二进制下为3倍数的数的共同特点自己手玩去,可以发现这些数奇数二进制位上的1个数(记为\(a\))和偶数二进制位上的1个数(记为\(b\))在模3意义下相等(\(a \equiv b (m ...
- BUPT复试专题—寻找变化前01序列(2016)
题目描述 给你一个01序列,HDLC协议处理的话,如果出现连续的5个1会补1个0.例如1111110,会变成11111010. 现在给你一个经过HDLC处理后的01序列,你需要找到HDLC处理之前的0 ...
- AcWing3544. 寻找变化前的01序列
题目描述 给你一个 01 序列,HDLC 协议处理的话,如果出现连续的 5 个 1 会补 1 个 0. 例如 1111110,会变成 11111010. 现在给你一个经过 HDLC 处理后的 01 序 ...
- Python补充01 序列的方法
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 在快速教程中,我们了解了最基本的序列(sequence).回忆一下,序列包含有定值 ...
- 【动态规划】XMU 1588 01序列计数
题目链接: http://acm.xmu.edu.cn/JudgeOnline/problem.php?id=1588 题目大意: 给n1个0和n2个1,连续的0不超过k1个,连续的1不超过k2个.问 ...
- [Tjoi2016&Heoi2016]排序[01序列]
4552: [Tjoi2016&Heoi2016]排序 Time Limit: 60 Sec Memory Limit: 256 MBSubmit: 994 Solved: 546[Sub ...
- 【Biocode】产生三行的seq+01序列
代码说明: sequence.txt与site.txt整合 如下图: sequence.txt: site.txt: 整理之后如下: 蛋白质序列中发生翻译后修饰的位置标记为“1”,其他的位置标记为“0 ...
- scoi2010&&bzoj1858序列操作
[题目描述] lxhgww最近收到了一个01序列,序列里面包含了n个数,这些数要么是0,要么是1,现在对于这个序列有五种变换操作和询问操作: 0 a b 把[a, b]区间内的所有数全变成0 1 a ...
- 【BZOJ-1858】序列操作 线段树
1858: [Scoi2010]序列操作 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 1961 Solved: 991[Submit][Status ...
随机推荐
- 用字典给Model赋值
用字典给Model赋值 此篇教程讲述通过runtime扩展NSObject,可以直接用字典给Model赋值,这是相当有用的技术呢. 源码: NSObject+Properties.h 与 NSObje ...
- SecureCRT ssh连接linux操作系统(解决Ubutu密钥交换失败的问题)
我们可以使用终端软件SecureCRT 去连接linux操作系统(该SecureCRT服务走端口22,协议是ssh(类似apache走http协议,端口80)),SSH 为 Secure Shell ...
- Linux stat命令详解
stat:查看文件或者文件系统的状态 -->可以查看时间等属性 stat常见命令参数 Usage: stat [OPTION]... FILE... Display file or file ...
- 【php】页面加载优化的14条原则
1. 尽可能的减少 HTTP 的请求数 [content] 2. 使用 CDN(Content Delivery Network) [server] 3. 添加 Expires 头(或者 Cach ...
- [Luogu P4143] 采集矿石 [2018HN省队集训D5T3] 望乡台platform
[Luogu P4143] 采集矿石 [2018HN省队集训D5T3] 望乡台platform 题意 给定一个小写字母构成的字符串, 每个字符有一个非负权值. 输出所有满足权值和等于这个子串在所有本质 ...
- n=n+1 放在print(s)的前/后的影响
# 1+2+3+4+5+6+.....+100 = ? #关键在于,当n为时,才print(s) n = 1s = 0while n < 101: s = s + n if n ==100: # ...
- Maven实战(八)pom.xml简介
目录 pom作为项目对象模型.通过xml表示maven项目,使用pom.xml来实现.主要描述了项目:包括配置文件.开发者需要遵循的规则.缺陷管理系统.组织和licenses.项目的url.项目的依赖 ...
- SGU---103 最短路变形
题目链接: https://cn.vjudge.net/problem/SGU-103#author=ECUST_FZL 题目大意: Dingiville 城市的交通规则非常奇怪,城市公路通过路口相连 ...
- JAVA反射机制教程-获取类对象
1. 什么是类对象 类对象,就是用于描述这种类,都有什么属性,什么方法的 2. 获取类对象 获取类对象有3种方式(1). Class.forName(2). Hero.class(3). new He ...
- Uva10048 Audiophobia (Floyd)
题意:有一个无向带权图,求出两点之间路径的最大边权值最小能为多少. 思路:使用floyd算法跑一边以备查询,每一次跑的过程中dp[i][j]=min(dp[i][j],max(dp[i][k],dp[ ...