Codeforces Round 890 (Div. 2) E2. PermuTree (hard version) (主席树/树状数组/差分+前缀和)

题目

有一个初始为空的数组,你需要处理q(q<=1e6)次操作,操作分四种:

① + x,数组后面加一个新的数x

② - k,删掉数组最后面的k个值

③ !,回滚最后一次变更(只有①操作和②操作视为变更)

④?,询问当前数组内的不同的数的个数(即数的种类数)

E1允许离线,E2强制在线,需要每次输出答案后刷新缓冲区

思路来源

jjleo代码/jiangly代码/官方题解

心得

这个题赛中一看,这不主席树sb题,结果写了一发喜提MLE

然后以为卡卡空间就卡过去了,结果卡了6个小时空间才卡过去,喜提-200分掉到蓝名成就

画风

3s、256M,可以说是非常极限了(不过还没有加快读)

最后卡过去的提交是,考虑到数字都在[0,2^{25}),所以,

用三个unsigned char和一位的bitset模拟了下int,

大概把空间大概压到了3/4(感觉纯纯脑瘫)

题解

主席树

朴素

1. 加数时,按照询问动态开点,在主席树上建一条链

2. 查询时,就全局查询数的种类数,实际只需要用到根节点

3. 回滚时,维护一个数组记录一下操作的点号的序列,退到前一个

4. 删除时,倍增往上跳k个

主席树需要维护lson、rson、num三个变量,num从0变1表示新增,其余非新增,

每个空间1e6*20大概2e7,三个6e7,倍增也需要开1e6*20=2e7,

这样做空间总共约8e7,而256M空间只能开下约6e7的数组

优化

不需要num这个变量

当主席树上建一条新链的时候,在进入叶子结点前,

先判断一下叶子结点这个方向的点是否存在,

已经存在就说明种类数没有新增,否则是新增了一个值

而询问只需要全局询问根,所以只需要每个节点记录一下答案

从而将1e6*20的空间优化到了1e6

树状数组

待补

差分+前缀和O(n)

待补

代码

主席树优化

#include <bits/stdc++.h>
#define maxn 1000086using namespace std;int read(){int x = 0, f = 1;char ch = getchar();while(ch > '9' || ch < '0'){if(ch == '-') f = -1;ch = getchar();}while(ch >= '0' && ch <= '9'){x = x * 10 + ch -'0';ch = getchar();}return x * f;
}struct Node{int son[2];
}t[maxn * 21];#define ls(x) (t[x].son[0])
#define rs(x) (t[x].son[1])int cnt;int modify(int x, int l, int r, int pos){int tag = 0;while(l < r){int mid = l + r >> 1;if(mid >= pos){if(!ls(x)) tag = 1;t[++cnt] = t[ls(x)], x = ls(x) = cnt, r = mid;}else{if(!rs(x)) tag = 1;t[++cnt] = t[rs(x)], x = rs(x) = cnt, l = mid + 1;} }return tag;
}int q;
int fa[maxn][20];
char s[10];
int tot = 1;
int a[maxn], siz;
int ans[maxn], rt[maxn];int main(){q = read();int now = 1;while(q--){scanf("%s", s);if(s[0] == '+'){int x;x = read();int p = ++tot;fa[p][0] = now;for(int i = 1;i < 20;i++) fa[p][i] = fa[fa[p][i - 1]][i - 1];rt[p] = ++cnt;t[rt[p]] = t[rt[now]];ans[p] = ans[now] + modify(rt[p], 1, 1e6, x);now = p;a[++siz] = now;}else if(s[0] == '-'){int k;k = read();for(int i = 0;i < 20;i++) if(k & (1 << i)) now = fa[now][i];a[++siz] = now;}else if(s[0] == '!'){now = a[--siz];}else{printf("%d\n", ans[now]), fflush(stdout);}}
}

主席树朴素(空间卡常)

