P11160 【MX-X6-T6】機械生命体

注意到 \(\text{lowbit}\) 是从最低位开始的,所以我们把数字按照二进制位从低位往高位插进字典树。

插入和删除操作是平凡的。查最大 \(\text{lowbit}\) 只需要从根节点开始走,能走使这一位异或为 \(0\) 的边就走这一条边,否则直接返回,因为不可能有更大的 \(\text{lowbit}\) 值。

接下来考虑处理操作 \(3\)。满足要求的数字部分是容易提取的,在字典树上走使这一位异或为 \(0\) 的边,直到第 \(k\) 位。这一位对应的子树中存储的数值肯定满足要求。

然后考虑如何整体增加。我们发现对于如果字典树中的数据整体加 \(1\),最低位为 \(0\) 的数只有最低位会变化,最低位变成 \(1\)。而最低位为 \(1\) 的数最低位变成 \(0\),且之后高一位会增加 \(1\)。这相当于交换左右根节点儿子,并递归处理交换后的左儿子。这启发我们使用懒标记处理这个问题,上述的就是增加过程。

然而对于子树增加,这么做是困难的。因此,我们把这棵满足要求的子树和这棵子树的根到整个树的根分裂出来,打上懒标记,然后再合并回去。这么做的时间复杂度可以类比线段树合并与分裂的时间复杂度,为整体 \(O(n\log n)\)。

最后考虑整体加 \(v\)。我们沿用上面的思路,对于这一位加 \(v\) 其实可以转化为对于下一位加 \(\lfloor\frac{n}{2}\rfloor\)。并且如果 \(v\) 为奇数,就还需要在这一位处理一下加 \(1\),因为这一个加 \(1\) 没有下推。

#include <bits/stdc++.h>
using namespace std;
long long q,op,k,v,x,trie[20000000][2],tol[20000000],ad[20000000],cnt=1;
void pushdown(long long x)
{
if(ad[x]&1)swap(trie[x][0],trie[x][1]),ad[trie[x][0]]++;
ad[trie[x][0]]+=(ad[x]>>1),ad[trie[x][1]]+=(ad[x]>>1),ad[x]=0;
} void insert(long long x)
{
long long rt=1;
tol[rt]++;
for(long long i=0;i<=32;i++)
{
pushdown(rt);
long long id=(x>>i)&1;
if(!trie[rt][id])trie[rt][id]=++cnt;
rt=trie[rt][id],tol[rt]++;
}
} void del(long long x)
{
long long rt=1;
tol[rt]--;
for(long long i=0;i<=32;i++)
{
pushdown(rt);
long long id=(x>>i)&1;
rt=trie[rt][id],tol[rt]--;
}
} long long merge(long long x,long long y)
{
if(!x||!y)return x+y;
pushdown(x),pushdown(y);
tol[x]+=tol[y],trie[x][0]=merge(trie[x][0],trie[y][0]),trie[x][1]=merge(trie[x][1],trie[y][1]);
return x;
} void update(long long x,long long k,long long v)
{
long long rt=1,pt=++cnt,now=pt,pr=0,prt=0,pd=0,tmp=0;
if(k==0)
{
pushdown(rt),ad[rt]+=v;
return;
}
for(long long i=0;i<k;i++)
{
pushdown(rt);
long long id=(x>>i)&1;
if(!trie[rt][id]||!tol[trie[rt][id]])return;
pr=rt,pd=id,prt=pt;
trie[pt][id]=++cnt,rt=trie[rt][id],pt=trie[pt][id];
}
pushdown(rt);
trie[pr][pd]=0,trie[prt][pd]=rt,tmp=tol[rt];
rt=1,pt=now;
for(long long i=0;i<k;i++)
{
pushdown(rt);
long long id=(x>>i)&1;
tol[rt]-=tmp,tol[pt]=tmp;
rt=trie[rt][id],pt=trie[pt][id];
}
ad[now]+=v,merge(1,now);
} long long getmax(long long x)
{
long long rt=1,mx=0;
for(long long i=0;i<=32;i++)
{
pushdown(rt);
long long id=(x>>i)&1;
if(!trie[rt][id]||!tol[trie[rt][id]])return mx;
mx=max(mx,i+1),rt=trie[rt][id];
}
return 32;
} int main()
{
scanf("%d",&q);
for(long long i=1;i<=q;i++)
{
scanf("%lld",&op);
if(op==1)scanf("%lld",&x),insert(x);
else if(op==2)scanf("%lld",&x),del(x);
else if(op==3)scanf("%lld%lld%lld",&x,&k,&v),update(x,k,v);
else if(op==4)scanf("%lld",&x),printf("%lld\n",(1ll<<getmax(x)));
}
return 0;
}

