题解 CF1515H【Phoenix and Bits】
CF1515H Phoenix and Bits解题报告:
更好的阅读体验
CF*3500的ds题的第一篇题解,好诶!
跑的还挺快,目前cf rk3。
题意
维护大小为
-
1\ x\ y\ z$:将大小在 $x$ 到 $y$ 之间的数按位与 $z -
2\ x\ y\ z$:将大小在 $x$ 到 $y$ 之间的数按位或 $z -
3\ x\ y\ z$:将大小在 $x$ 到 $y$ 之间的数按位异或 $z -
分析
神仙ds,类似平衡树的trie高阶操作。
首先考虑只有
void getxor(int dep,int now,int val){
if(now==0)
return ;
if((val>>(dep-1))&1)
swp(lc[now],rc[now]);
lazy[now]^=val;
}
int query(int dep,int now,int l,int r,int L,int R){
if(now==0||R<l||r<L)
return 0;
if(L<=l&&r<=R)
return res[now];
int mid=(l+r)>>1;
pushdown(dep,now);
return query(dep-1,lc[now],l,mid,L,R)+query(dep-1,rc[now],mid+1,r,L,R);
}
然后考虑
由于每次递归找结点太慢,因此可以直接用一个
因为最高位为
然后是
容易知道每次耗费
AC记录&代码