发现一个区间[L,R]代表的2进制数是3的倍数,当且仅当从L开始的后缀二进制值 - 从R+1开始的后缀二进制值 是 3 的倍数 (具体证明因为太简单而被屏蔽)。

于是我们就可以在每个点维护从它开始的后缀二进制数的值,因为在%3同余系下只有3个数,所以我们可以很容易的用线段树进行区间维护,然后答案就是 C(num[0],2) + C(num[1],2) + C(num[2],2)    [注意如果查询区间是 [l,r]的话那么 在线段树中查找的区间是 [l,r+1] ,因为区间[x,y]对应 x和y+1后缀相减]。

但是有修改咋办呢?

给每个位置设一个权值,后缀长度是奇数的权值是1,反之则是2。

然后稍微动脑子想一下,如果  一个位置修改前是 1  和  这个位置权值是 1  这两个条件只满足其中一个,那么就是对前缀区间 +1;否则就是对前缀区间+2。

所以随便写个线段树打打标记就好啦。

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=500005;
int a[maxn],val[maxn],tag[maxn*4];
int n,m,sum[maxn*4][3],hz[maxn];
int le,ri,W,opt,ans[3]; inline int read(){
int x=0; char ch=getchar();
for(;!isdigit(ch);ch=getchar());
for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';
return x;
} inline int add(int x,int y){ x+=y; return x>=3?x-3:x;} inline void maintain(int o,int lc,int rc){
sum[o][0]=sum[lc][0]+sum[rc][0];
sum[o][1]=sum[lc][1]+sum[rc][1];
sum[o][2]=sum[lc][2]+sum[rc][2];
} inline void CG(int o,int VAL){
int T=sum[o][0];
tag[o]=add(tag[o],VAL);
if(VAL==1){
sum[o][0]=sum[o][2];
sum[o][2]=sum[o][1];
sum[o][1]=T;
}
else{
sum[o][0]=sum[o][1];
sum[o][1]=sum[o][2];
sum[o][2]=T;
}
} inline void pushdown(int o,int lc,int rc){
if(tag[o]){
CG(lc,tag[o]),CG(rc,tag[o]);
tag[o]=0;
}
} void build(int o,int l,int r){
if(l==r){
sum[o][hz[l]]++;
return;
}
int mid=l+r>>1,lc=o<<1,rc=(o<<1)|1;
build(lc,l,mid),build(rc,mid+1,r);
maintain(o,lc,rc);
} void update(int o,int l,int r){
if(l>=le&&r<=ri){
CG(o,W);
return;
}
int mid=l+r>>1,lc=o<<1,rc=(o<<1)|1;
pushdown(o,lc,rc);
if(le<=mid) update(lc,l,mid);
if(ri>mid) update(rc,mid+1,r);
maintain(o,lc,rc);
} void query(int o,int l,int r){
if(l>=le&&r<=ri){
ans[0]+=sum[o][0];
ans[1]+=sum[o][1];
ans[2]+=sum[o][2];
return;
}
int mid=l+r>>1,lc=o<<1,rc=(o<<1)|1;
pushdown(o,lc,rc);
if(le<=mid) query(lc,l,mid);
if(ri>mid) query(rc,mid+1,r);
} inline ll getC(int x){ return x?x*(ll)(x-1)>>1:0;} inline void solve(){
while(m--){
opt=read();
if(opt==1){
le=1,ri=read();
if(a[ri]+val[ri]==2) W=2; else W=1;
a[ri]^=1,update(1,1,n);
}
else{
le=read(),ri=read(),ri++;
ans[0]=ans[1]=ans[2]=0;
query(1,1,n);
printf("%lld\n",getC(ans[0])+getC(ans[1])+getC(ans[2]));
}
}
} int main(){
n=read(),m=read();
for(int i=1;i<=n;i++) a[i]=read();
n++,val[n]=2,hz[n]=0;
for(int i=n-1;i;i--){
val[i]=3-val[i+1];
hz[i]=add(hz[i+1],val[i]*a[i]);
} build(1,1,n);
solve(); return 0;
}

  

