传送门:bzoj5294
题解
一个二进制数是三的倍数,当且仅当有偶数个1 或者 有三个及以上的1和两个及以上的0。
不合法的区间即为有1个1 或 奇数个1&0/1个0的情况。
线段树维护即可,打标记有点麻烦。。。
代码
#include<bits/stdc++.h>
#define lc k<<1
#define rc k<<1|1
#define mem(f) memset((f),0,sizeof((f)))
using namespace std;
const int N=1e5+10;
typedef long long ll;
int n,m,ini[N],pr;
char cp;
inline void rd(int &x)
{
cp=getchar();x=0;
for(;!isdigit(cp);cp=getchar());
for(;isdigit(cp);cp=getchar()) x=(x<<3)+(x<<1)+(cp^48);
}
struct Ag{
struct node{
ll a[4][2][2],b[4][2];
}t[N<<2],rep;
inline node merge(node l,node r)
{
node k;int i,j,ii,jj,v,vv;
for(i=0;i<2;++i){
for(j=0;j<2;++j){
k.a[0][i][j]