[bzoj4942]整数
考虑暴力,即需要考虑如何实现$\pm 2^{k}$,相当于要找到之后的第一个0或者之前的第一个1(维护区间是否全0/1即可),然后区间重置,可以用线段树维护,复杂度为$o(900n)$(a的划分和线段树),无法通过 但由于数据范围很大,这样过不了,可以想到压位,每30位二进制压为一个数,那么复杂度降为$o(30n)$(因为a只要划分为最多两个数)且常数变小,可以通过 1 #include<bits/stdc++.h> 2 using namespace std; 3 #define N 1000100 4 #define L (k<<1) 5 #define R (L+1) 6 #define mid (l+r>>1) 7 #define S (1<<30) 8 int n,p,x,y,f[N],laz[N<<2],pos[N<<2],vis[N<<2][2]; 9 int pd(int k){ 10 if (!k)return 0; 11 if (k==S-1)return 1; 12 return -1; 13 } 14 void build(int k,int l,int r){ 15 laz[k]=-1; 16 vis[k][0]=1; 17 if (l==r){ 18 pos[k]=l; 19 return; 20 } 21 build(L,l,mid); 22