#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i=(a);i<=(b);++i)
#define per(i,a,b) for(int i=(a);i>=(b);--i)
typedef long long ll;
typedef double db;
typedef pair<ll,ll> P;
#define fi first
#define se second
#define pb push_back
#define dbg(x) cerr<<(#x)<<":"<<x<<" ";
#define dbg2(x) cerr<<(#x)<<":"<<x<<endl;
#define SZ(a) (int)(a.size())
#define sci(a) scanf("%d",&(a))
#define pt(a) printf("%d",a);
#define pte(a) printf("%d\n",a)
#define ptlle(a) printf("%lld\n",a)
#define debug(...) fprintf(stderr, __VA_ARGS__)
const int N=1e6+10,M=N*22,INF=0x3f3f3f3f,lb=(1<<8)-1,mx=1<<24;
int q,x,y,cur,par[N][10],up=1000000;
int root[N],pos;
int op[N],c;
char s[5];
bitset<M>most[2];
struct node{unsigned char a[3];int g(){int f=0;for(int i=2;i>=0;--i){f=(f<<8)|a[i];}return f;}void s(int x){//assert(x<(1<<20));for(int i=0;i<3;++i){//printf("x&lb:%d\n",x&lb);a[i]=x&lb;x>>=8;}}
}sum[M];
node operator+(node a,node b){int v1=a.g(),v2=b.g();node c;c.s(v1+v2);return c;
}
struct node2{unsigned char a[3];int g(int p,int id){int f=0;for(int i=2;i>=0;--i){f=(f<<8)|a[i];}if(most[id].test(p))f|=mx;return f;}void s(int p,int id,int x){if(x&mx)most[id].set(p);else most[id].reset(p);for(int i=0;i<3;++i){//printf("x&lb:%d\n",x&lb);a[i]=x&lb;x>>=8;}}
}ch[M][2];
int copy(int x){pos++;//if(pos>=M)while(1);ch[pos][0]=ch[x][0];if(most[0].test(x))most[0].set(pos);ch[pos][1]=ch[x][1];if(most[1].test(x))most[1].set(pos);sum[pos]=sum[x];return pos;
}
void add(int k,int l,int r,int x){if (l==r) {if(!sum[k].g())sum[k].s(1);return;}int mid=(l+r)/2,y=ch[k][0].g(k,0),z=ch[k][1].g(k,1);if (x<=mid){y=copy(y);ch[k][0].s(k,0,y);add(y,l,mid,x);}else{z=copy(z);ch[k][1].s(k,1,z);add(z,mid+1,r,x);}sum[k]=sum[y]+sum[z];
}int ask(int k,int l,int r,int a,int b){if (!k) return 0;if (a==l&&b==r) return sum[k].g();int mid=(l+r)/2;if (b<=mid) return ask(ch[k][0].g(k,0),l,mid,a,b);else if (a>mid) return ask(ch[k][1].g(k,1),mid+1,r,a,b);else return ask(ch[k][0].g(k,0),l,mid,a,mid)+ask(ch[k][1].g(k,1),mid+1,r,mid+1,b);
}void op1(int x){int las=cur;cur=++y;par[cur][0]=las;root[cur]=copy(root[las]);rep(i,1,9){int z=cur;for(int j=1;j<=4;++j){z=par[z][i-1];}par[cur][i]=z;}add(root[cur],1,up,x);op[++c]=las;
}
void op2(int k){int las=cur;for(int i=k,x=0;i;i>>=2,x++){int v=i&3;for(int j=1;j<=v;++j){cur=par[cur][x];}}//printf("cur:%d\n",cur);op[++c]=las;
}
void op3(){cur=op[c--];//printf("cur:%d\n",cur);return;
}
void op4(){printf("%d\n",sum[root[cur]].g());fflush(stdout);
}
int main(){//sum[0].s(125);//printf("%d\n",sum[0].g());sci(q);root[0]=pos=1;while(q--){scanf("%s",s);if(s[0]=='+'){sci(x);op1(x);}else if(s[0]=='-'){sci(x);op2(x);}else if(s[0]=='!'){op3();}else{op4();}}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/98617.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java 项目日志实例:LogBack

点击下方关注我&#xff0c;然后右上角点击...“设为星标”&#xff0c;就能第一时间收到更新推送啦~~~ LogBack 和 Log4j 都是开源日记工具库&#xff0c;LogBack 是 Log4j 的改良版本&#xff0c;比 Log4j 拥有更多的特性&#xff0c;同时也带来很大性能提升。LogBack 官方建…

【Freertos基础入门】同步互斥与通信

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、同步互斥与通信是什么&#xff1f;1.基础概念2.freertos通信可用的手段 二、同步与互斥的概念三、各类通信的区别与适用场景总结 前言 本系列基于stm32系列…

next.js 创建 react ant design ts 项目

环境说明&#xff1a;next.js 官方文档要求node版本在16.8以上。笔者使用的 node版本是16.20.1&#xff0c;不要使用16.13.0&#xff0c;笔者在使用 node16.13.0环境时创建的 react 项目点击事件无效 next.js官网截图 next.js 官网&#xff1a;https://nextjs.org/ react 官网…

gor工具http流量复制、流量回放,生产运维生气

gor是一款流量复制回放工具&#xff0c;gor工具的官网&#xff1a;https://goreplay.org/ 1、对某个端口的http流量进行打印 ./gor --input-raw :8000 --output-stdout 2、对流量实时转发&#xff0c;把81端口流量转发到192.168.3.221:80端口 ./gor --input-raw :81--output-ht…

学C的第三十四天【程序环境和预处理】

相关代码gitee自取&#xff1a; C语言学习日记: 加油努力 (gitee.com) 接上期&#xff1a; 学C的第三十三天【C语言文件操作】_高高的胖子的博客-CSDN博客 1 . 程序的翻译环境和执行环境 在ANSI C(C语言标准)的任何一种实现中&#xff0c;存在两个不同的环境。 &#xff0…

如何取消订阅IEEE membership的email

最近小虎开了一个IEEE Student Member&#xff0c;邮箱都快被IEEE给爆箱了。所以想办法取消订阅其邮件&#xff0c;但是保留其member身份。 方法 在profile界面选择communication preferences and policies, Uncheck所有communications&#xff0c;选择I only want to recei…

Java之接口

作者简介&#xff1a; zoro-1&#xff0c;目前大一&#xff0c;正在学习Java&#xff0c;数据结构等 作者主页&#xff1a; zoro-1的主页 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01;&#x1f496;&#x1f496; Java之接口 接口的概念语法规则接口特性接口使用案…

DTC 19服务学习2

紧跟上篇 0x04 reportDTCSnapshotRecordByDTCNumber 通过DTC和快照序列来获取DTC快照记录。 适用以下假设&#xff1a; — 服务器支持存储给定 DTC 的两个 DTCSnapshot 记录的能力。 — 此示例假定是上一个示例的延续。 — 假设服务器请求服务器存储的 DTC 编号 123456 的两个…

攻防世界-backup

原题 解题思路 备份文件后缀大多是bak、git、svn、swp等&#xff0c;尝试index.php.bak就有文件下载了:

1、攻防世界第一天

1、网站目录下会有一个robots.txt文件&#xff0c;规定爬虫可以/不可以爬取的网站。 2、URL编码细则&#xff1a;URL栏中字符若出现非ASCII字符&#xff0c;则对其进行URL编码&#xff0c;浏览器将该请求发给服务端&#xff1b;服务端会可能会先对收到的url进行解码&#xff0…

【HBZ分享】java中的BitSet 与 Redis中的BitMap 与 布隆过滤器

BitMap的存储原理 bitMap他会标识出某个整数是否存在&#xff0c;存在即为1&#xff0c;不存在对应位即为0bitMap是存储int类型的&#xff0c;int 4byte&#xff0c; 1byte 8bit&#xff0c;因此bitMap数组中的每个下标可以标识出32个数字是否存在bitMap相当于一个个小格子&…

解决方案:如何在 Amazon EMR Serverless 上执行纯 SQL 文件?

《大数据平台架构与原型实现&#xff1a;数据中台建设实战》一书由博主历时三年精心创作&#xff0c;现已通过知名IT图书品牌电子工业出版社博文视点出版发行&#xff0c;点击《重磅推荐&#xff1a;建大数据平台太难了&#xff01;给我发个工程原型吧&#xff01;》了解图书详…

IP 地址监控工具

地址监控实用程序是一套 IP 工具&#xff0c;包括 IP 地址监控工具、流氓检测工具和 MAC 地址解析器&#xff0c;用于日常监控和管理 DNS 名称、IP和 MAC 地址。地址监控工具用于 IP监控&#xff0c;用于管理 DNS 名称、网络的 IP 和 MAC 地址&#xff0c;并跟踪 IP 地址。 IP…

uniapp配置添加阿里巴巴图标icon流程步骤

文章目录 下载复制文件到项目文件夹里项目配置目录结构显示图标 下载 阿里巴巴icon官网 https://www.iconfont.cn/ 复制文件到项目文件夹里 项目配置目录结构 显示图标

智能监控系统的守护者:人工智能行为识别技术的崛起与发展

人工智能助力监控系统&#xff1a;行为识别在安全监控中的应用与挑战 摘要&#xff1a; 随着人工智能技术的快速发展&#xff0c;行为识别在监控系统中的应用逐渐成为安全监控领域的重要工具。本文将详细探讨人工智能行为识别技术在监控系统中的应用&#xff0c;以及在实际应用…

JVM中分代回收机制

为什么要分为新生代和老年代&#xff1f; 分为新生代&#xff08;Young Generation&#xff09;和老年代&#xff08;Old Generation&#xff09;是为了更有效地管理和优化内存的使用。 新生代主要存放生命周期较短的对象&#xff0c;例如方法的局部变量、临时变量等。由于这…

数据结构-二叉树

在学习二叉树之前.必须先要掌握一些树的重要概念: 结点的度:一个结点含有的子树个数称为该结点的度.树的度:一棵树中,所有节点度的最大值称为树的度.叶子结点:度为0的结点称为叶子节点.(也叫终端结点)双亲结点:若一个结点含有子结点,则这个结点称为其子结点的双亲结点(也叫父节…

Egg.js构建一个stream流式接口服务

经常需要用到 stream 流式接口服务,比如&#xff1a;大文件下载、日志实时输出等等。本文将介绍如何使用Egg.js构建一个 stream 流式接口服务。 一、准备工作 目录结构&#xff1a; app//controllerindex.jstest.txttest.shindex.js 控制器test.txt 测试文件&#xff0c;最好…

申请部署阿里云SSL免费证书

使用宝塔自动创建的证书有时候会报NET::ERR_CERT_COMMON_NAME_INVALID&#xff0c;并且每次只能三个月&#xff0c;需要点击续期非常麻烦&#xff0c;容易遗忘。 阿里云免费SSL证书 前往阿里云管理控制台【数字证书管理服务】【SSL证书】&#xff0c;每年20个额度&#xff0c;一…

17.HPA和rancher

文章目录 HPA部署 metrics-server部署HPA Rancher部署Rancherrancher添加集群仪表盘创建 namespace仪表盘创建 Deployments仪表盘创建 service 总结 HPA HPA&#xff08;Horizontal Pod Autoscaling&#xff09;Pod 水平自动伸缩&#xff0c;Kubernetes 有一个 HPA 的资源&…