BZOJ_1503 [NOI2004]郁闷的出纳员 【Splay树】
一 题面
二 分析
模板题。
对于全部员工的涨工资和跌工资,可以设一个变量存储起来,然后在进行删除时,利用伸展树能把结点旋转到根的特性,能够很方便的删除那些不符合值的点。同时,维护的结点数量信息也方便我们进行结果的统计。
三 AC代码
1 #include <cstdio>
2 #include <cstring>
3 #include <algorithm>
4 #include <iostream>
5 #include <fstream>
6 using namespace std;
7
8 const int MAXN = 1e5 + 15;
9 class Splay
10 {
11 public:
12 struct Node
13 {
14 Node *ch[2], *fa;
15 int size, key;
16 Node(){
17 ch[0] = ch[1] = fa = NULL;
18 key = size = 0;
19 }
20 void setc(Node *p, bool d){
21 ch[d] = p;
22 p->fa = this;
23 }
24 //判断是父节点的哪个孩子结点
25 bool d(){
26 //是父节点的有儿子
27 return fa->ch[1] == this;
28 }
29 void push_up(){
30 size = ch[0]->size + ch[1]->size + 1;
31 }
32 }*null, *root;
33 Splay(){
34 null = new Node;
35 null->ch[0] = null->ch[1] = null->fa = null;
36 root = null;
37 }
38 void rotate(Node *rt){
39 Node* fa = rt->fa;
40 bool d = rt->d();
41 fa->fa->setc(rt, fa->d());
42 fa->setc(rt->ch[!d], d);
43 rt->setc(fa, !d);
44 fa->push_up();
45 if(root == fa) root = rt;
46 }
47 Node* newNode(const int &key){
48 Node* rt = new Node();
49 rt->key = key;
50 rt->size = 1;
51 rt->ch[0] = rt->ch[1] = rt->fa = null;
52 return rt;
53 }
54 void splay(Node* rt, Node* fa){
55 while(rt->fa != fa){
56 if(rt->fa->fa == fa)
57 rotate(rt);
58 else{
59 //容易出错的位置
60 rt->d() == rt->fa->d() ? rotate(rt->fa) : rotate(rt);
61 rotate(rt);
62 }
63 }
64 rt->push_up();
65 }
66 void insert(const int &key){
67 if(root == null){
68 root = newNode(key);
69 return;
70 }
71 Node* t = root;
72 while(t->ch[key > t->key] != null)
73 t = t->ch[key > t->key];
74 Node* c = newNode(key);
75 t->setc(c, key > t->key);
76 t->push_up();
77 splay(c, null);
78 }
79 Node* get_kth(Node* rt, int k){
80 Node* x = rt;
81 if(x == null)
82 return null;
83 while(x->ch[0]->size + 1 != k){
84 if(k < x->ch[0]->size + 1)
85 x = x->ch[0];
86 else{
87 k -= x->ch[0]->size + 1;
88 x = x->ch[1];
89 }
90 }
91 return x;
92 }
93 };
94
95 int main()
96 {
97 //freopen("input.txt", "r", stdin);
98 //freopen("out.txt", "w", stdout);
99 int n, min, k;
100 int data = 0, Cnt = 0;
101 char c;
102 Splay sptree;
103 scanf("%d %d", &n, &min);
104 while(n--){
105 getchar();
106 scanf("%c %d", &c, &k);
107 if(c == 'I'){
108 if(k < min)
109 continue;
110 sptree.insert(k+data);
111 }
112 else if(c == 'A'){
113 data -= k;
114 }
115 else if(c == 'S'){
116 data += k;
117 sptree.insert(min+data);
118 Cnt += sptree.root->ch[0]->size;
119 sptree.root=sptree.root->ch[1];
120 sptree.root->fa = sptree.null;
121 }
122 else{
123 if(k > sptree.root->size)
124 printf("-1\n");
125 else{
126 k = sptree.root->size - k + 1;
127 printf("%d\n", sptree.get_kth(sptree.root, k)->key-data);
128 }
129 }
130 }
131 printf("%d\n", Cnt);
132 return 0;
133 }
BZOJ_1503 [NOI2004]郁闷的出纳员 【Splay树】的更多相关文章
- BZOJ 1503: [NOI2004]郁闷的出纳员 splay
1503: [NOI2004]郁闷的出纳员 Description OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作 ...
- NOI2004 郁闷的出纳员 Splay
郁闷的出纳员 [问题描述] OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常, ...
- 【BZOJ1503】 [NOI2004]郁闷的出纳员 splay
splay模板题,都快把我做忧郁了. 由于自己调两个坑点. 1.删除时及时updata 2.Kth 考虑k满足该点的条件即r->ch[1]->size+1<=k && ...
- 洛谷P1486 [NOI2004]郁闷的出纳员(splay)
题目描述 OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常调整员工的工资 ...
- BZOJ1503 [NOI2004]郁闷的出纳员 splay
原文链接http://www.cnblogs.com/zhouzhendong/p/8086240.html 题目传送门 - BZOJ1503 题意概括 如果某一个员工的工资低于了min,那么,他会立 ...
- 洛谷.1486.[NOI2004]郁闷的出纳员(Splay)
题目链接 /* BZOJ1503: 3164kb 792ms/824ms(新建节点) 洛谷 : 3.06mb 320ms/308ms(前一个要慢wtf 其实都差不多,但前者好写) 四种操作: A:所有 ...
- bzoj1503[NOI2004]郁闷的出纳员——Splay
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1503 好奇怪呀!为什么而TLE? 各种修改终于卡时过了.可是大家比我快多了呀?难道是因为自己 ...
- BZOJ[NOI2004]郁闷的出纳员 | Splay板子题
题目: 洛谷也能评测....还有我wa了10多次的记录233 题解: 不要想得太复杂,搞一个全局变量记录一下工资的改变量Delta,这样可以等询问的时候就输出val+Delta,然后插入的时候插入x- ...
- bzoj1503 [NOI2004]郁闷的出纳员(名次树+懒惰标记)
1503: [NOI2004]郁闷的出纳员 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 8705 Solved: 3027[Submit][Statu ...
随机推荐
- 关于虚继承的sizeof问题
首先关于虚继承和普通继承的知识,我总结一下: 1.普通继承时,无论派生类是否定义新的虚函数,基类和派生类总是共享一个虚函数表,不需要另加指向虚函数的指针,派生类只是将虚函数表中的元素改成了派生类的地址 ...
- μC/OS-III---I笔记3---时间管理
时间管理相关函数,其实深入根本的理解就是一些对时间任务相关变量,数据结果进行修改的函数这样方便对应任务查找延时等时间相关的任务有没有到期.前面的时间相关的函数是这些操作的基 1.延时函数 OsTIme ...
- js 可选链 & 空值合并 In Action
js 可选链 & 空值合并 In Action const obj = { props: { name: 'eric', }, // prop, 不存在的属性 ️ }; console.log ...
- O² & O₂
O² & O₂ special symbol O² & O₂ HTML HTML subscript and superscript Tags HTML 下标元素 HTML 上标元素 ...
- 前端监控平台 & 架构
前端监控平台 & 架构 1px 透明的 gif 字节小, 43 bytes 支持跨域, 兼容场景多,零配置 https://en.wikipedia.org/wiki/GIF demo htt ...
- 线上 S1 故障是什么, 线上 S1 故障, 运维故障分级, 运维, 故障分级, P1 级别故障, 故障, P1 , S1
线上 S1 故障是什么 线上 S1 故障, 运维故障分级, 运维, 故障分级, P1 级别故障, 故障, P1 , S1 故障复盘 https://time.geekbang.org/column/a ...
- Dart: path库
path库pub地址 安装: dependencies: path: 使用: import 'dart:io'; import 'package:path/path.dart' as path; ma ...
- js 截取固定长度字符串但不打断单词
适用地方:英文网站中,比如面包屑导航处新闻标题过长.用css截取文本简介时将单词打断 // 使用方法 // 1.复制下面函数 // 2.调用 // 3.填参数 sliceString(targe ...
- 以NGK 呼叫河马为例分析智能合约漏洞在哪?
合约交易是指买方和卖方根据约定,在未来某一时刻,以指定价格接受某一资产的协议. 合约是买卖双方之间权利义务的表现形式.合约交易是一种金融衍生工具,与现货市场相比,用户通过判断期货合约交易的涨跌,选择买 ...
- PBN旁切转弯的精确化计算
PBN转弯保护区中使用频率最高的当属旁切转弯,风螺旋的精确算法会对旁切转弯的绘制带来哪些变化,通过今天这个例子我们来了解一下. 图III-3-2-3 旁切转弯保护区 一.基础参数: ICAO816 ...