二次联通门 : BZOJ 1503: [NOI2004]郁闷的出纳员

/*
BZOJ 1503: [NOI2004]郁闷的出纳员 考虑这样一个事实
无论是加或减
都是针对全体人员的 那么只需要记录一个总标记 直接记录对于工资的加或减 每次查询最低要求工资与标记的差的前驱,并旋到根处 那么根节点的所有左子树都是不符合要求要走人的
每次记录一下搞一搞, 就不用考虑splay麻烦的标记下放问题了

  但是却没调出来。。。
*/
#include <cstdio> void read (int &now)
{
register char word = getchar ();
bool temp = false;
for (now = ; word < '' || word > ''; word = getchar ())
if (word == '-')
temp = true;
for (; word >= '' && word <= ''; now = now * + word - '', word = getchar ());
if (temp)
now = -now;
} int Min_N; struct S_D
{
S_D *child[], *father; int key;
int weigth, size; inline void Updata ()
{
this->size = this->weigth;
if (this->child[])
this->size += this->child[]->size;
if (this->child[])
this->size += this->child[]->size;
} S_D ()
{
child[] = child[] = NULL;
size = weigth = ;
key = ;
father = NULL;
} inline int Get_Pos ()
{
return this->father->child[] == this;
} inline void Clear ()
{
this->child[] = this->child[] = father = NULL;
}
}; int Answer;
class Splay_Tree_Type
{ private : S_D *Root; inline void Rotate (S_D *now)
{
S_D *Father = now->father;
register int pos = now->Get_Pos () ^ ;
Father->child[pos ^ ] = now->child[pos];
if (now->child[pos])
now->child[pos]->father = Father;
if ((now->father = Father->father) != NULL)
now->father->child[now->father->child[] == Father] = now; Father->father = now;
now->child[pos] = Father; Father->Updata ();
now->Updata (); if (now->father == NULL)
Root = now;
} inline void Splay (S_D *now)
{
for (S_D *Father; Father = now->father; this->Rotate (now))
if (Father->father != NULL)
this->Rotate (now->Get_Pos () == Father->Get_Pos () ? Father : now);
} S_D* Find (int x)
{
S_D *now = Root;
for (; (now != NULL && now->key != x); now = now->child[x > now->key]);
if (now == NULL)
return now;
Splay (now);
return now;
} void Delete_point (int x)
{
S_D *now = Find (x);
if (now->weigth > )
{
now->weigth --;
return ;
}
if (now->child[] == NULL && now->child[] == NULL)
{
now->Clear ();
Root = NULL;
return ;
}
S_D *res;
if (now->child[] == NULL)
{
Root = now->child[];
now->child[]->father = NULL;
now->Clear ();
return ;
}
if (now->child[] == NULL)
{
Root = now->child[];
now->child[]->father = NULL;
now->Clear ();
return ;
}
S_D *Prefix = Find_Prefix (x);
res = Root;
Prefix->child[] = res->child[];
res->child[]->father = Root;
res->Clear ();
Root->Updata ();
} void Delete_tree (int x)
{
S_D *now = Find_Suffix (x);
if (now == NULL)
return ;
Answer += now->child[]->size;
now->child[]->father = NULL;
now->child[] = NULL;
now->Updata ();
} S_D *Find_Suffix (int x)
{
this->Insert (x);
S_D *now = Root;
if (now->child[] == NULL)
{
this->Delete_point (x);
return NULL;
}
for (now = now->child[]; now->child[]; now = now->child[]);
this->Delete_point (x);
if (now == NULL)
return now;
this->Splay (now);
return now;
} S_D *Find_Prefix (int x)
{
this->Insert (x);
S_D *now = Root;
if (now->child[] == NULL)
{
this->Delete_point (x);
return NULL;
}
for (now = now->child[]; now->child[]; now = now->child[]);
this->Delete_point (x);
if (now == NULL)
return now;
this->Splay (now);
return now;
} public : int Flandre_Scarlet; void Insert (int x)
{
if (Root == NULL)
{
Root = new S_D ;
Root->key = x;
return ;
}
S_D *now = Root, *Father;
for (; ;Father = now, now = now->child[x > now->key])
{
if (now == NULL)
{
now = new S_D;
now->key = x;
now->father = Father;
Father->child[x > Father->key] = now;
this->Splay (now);
return ;
}
if (x == now->key)
{
now->weigth ++;
this->Splay (now);
return ;
}
}
} void Cut (int x)
{
int Need = Min_N - Flandre_Scarlet;
S_D *now = this->Find_Prefix (Need);
if (now != NULL)
this->Delete_tree (now->key);
} int Query (int x)
{
S_D *now = Root;
for (register int res = ; ; )
{
if (now->child[] && x < now->child[]->size)
now = now->child[];
res += (now->child[] ? now->child[]->size : ) + now->weigth;
if (x <= res)
return now->key;
x -= res;
now = now->child[];
}
} void Change (int x)
{
Flandre_Scarlet += x;
return ;
} int Query_Size ()
{
return Root->size;
}
}; Splay_Tree_Type Splay; int main (int argc, char *argv[])
{
freopen ("cashier.in", "r", stdin);
freopen ("cashier.out", "w", stdout);
int N;
read (N);
read (Min_N);
char type[];
register int Size;
for (int x; N --; )
{
scanf ("%s", type);
read (x);
if (type[] == 'I')
Splay.Insert (x);
else if (type[] == 'S')
Splay.Change (-x);
else if (type[] == 'A')
Splay.Change (x);
else
{
Splay.Cut (x);
Size = Splay.Query_Size ();
if (x > Size)
puts ("-1");
else
printf ("%d\n", Splay.Query (Size - x) + Splay.Flandre_Scarlet);
}
}
printf ("%d", Answer);
return ;
} /*
20 0
I 4
F 1
I 6
S 9
F 14
I 6
I 7
A 8
I 3
F 2
I 9
I 6
I 6
S 3
S 5
I 6
F 1
I 3
A 2
F 5
*/ /*
4
-1
14
7
3
5
*/

