传送门

先考虑二进制下为3倍数的数的共同特点自己手玩去,可以发现这些数奇数二进制位上的1个数(记为\(a\))和偶数二进制位上的1个数(记为\(b\))在模3意义下相等(\(a \equiv b (mod 3)\)),所以可以维护所有前缀中,\(a\)为0/1/2以及\(b\)为0/1/2的前缀个数,用线段树维护每个区间的这些值.但是合并的时候,我们还需要知道前一个区间的最后一个前缀的\(a,b\)状态,所以把这个也维护起来.每次就单点修改,询问就把某个区间的所有状态的前缀个数抠出来,然后分类讨论一下(逃

代码里记录状态是\(a-b\)在模3意义下为0/1/2的前缀个数,以及最后一个前缀的0/1/2状态,这样比较方便(雾)

(因为实在不知道怎么写,就看代码吧

#include<bits/stdc++.h>
#define LL long long
#define il inline
#define re register
#define db double
#define eps (1e-5) using namespace std;
const int N=500000+10;
il LL rd()
{
LL x=0,w=1;char ch=0;
while(ch<'0'||ch>'9') {if(ch=='-') w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') {x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
return x*w;
}
#define lc (o<<1)
#define rc ((o<<1)|1)
#define mid ((l+r)>>1)
struct node
{
int wb[3],las;
node(){wb[0]=wb[1]=wb[2]=las=0;}
}s[N<<2],nw;
il node ad(node a,node b)
{
node an;
an.las=(a.las+b.las)%3;
for(int i=0;i<3;i++) an.wb[i]=a.wb[i]+b.wb[(i-a.las+3)%3];
return an;
}
void bui(int o,int l,int r)
{
if(l==r)
{
if(rd()&1) s[o].wb[2-(l&1)]=1,s[o].las=2-(l&1);
else s[o].wb[0]=1;
return;
}
bui(lc,l,mid),bui(rc,mid+1,r);
s[o]=ad(s[lc],s[rc]);
}
void modif(int o,int l,int r,int lx)
{
if(l==r)
{
if(s[o].las) s[o].wb[2-(l&1)]=s[o].las=0,s[o].wb[0]=1;
else s[o].wb[2-(l&1)]=1,s[o].las=2-(l&1),s[o].wb[0]=0;
return;
}
if(lx<=mid) modif(lc,l,mid,lx);
else modif(rc,mid+1,r,lx);
s[o]=ad(s[lc],s[rc]);
}
node quer(int o,int l,int r,int ll,int rr)
{
if(ll<=l&&r<=rr) return s[o];
node a,b;
if(ll<=mid) a=quer(lc,l,mid,ll,rr);
if(rr>mid) b=quer(rc,mid+1,r,ll,rr);
return ad(a,b);
}
int n,m;
LL ans; int main()
{
n=rd(),m=rd();
bui(1,1,n);
while(m--)
{
int op=rd();
if(op&1) modif(1,1,n,rd());
else
{
ans=0;
int l=rd(),r=rd();
nw=quer(1,1,n,l,r);++nw.wb[0];
ans=1ll*nw.wb[0]*(nw.wb[0]-1)/2+1ll*nw.wb[1]*(nw.wb[1]-1)/2+1ll*nw.wb[2]*(nw.wb[2]-1)/2;
printf("%lld\n",ans);
}
}
return 0;
}

Wannafly挑战赛17D 01序列2的更多相关文章

  1. 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 ...

  2. Wannafly挑战赛27

    Wannafly挑战赛27 我打的第一场$Wannafly$是第25场,$T2$竟然出了一个几何题?而且还把我好不容易升上绿的$Rating$又降回了蓝名...之后再不敢打$Wannafly$了. 由 ...

  3. Wannafly 挑战赛 19 参考题解

    这一次的 Wannafly 挑战赛题目是我出的,除了第一题,剩余的题目好像对大部分算法竞赛者来说好像都不是特别友好,但是个人感觉题目质量还是过得去的,下面是题目链接以及题解. [题目链接] Wanna ...

  4. Wannafly挑战赛22游记

    Wannafly挑战赛22游记 幸运的人都是相似的,不幸的人各有各的不幸. --题记 A-计数器 题目大意: 有一个计数器,计数器的初始值为\(0\),每次操作你可以把计数器的值加上\(a_1,a_2 ...

  5. Wannafly挑战赛18 E 极差(线段树、单调栈)

    Wannafly挑战赛18 E 极差 题意 给出三个长度为n的正整数序列,一个区间[L,R]的价值定义为:三个序列中,这个区间的极差(最大值与最小值之差)的乘积. 求所有区间的价值之和.答案对\(2^ ...

  6. Wannafly挑战赛21:C - 大水题

    链接:Wannafly挑战赛21:C - 大水题 题意: 现在给你N个正整数ai,每个数给出一“好数程度” gi(数值相同但位置不同的数之间可能有不同的好数程度).对于在 i 位置的数,如果有一在j位 ...

  7. Wannafly挑战赛5 A珂朵莉与宇宙 前缀和+枚举平方数

    Wannafly挑战赛5 A珂朵莉与宇宙 前缀和+枚举平方数 题目描述 给你一个长为n的序列a,有n*(n+1)/2个子区间,问这些子区间里面和为完全平方数的子区间个数 输入描述: 第一行一个数n 第 ...

  8. Wannafly挑战赛13 zzf的好矩阵 题解 答案解释

    Wannafly挑战赛13 zzf的好矩阵 题解 文章目录 Wannafly挑战赛13 zzf的好矩阵 题解 分析 结论1 结论2 结论3 C数组对应带子说明 空白长度论述 后续黑色长度论述 能&qu ...

  9. Wannafly挑战赛25游记

    Wannafly挑战赛25游记 A - 因子 题目大意: 令\(x=n!(n\le10^{12})\),给定一大于\(1\)的正整数\(p(p\le10000)\)求一个\(k\)使得\(p^k|x\ ...

随机推荐

  1. 一个很初级的错误 Destructor忘记override导致内存泄露

      TxxObj= class    public     Destructor Destroy(); override;!!!此处若无override,将导致内存泄露     end; Destru ...

  2. 常见的HTTP报头(头参数)

    本内容摘抄自<RESTful WebServices> 中文译本附录C '常见的HTTP报头'. 原文作者:Leonard Ricbardson & Sam Ruby 翻译:徐涵. ...

  3. MySQL-如何删除hash表分区

    一个大表,之前是以hash分区表的形式存在的, MySQL> show create table history_uint; | history_uint | CREATE TABLE `his ...

  4. Nginx PREACCESS阶段 如何限制每个客户端每秒处理请求数

    L:56 limit_req_zone $binary_remote_addr zone=one:10m rate=2r/m;#以用户IP作为key 开辟共享内存10M 并且限制每分钟2个请求 rat ...

  5. 类加载过程&对象的创建过程

    类加载过程 1.JVM发现要使用一个类,首先要到方法区中找:如果找到了,就直接使用,如果没有找到,才会去找这个类的class文件,然后加载: (在找class文件时,是根据classpath配置的地址 ...

  6. Code POJ - 1780(栈模拟dfs)

    题意: 就是数位哈密顿回路 解析: 是就算了...尼玛还不能直接用dfs,得手动开栈模拟dfs emm...看了老大半天才看的一知半解 #include <iostream> #inclu ...

  7. poj3278 【BFS】

    Catch That Cow Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 97240   Accepted: 30519 ...

  8. 获取外网出口ip

    curl ifconfig.me 或 curl cip.cc

  9. PD915温度太高,通过设置BIOS降底CPU的核心电压来降温。

    由于对电脑配置不是很懂,去年去配了台电脑,用的CPU是PD915,不用不知道,一用吓一跳. PD915在冬天的时候,运行起来温度大概在30多度,感觉很正常. 可是一到了夏天,温度就升到了70到80度之 ...

  10. shelve模块(二十三)

    shelve模块比pickle模块简单,只有一个open函数,返回类似字典的对象,可读可写; key必须为字符串,而值可以是python所支持的数据类型 用的比较少 目的: 将字典写入文件保存起来 i ...