首页 > 其他分享 >练习选讲(2023)

练习选讲(2023)

时间:2023-06-09 23:55:58浏览次数:54  
标签:练习 return idx int 选讲 tree 2023 delta size

6 月

6.9:

P1486 [NOI2004] 郁闷的出纳员:平衡树(蓝)

题解:

用一个变量 \(delta\) 记录员工们的工资变化量。

对于插入操作 I k,向平衡树中插入一个数 \(k-delta\)(其他人都增加了 \(delta\),但他没有增加,相当于其他人不增加,他减小 \(delta\))。

对于全局加法操作 A k,直接将 \(delta\) 增加 \(k\) 即可。

对于全局减法操作 S k,将 \(delta\) 减少 \(k\),同时删除平衡树中小于 \(min-delta\) 的数(与插入操作思想类似)。

对于查询排名操作 F k,在平衡树上二分查找即可。若遍历到 \(0\) 号节点则返回 \(-1\)。

用 fhq-treap 实现,时间复杂度 \(O(n\log n)\)。

点击查看代码
#include <iostream>
#include <cstdio>
#include <algorithm>

using namespace std;

const int N = 3e5+10;

int n, minl, ans, delta, idx, root; // delta 表示所有员工的工资变化量

struct Node {
	int l, r;
	int val, key; // BST, 堆
	int size; 
} tree[N];

void pushup(int u) {
	tree[u].size = tree[tree[u].l].size + tree[tree[u].r].size + 1;
}

int newNode(int v) {
	++ idx;
	tree[idx].l = tree[idx].r = 0;
	tree[idx].val = v, tree[idx].key = rand();
	tree[idx].size = 1;
	return idx;
}

void split(int p, int v, int &x, int &y) { // 按 v 分裂子树, 左子树小于等于x, 右子树大于x 
	if (!p) {x = y = 0; return ;}
	if (tree[p].val <= v) {
		x = p;
		split(tree[p].r, v, tree[p].r, y);
	} else {
		y = p;
		split(tree[p].l, v, x, tree[p].l);
	}
	pushup(p);
}

int merge(int x, int y) { // 合并子树, x中的值均小于y中的值 
	if (!x || !y) return x + y;
	if (tree[x].key <= tree[y].key) {
		tree[x].r = merge(tree[x].r, y);
		pushup(x); return x;
	} else {
		tree[y].l = merge(x, tree[y].l);
		pushup(y); return y;
	}
}

void insert(int v) { // 插入 v 
	int x, y, z;
	split(root, v, x, z);
	y = newNode(v);
	root = merge(merge(x, y), z);
}

void del(int v) { // 删除小于v的数 
	int x, y;
	split(root, v-1, x, y);
	ans += tree[x].size;
	root = y; 
}

int get_num(int p, int k) { // 在以p为根的子树内查询第 k 大数 
	if (!p) return -1;
	if (tree[tree[p].r].size >= k) return get_num(tree[p].r, k);
	if (tree[tree[p].r].size+1 == k) return tree[p].val;
	return get_num(tree[p].l, k-tree[tree[p].r].size-1);
}

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0), cout.tie(0); 
	
	cin >> n >> minl;
		
	char op; int k;
	while (n -- ) {
		cin >> op >> k;
		if (op == 'I') {
			if (k < minl) continue;
			insert(k-delta); 
		} else if (op == 'A') {
			delta += k;
		} else if (op == 'S') {
			delta -= k;
			del(minl-delta);
		} else {
			int t = get_num(root, k);
			cout << ((t == -1) ? t : t+delta) << '\n';
		}
	}
	
	cout << ans << '\n';
	return 0;
} 

标签:练习,return,idx,int,选讲,tree,2023,delta,size
From: https://www.cnblogs.com/Jasper08/p/17470540.html