(WA)BZOJ 1503: [NOI2004]郁闷的出纳员的更多相关文章

  1. BZOJ 1503: [NOI2004]郁闷的出纳员

    1503: [NOI2004]郁闷的出纳员 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 10526  Solved: 3685[Submit][Stat ...

  2. BZOJ 1503: [NOI2004]郁闷的出纳员 splay

    1503: [NOI2004]郁闷的出纳员 Description OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作 ...

  3. bzoj 1503: [NOI2004]郁闷的出纳员 Treap

    1503: [NOI2004]郁闷的出纳员 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 6263  Solved: 2190[Submit][Statu ...

  4. bzoj 1503: [NOI2004]郁闷的出纳员 -- 权值线段树

    1503: [NOI2004]郁闷的出纳员 Time Limit: 5 Sec  Memory Limit: 64 MB Description OIER公司是一家大型专业化软件公司,有着数以万计的员 ...

  5. 1503: [NOI2004]郁闷的出纳员 (SBT)

    1503: [NOI2004]郁闷的出纳员 http://www.lydsy.com/JudgeOnline/problem.php?id=1503 Time Limit: 5 Sec  Memory ...

  6. bzoj 3224 NOI2004郁闷的出纳员

    NOI2004郁闷的出纳员 2013年12月26日6,1818 输入描述 Input Description 第一行有两个非负整数n和min.n表示下面有多少条命令,min表示工资下界. 接下来的n行 ...

  7. 【BZOJ】1503: [NOI2004]郁闷的出纳员(Splay)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1503 这题没有看题解就1a了-好开心,, 其实后面去看题解发现他们的都很麻烦,其实有种很简单的做法: ...

  8. 1503. [NOI2004]郁闷的出纳员【平衡树-splay】

    Description OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的 工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经 ...

  9. 1503: [NOI2004]郁闷的出纳员

    Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 13723  Solved: 4989[Submit][Status][Discuss] Descripti ...

随机推荐

  1. SVM的概率输出(Platt scaling)

    SVM的概率输出(Platt scaling) 2015-10-22 10:38:19 闲渔Love吉他 阅读数 8121 文章标签: Platt Scaling Calibr 更多 分类专栏: 计算 ...

  2. mybatis相关知识积累

    mybatis Statement Statement对象用于将 SQL 语句发送到数据库中. 实际上有三种 Statement 对象,它们都作为在给定连接上执行 SQL语句的包容器: Stateme ...

  3. CentOS7.5 安装MySql教程

    CentOS7位安装MySql教程 1.先检查系统是否装有mysql rpm -qa | grep mysql 2.下载mysql的repo源 wget http://repo.mysql.com/m ...

  4. 16-MySQL DBA笔记-调优基础理论和工具

    第五部分 性能调优与架构篇 本篇将为读者介绍性能调优的一些背景知识和理论,然后介绍一些工具的运用,最后介绍从应用程序到操作系统.到数据库.到存储各个环节的优化. 性能调优是一个高度专业的领域,它需要一 ...

  5. (五)CXF之添加拦截器

    一.需求分析 webService中的拦截器类似于servlet的Filter过滤器.一般用于调用服务前后先调用拦截器的方法. 二.案例 本章案例是基于上一章节的基础上添加拦截器的 2.1 服务端添加 ...

  6. powerdesign中逆向工程后name和comment的互换

    powerdesign 中,将数据库中可以逆向生成pdm的结构图,比较清晰看到系统的结构, 但假如是db先行的话,一般是db中的每个列中用comment中文注释说明这列是 干什么的,但逆向工程后,会发 ...

  7. java01_简介_开发环境

    JAVA的前世今生 美国SUN(Stanford University Network)公司,在中国大陆的正式中文名为"太阳计算机系统(中国)有限公司",在中国台湾的正式中文名为& ...

  8. C#使用Selenium网页自动化

    工作中很多时候经常需要网抓数据或者把数据填写到网站上,使用Selenium将其自动化是一种不错的选择.Selenium其实是一个用于Web应用程序测试的工具,测试你的应用程序看是否能够很好地工作在不同 ...

  9. JVM学习笔记——字节码指令

    JVM学习笔记——字节码指令 字节码 0与 1是计算机仅能识别的信号,经过0和1的不同组合产生了数字之上的操作.另外,通过不同的组合亦产生了各种字符.同样,可以通过不同的组合产生不同的机器指令.在不同 ...

  10. MySQL菜鸟入门“秘籍”

    一.MySQL简介 1.什么是数据库 ? 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库,它产生于距今六十多年前,随着信息技术和市场的发展,特别是二十世纪九十年代以后,数据管理不 ...