Luogu P11160 【MX-X6-T6】機械生命体 题解的更多相关文章

  1. 【luogu P1879 [USACO06NOV]玉米田Corn Fields】 题解

    题目链接:https://www.luogu.org/problemnew/show/P1879 状压DP. 设dp[i][j]表示第i行,状态为j的方案数 初始dp[0][0] = 1 这样一共12 ...

  2. 【luogu P3258 [JLOI2014]松鼠的新家】 题解

    题目链接:https://www.luogu.org/problemnew/show/P3258 谁说树剖过不去会RE呢? 我今天就是要强行树剖了 树剖强艹 #include <cstdio&g ...

  3. 【luogu P1606 [USACO07FEB]荷叶塘Lilypad Pond】 题解

    题目链接:https://www.luogu.org/problemnew/show/P1606 这个题..第一问很好想,但是第二问,如果要跑最短路计数的话,零边权的花怎么办? 不如这样想,如果这个点 ...

  4. 【luogu P2936 [USACO09JAN]全流Total Flow】 题解

    题目链接:https://www.luogu.org/problemnew/show/P2936 菜 #include <queue> #include <cstdio> #i ...

  5. 【luogu P3128 [USACO15DEC]最大流Max Flow】 题解

    题目链接:https://www.luogu.org/problemnew/show/P3128 菜 #include <cstdio> #include <cstring> ...

  6. 【luogu P2860 [USACO06JAN]冗余路径Redundant Paths】 题解

    题目链接:https://www.luogu.org/problemnew/show/P2860 考虑在无向图上缩点. 运用到边双.桥的知识. 缩点后统计度为1的点. 度为1是有一条路径,度为2是有两 ...

  7. 【luogu P2397 yyy loves Maths VI (mode) 】 题解

    题目链接:https://www.luogu.org/problemnew/show/P2397 卡空间. 对于众数出现次数 > n/2 我们考虑rand. 每次正确的概率为1/2,五个测试点, ...

  8. 【luogu P2341 [HAOI2006]受欢迎的牛】 题解

    题解报告:https://www.luogu.org/problemnew/show/P2341 我们把图中的强连通分量缩点,然后只有出度为0的牛是受欢迎的,这样如果出度为0的牛只有一个,说明受所有牛 ...

  9. 【luogu P2939 [USACO09FEB]改造路Revamping Trails】 题解

    题目链接:https://www.luogu.org/problemnew/show/P2939 本来说是双倍经验题,跟飞行路线一样的,结果我飞行路线拿deque优化SPFA过了这里过不了了. 所以多 ...

  10. 【luogu P4711 「化学」相对分子质量】 题解

    题目链接:https://www.luogu.org/problemnew/show/P4711 要细心模拟 #include <cstdio> #include <algorith ...

随机推荐

  1. SSL测试证书

    1. tomcat 1.1 生成 keytool -genkey -alias tomcat -keyalg RSA -keystore tomcat.keystore -validity 365 过 ...

  2. FREERTOS_LWIP TcpServer 加快接收速度

    刚开始调试时,关注点都在接收缓存等参数上,接受的间隔上限时钟在250ms左右. 后来发现是其中一个参数的设定决定了接收的速度,调整参数后,可以达到每80ms接收1024个字节. 发文留存,备忘.

  3. day11”函数“入门

    函数 函数的作⽤ 函数的使⽤步骤 函数的参数作⽤ 函数的返回值作⽤ 函数的说明⽂档 函数嵌套 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利 ...

  4. FastAPI与SQLAlchemy同步数据库集成

    title: FastAPI与SQLAlchemy同步数据库集成 date: 2025/04/15 01:27:37 updated: 2025/04/15 01:27:37 author: cmdr ...

  5. jmeter操作数据库增删改查的注意事项

    一,场景 1.在jmeter造数据后,可通过数据库查询数据库是否新增数据,判断脚本执行是否成功. 2.有些数据新增不可重复,因此脚本执行后需要将新增的数据删除,才能再次执行脚本. 二.连接数据库 在通 ...

  6. Python实验1 温度转换与输入输出强化

    实验任务: 实现摄氏温度与华氏温度互转(保留两位小数) 扩展功能:输入错误处理(如非数字输入提示重新输入) 扩展:支持开尔文温度的三向转换 源代码:def c_to_f(c): return c * ...

  7. CS及免杀

    Strategic Cyber 责任有限公司发行了适用于 Windows.Linux 和 MacOS X 的 Cobalt Strike 软件包. 要安装 Cobalt Strike,只需将其存档解压 ...

  8. SpringBoot——yaml配置文件

    yaml简介 YAML 是 "YAML Ain't a Markup Language"(YAML 不是一种标记语言).在开发的这种语言时,YAML 的意思其实是:"Ye ...

  9. AutoCAD AutoLISP 中使用 entmake 创建标注样式(DIMSTYLE)的深度解析

    前言 在 AutoCAD 二次开发中,entmake 函数相比 command 命令具有三大核心优势: 高效性:直接操作图形数据库,避免交互式命令延迟 稳定性:消除命令行参数解析导致的不可控错误 精确 ...

  10. C# AggreateException

    在 C# 中,AggregateException 是一种特殊类型的异常,它允许在多个异步任务中捕获并组合多个异常.当在一个异步任务中同时执行多个子任务时,如果其中任何一个子任务抛出了异常,那么父任务 ...