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. 目前国内可用Docker镜像源汇总(截至2024年11月)

    本文主要讲述了由于特殊原因国内的 Docker 镜像源出现问题,国内许多常见的镜像源如网易.百度等已不可用.文中介绍了中科大镜像源的暂时关闭情况,以及阿里镜像源包括私人阿里镜像加速器的使用方式,并提供 ...

  2. 短信接口被刷爆:我用Nginx临时止血

    最近,朋友公司遇到了一件让他们"寝食难安"的事:他们的短信验证码接口被人盯上了,充进去的钱没多久就被刷得一分不剩.不充钱,业务直接受影响:但充钱吧,就像往无底洞里灌水.他们联系短信 ...

  3. 记一次 .NET某云HIS系统 CPU爆高分析

    一:背景 1. 讲故事 年前有位朋友找到我,说他们的系统会偶发性的CPU爆高,有时候是爆高几十秒,有时候高达一分多钟,自己有一点分析基础,但还是没找到原因,让我帮忙看下怎么回事? 二:CPU爆高分析 ...

  4. FastAPI与Tortoise-ORM实现关系型数据库关联

    title: FastAPI与Tortoise-ORM实现关系型数据库关联 date: 2025/04/21 10:51:41 updated: 2025/04/21 10:51:41 author: ...

  5. require、include、require_once和use的区别/命名空间的使用方法

    1.require.include require.include都是文件包含,不同的是require语句会输出错误信息,并且立即终止脚本处理.而include语句在没有找到文件时则会输出警告,不会终 ...

  6. windows系统如何开启远程连接

    一.RDP远程桌面介绍 RDP远程桌面即远程桌面系统(Remote Desktop Protocol),是内置于windows系统的网络通信协议.通过RDP,用户可以远程登录到运行windows系统的 ...

  7. 记录一次SpringBoot + Vue前后分离项目的部署流程

    前言 本教程使用黑马 SpringBoot3+Vue3全套视频教程 大事件项目作为前后端代码. 前置需要: mysql jdk redis nginx linux环境 打包 前端 构建项目命令 npm ...

  8. spring boot迁移计划 第Ⅰ章 --chapter 1. rust hyper 结合rust nacos-client开发nacos网关 part ③ toml配置文件

    1. toml依赖 toml = "0.8" 2. 代码 由于项目还未完成,部分配置(如数据库等)还未增加,后续更新增加 use log::info; use serde::Des ...

  9. live555开发笔记(三):live555创建RTSP服务器源码剖析,创建h264文件rtsp服务器源码深度剖析

    前言   对于live555的rtsp服务器有了而基本的了解之后,进一步对示例源码进行剖析,熟悉整个h264文件流媒体的开发步骤.   Demo         播放本地文件,多路播放的时候,总是以第 ...

  10. 一套基于 Bootstrap 和 .NET Blazor 的开源企业级组件库

    前言 今天大姚给大家分享一套基于 Bootstrap 和 .NET Blazor 的开源企业级组件库:Bootstrap Blazor. 项目介绍 BootstrapBlazor 是一套基于 Boot ...