【描述】

同学们一起看了小品《不差钱》,LX神突发奇想,想刁难一下十八居士,他让十八居士模拟一下点菜的过程。

【输入格式】

输入第一行为一个数price,表示价钱大于price的菜赵本山都不要。

以下几行表示点菜的过程,每行两个整数p,n

p=1 表示在菜谱中添加一个价格为n的菜,这是第i个1号命令,这个菜的编号就是i,

p=2 表示菜谱中第n号菜已卖完(但不代表菜谱中没有了这种菜),

p=3 表示赵本山点第n贵的菜。

输入文件以0结束。

菜的价格0<n<=10^6。

3种命令, 30%数据命令最多300次, 60%数据命令最多3000次, 100%数据命令最多100000次。

【输出格式】

对于每个p=3, 如果第n贵的菜价格高于price,则输出“Dui bu qi,Mei you.”。

如果第n贵的菜价格不高于price,且没有卖完,则输出“You.”然后输出价格" m Yuan.";

如果已卖完,则输出“Mei you. Zhe ge ke yi you. Zhe ge zhen mei you!”

【分析】

题目意思表达得比较明确,本题也很适合作为SBT的模板题。

菜的编号就是存在SBT静态数组中的下标,只要加一个是否empty的标记即可。

唯一稍微可能有点问题的是出现多个相同菜价的菜时的选择问题,一开始按照普通二叉树的写法写SBT的前趋后继,后来发现这样做其实是不严谨的,因为左右旋操作的存在,虽然一开始相等的数是插入到右边去,但是不能保证不会因为左旋而把父节点旋到左子树去了,所以最后只能保证左子树的值不大于根,右子树的值不小于根,相等值是完全没办法判断的。

......最后只好继续查找第n-1大、n-2大...第n+1大、第n+2大...直到找到不相等为止,O(k*logn)遍历一遍相等的数。

好在测试时间上好像还不错,不知道又没有更好的办法?

 /* ***********************************************
MYID : Chen Fan
LANG : G++
PROG : VIJOS1647
************************************************ */ #include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm> using namespace std; #define MAXN 100010 typedef struct sbtnod
{
int key,left,right,size;
bool empty;
} sbtnode;
int sbttail,sbt; sbtnode tree[MAXN]; void rrotate(int& t)
{
int k=tree[t].left;
if (!k) return ;
tree[t].left=tree[k].right;
tree[k].right=t;
tree[k].size=tree[t].size;
tree[t].size=tree[tree[t].left].size+tree[tree[t].right].size+;
t=k;
} void lrotate(int& t)
{
int k=tree[t].right;
if (!k) return ;
tree[t].right=tree[k].left;
tree[k].left=t;
tree[k].size=tree[t].size;
tree[t].size=tree[tree[t].left].size+tree[tree[t].right].size+;
t=k;
} void maintain(int& t,bool flag)
{
if (!t) return ;
if (!flag)
if (tree[tree[tree[t].left].left].size>tree[tree[t].right].size) rrotate(t);
else if (tree[tree[tree[t].left].right].size>tree[tree[t].right].size)
{
lrotate(tree[t].left);
rrotate(t);
} else return ;
else
if (tree[tree[tree[t].right].right].size>tree[tree[t].left].size) lrotate(t);
else if (tree[tree[tree[t].right].left].size>tree[tree[t].left].size)
{
rrotate(tree[t].right);
lrotate(t);
} else return ; maintain(tree[t].left,false);
maintain(tree[t].right,true);
maintain(t,false);
maintain(t,true);
} void insert(int& t,int v)
{
if (!t)
{
sbttail++;
tree[sbttail].key=v;
tree[sbttail].size=;
tree[sbttail].empty=false;
t=sbttail;
} else
{
tree[t].size++;
if (v<tree[t].key) insert(tree[t].left,v);
else insert(tree[t].right,v);
maintain(t,v>=tree[t].key);
}
} int select(int t,int k)
{
if (k==tree[tree[t].left].size+) return t;
if (k<=tree[tree[t].left].size) return select(tree[t].left,k);
else return select(tree[t].right,k--tree[tree[t].left].size);
} int main()
{
freopen("1.txt","r",stdin); int pri;
scanf("%d",&pri); sbt=;
sbttail=; int p,n;
while(scanf("%d%d",&p,&n)==)
{
switch(p)
{
case :
insert(sbt,n);
break;
case :
tree[n].empty=true;
break;
case :
n=sbttail-n+;
int temp=select(sbt,n);
if (tree[temp].key>pri) printf("Dui bu qi,Mei you.\n");
else
{
bool done=false;
if (!tree[temp].empty)
{
done=true;
printf("You. %d Yuan.\n",tree[temp].key);
} else
{
int pre,p=n;
while(p>&&(!done))
{
p--;
pre=select(sbt,p);
if (tree[pre].key<tree[temp].key) break;
if (!tree[pre].empty)
{
done=true;
printf("You. %d Yuan.\n",tree[temp].key);
}
}
int suc,s=n;
while(s<n&&(!done))
{
s++;
suc=select(sbt,s);
if (tree[suc].key>tree[temp].key) break;
if (!tree[suc].empty)
{
done=true;
printf("You. %d Yuan.\n",tree[temp].key);
}
}
}
if (!done) printf("Mei you. Zhe ge ke yi you. Zhe ge zhen mei you!\n");
}
}
} return ;
}