SD 胡策 Round 1 T3 彩尾巴猹的二进制数的更多相关文章

  1. 【弱省胡策】Round #5 Count

    [弱省胡策]Round #5 Count 太神仙了. \(DP\)做法 设\(f_{n,m,d,k}\)表示\(n*m\)的矩阵,填入第\(k\)个颜色,并且第\(k\)个颜色最少的一列上有\(d\) ...

  2. 【ContestHunter】【弱省胡策】【Round0】(A)&【Round1】(B)

    DP+容斥原理or补集转化?/KD-Tree 唔……突然发现最早打的两场(打的最烂的两场)没有写记录……(太烂所以不忍记录了吗... 还是把搞出来了的两道题记录一下吧= =勉强算弥补一下缺憾…… Ro ...

  3. 弱省胡策 Magic

    弱省胡策 Magic 求\(n\)个点\(n\)的条边的简单联通图的个数. 毒瘤,还要写高精. 我们枚举环的大小\(k\),\(\displaystyle ans=\sum_{k=3}^nC_n^k ...

  4. luoguP3769 [CH弱省胡策R2]TATT

    luoguP3769 [CH弱省胡策R2]TATT PS:做这题前先切掉 P4148简单题,对于本人这样的juruo更助于理解,当然dalao就当练练手吧 题目大意: 现在有n个四维空间中的点,请求出 ...

  5. [2019多校联考(Round 6 T3)]脱单计划 (费用流)

    [2019多校联考(Round 6 T3)]脱单计划 (费用流) 题面 你是一家相亲机构的策划总监,在一次相亲活动中,有 n 个小区的若干男士和 n个小区的若干女士报名了这次活动,你需要将这些参与者两 ...

  6. 【弱省胡策】Round #5 Construct 解题报告

    这个题是传说中的 Hack 狂魔 qmqmqm 出的构造题.当然要神. 这个题的本质实际上就是构造一个图,然后使得任意两点间都有长度为 $k$ 的路径相连,然后对于任意的 $i < k$,都存在 ...

  7. 【弱省胡策】Round #5 Handle 解题报告

    这个题是我出的 sb 题. 首先,我们可以得到: $$A_i = \sum_{j=i}^{n}{j\choose i}(-1)^{i+j}B_j$$ 我们先假设是对的,然后我们把这个关系带进来,有: ...

  8. 【弱省胡策】Round #6 String 解题报告

    感觉这个题好神啊. 首先我们只管 $a = b$ 的情况,那么我们自然就可以把这个串对 $a$ 取模,然后用 KMP 求出能弄出几个其他的 B 串. 具体就是把串先倍长,然后倒过来,然后求 $Next ...

  9. 【弱省胡策】Round #7 Rectangle 解题报告

    orz PoPoQQQ 的神题. 我的想法是:给每一个高度都维护一个 $01$ 序列,大概就是维护一个 $Map[i][j]$ 的矩阵,然后 $Map[i][j]$ 表示第 $i$ 根柱子的高度是否 ...

随机推荐

  1. python基本操作(五)

    if 判断 if 条件: 代码1 代码2 代码3 代码块(同一缩进级别的代码,例如代码1.代码2和代码3是相同缩进的代码,这三个代码组合在一起就是一个代码块,相同缩进的代码会自上而下的运行) cls ...

  2. Java-basic-7-面向对象

    继承 在Java中,每个子类只能有一个父类,但可以继承多个接口. 子类继承父类,类定义的时候用extends. 继承接口,用implements. 重写 声明为final的方法不能被重写. 声明为st ...

  3. CornerStone使用教程(配置SVN,HTTP及svn简单使用)

    1.SVN配置 假设你公司svn地址为:svn://192.168.1.111/svn/ios,用户名:svnserver,密码:123456 1:填写主机地址 2:如果你的主机地址中有端口号,如为1 ...

  4. 关于 NSData 的数据类型(2进制,16进制之间)及深入剖析

    1. NSData 与 NSString NSData-> NSString NSString *aString = [[NSString alloc initWithData:adataenc ...

  5. hdoj--2082<母函数>

    题目链接 : http://acm.hdu.edu.cn/showproblem.php?pid=2082题目描述:26个字母各有价值,分别是1到26:给出每个字母的个数,求单词价值不超过50 的单词 ...

  6. jQuery全屏滚动插件fullPage.js使用中遇到的问题(滑动轮播效果无效)

    1.fullPage.js是什么? fullPage.js 是一个基于 jQuery ,用来制作全屏网站的插件. 2.兼容性: - jquery兼容:兼容 jQuery 1.7+ - 浏览器兼容: I ...

  7. HDU——1789Doing Homework again(贪心)

    Doing Homework again Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

  8. NOJ——1624死胡同(胡搞模拟)

    [1624] 死胡同 时间限制: 1000 ms 内存限制: 65535 K 问题描述 一个死胡同由排成一列的 n 个格子组成,编号从 1 到 n .实验室的“猪猪”一开始在1号格子,开始向前走,每步 ...

  9. 记录Spring Boot大坑一个,在bean中如果有@Test单元测试,不会注入成功

    记录Spring Boot大坑一个,在bean中如果有@Test单元测试,不会注入成功 记录Spring Boot大坑一个,在bean中如果有@Test单元测试,不会注入成功 记录Spring Boo ...

  10. 马士兵hadoop第四课:Yarn和Map/Reduce配置启动和原理讲解(转)

    马士兵hadoop第一课:虚拟机搭建和安装hadoop及启动 马士兵hadoop第二课:hdfs集群集中管理和hadoop文件操作 马士兵hadoop第三课:java开发hdfs 马士兵hadoop第 ...