相关文章

  • 北美 2023 被裁员的感悟(一周以后)
    北美2023被裁员的感悟 发布一周以后,没想到在网络有了好几千的围观还收获了不少的评论。更多的是情绪的另外一种转变。  可以开始在外面烤点,顺便思考下一步的发展和路径。有时候,环境的变化更会刺激去思考。情绪裁员或者被裁这种事情,本身就每天都在发生的事情,其实并没有什么太多......
  • 北美 2023 被裁员的感悟(一周以后)
    北美2023被裁员的感悟 发布一周以后,没想到在网络有了好几千的围观还收获了不少的评论。更多的是情绪的另外一种转变。  可以开始在外面烤点,顺便思考下一步的发展和路径。有时候,环境的变化更会刺激去思考。情绪裁员或者被裁这种事情,本身就每天都在发生的事情,其实并......
  • 20230609 感谢博客园
    几年都没有登录了,在短视频、新媒体发达的现在,在少有人静心写博客的现在,博客园能坚持下来,没把我的博客弄丢,没迁移到这里那里,由衷地感谢!又一个曾经前沿配置的电脑硬盘告急,来搜自己曾经记下的换SSD攻略,恍惚一个时代又过去了。......
  • 2023-06-09:什么是Redis事务?原理是什么?
    2023-06-09:什么是Redis事务?原理是什么?答案2023-06-09:Redis中的事务是以一组命令的形式出现的,这些命令被认为是最小的执行单位。事务可以保证在一个单独独立的隔离操作中执行所有命令,而且所有命令都会按照指定的顺序经过序列化后被执行。在服务端执行事务的过程中,不受其他客户端发送......
  • 2023-06-09:什么是Redis事务?原理是什么?
    2023-06-09:什么是Redis事务?原理是什么?答案2023-06-09:Redis中的事务是以一组命令的形式出现的,这些命令被认为是最小的执行单位。事务可以保证在一个单独独立的隔离操作中执行所有命令,而且所有命令都会按照指定的顺序经过序列化后被执行。在服务端执行事务的过程中,不受其他客户端......
  • 2023高考第一天,用ChatGPT挑战全国卷作文,已达到双一流高校学生水平?
    前言2023年高考语文结束啦,今天我们用ChatGPT来挑战高考作文,一起来看看它的表现如何?ChatGPT突然爆火网络,它真的会取代人类的工作吗?什么是ChatGPT?ChatGPT是由OpenAI开发的,OpenAI是一家由伊隆·马斯克和其他著名科技企业家共同创立的人工智能研究公司。OpenAI旨在推动人工智能技术......
  • Parallels Desktop 安装 Archlinux(2023教程)
    ParallelsDesktop中安装ArchLinux(硬核版)##1.事先准备+1.基本配置:MacBookPro(Retina,13inch,Mid2015,Catalina10.15.7),ParalleDesktop18.1.1+2.镜像:Archlinux2023.05.1+镜像下载站:+清华镜像+https://mirrors.tuna.tsinghua.edu.cn/+中科大镜像站+https://mirrors.ustc.......
  • 人民日报推荐:2023年必读的100本经典好书
    中国篇 1.《论语·大学·中庸》  儒家学说经典合辑,阐述儒学哲学核心思想,汇集学习与传承的篇章。2.《干家诗·神童诗·名贤集·增广贤文》  行孝道、做善事,珍惜时间,勤学苦读体现了其独特的文化魅力和思想价值。3.《弟子规·三字经·百家姓·干字文》  被......
  • 专业角色动画制作-Character Animator 2023 win中文
    CharacterAnimator2023是Adobe公司推出的一款专业角色动画制作软件,它的主要功能是将用户的实时动作转换为角色动画,能够快速创建高质量的动画作品。→→↓↓载CharacterAnimator2023win 一、界面介绍CharacterAnimator2023的界面非常简洁,分为三个主要部分:舞台、面板和......
  • 极客时间训练营高级Java工程师体系课2023版2.0
    极客时间训练营高级Java工程师体系课2023版2.0download:3w51xuebccomRedis核心数据结构实战与高性能原理剖析Redis是一款开源的内存数据库,它提供了丰富的数据结构和API,并支持多种数据类型操作。在深入理解Redis核心数据结构实战和高性能原理之前,我们需要了解以下基础知识:Redis数据......