VIJOS P1647 不差钱 SBT的更多相关文章

  1. VIJOS P1081 野生动物园 SBT、划分树模板

    [描述] cjBBteam拥有一个很大的野生动物园.这个动物园坐落在一个狭长的山谷内,这个区域从南到北被划分成N个区域,每个区域都饲养着一头狮子.这些狮子从北到南编号为1,2,3,…,N.每头狮子都有 ...

  2. Idea下用SBT搭建Spark Helloworld

    没用过IDEA工具,听说跟Eclipse差不多,sbt在Idea其实就等于maven在Eclipse.Spark运行在JVM中,所以要在Idea下运行spark,就先要安装JDK 1.8+ 然后加入S ...

  3. 【BZOJ 1061】【Vijos 1825】【NOI 2008】志愿者招募

    http://www.lydsy.com/JudgeOnline/problem.php?id=1061 https://vijos.org/p/1825 直接上姜爷论文... #include< ...

  4. 如何解决Maven和SBT下载Jar包太慢

    国内:如何解决Maven和SBT下载Jar包太慢 Maven 远程仓库 <mirror> <id>ui</id> <mirrorOf>central&l ...

  5. 查看sbt版本

    进入 sbt 命令行模式, 键入sbtVersion 得到[info]0.13.12

  6. 【知识积累】SBT+Scala+MySQL的Demo

    一.背景 由于项目需要,需要在Sbt+Scala项目中连接MySQL数据库.由于之前使用Maven+Java进行依赖管理偏多,在Sbt+Scala方面也在不断进行摸索,特此记录,作为小模块知识的积累. ...

  7. vijos P1915 解方程 加强版

    背景 B酱为NOIP 2014出了一道有趣的题目, 可是在NOIP现场, B酱发现数据规模给错了, 他很伤心, 哭得很可怜..... 为了安慰可怜的B酱, vijos刻意挂出来了真实的题目! 描述 已 ...

  8. vijos P1780 【NOIP2012】 开车旅行

    描述 小\(A\)和小\(B\)决定利用假期外出旅行,他们将想去的城市从\(1\)到\(N\)编号,且编号较小的城市在编号较大的城市的西边,已知各个城市的海拔高度互不相同,记城市\(i\)的海拔高度为 ...

  9. 解决Scala Play框架在Git Bash运行的异常:Could not find configuration file ../framework/sbt/sbt.boot.properties

    Git Bash+ConEmu可以模拟Linux强大的命令行.不过在结合Scala和Play时,需要注意如下事项: 1. Scala的安装在64位操作系统下,默认会放在“C:\Program File ...

随机推荐

  1. java求阶乘

    //阶乘 public static int rec(int n){ if(n==1){ return 1; }else{ return n*rec(n-1); } }

  2. Microsoft SqlSever 数据库--软谋1

    百度百科--Microsoft SqlSever SQL是英文Structured Query Language的缩写,意思为结构化查询语言.SQL语言的主要功能就是同各种数据库建立联系,进行沟通.按 ...

  3. robot framework -重点记录

    1.s2l打开的driver和webdriver打开的driver不是同一个driver. rf打开的浏览器.调用的是s2l的driver,而自己的库用的是webdriver的driver,这样在rf ...

  4. wmts调用路径手工合成

    wmts调用路径手工合成 一般OGC WMTS地图只提供了xml描述,地图应用常常要合成WMTS完整的调用URL.我们需要获知以下参数: BaseURL:例如 "http://10.36.5 ...

  5. python 字典排序,列表排序详细

    在程序中使用字典进行数据信息统计时,由于字典是无序的所以打印字典时内容也是无序的.因此,为了使统计得到的结果更方便查看需要进行排序.Python中字典的排序分为按“键”排序和按“值”排序. 1.按“值 ...

  6. http GET

    向php脚本中传参数可以用http GET 方法,比如要向file.php传两个参数v1和v2.则可以这么做 file.php?v1=&v2= (一个链接而已,直接编辑URL即可传参数了) 这 ...

  7. "Debugging not possible in single session mode"

    PLSQL  Developer在测试存储过程,遇到"Debugging not possible in single session mode" 解决办法: 点击菜单栏" ...

  8. 在vim中使用perltidy美化perl代码

    来源: http://www.cnblogs.com/itech/archive/2013/02/18/2915279.html 格式优美的perl代码不但让人赏心悦目,而且可以方便阅读. perlt ...

  9. linux4.1.6+aufs4.1

    http://aufs.sourceforge.net/ linux kernel version aufs version 4.0 and later aufs4 Currently aufs4 s ...

  10. 字符串查找 cmd find命令

    find /i "ora-" *.log 我对findstr是如此的依赖,以至于当我向各位讲解find命令的时候,我还得老老实实地在cmd窗口中敲下 find /? 这条命令,然后 ...