# 51 条题解

• @ 2018-02-21 21:23:19

来一发splay
因为结点不能重复所以我们用`to[]`来记录每种菜对应的树上的结点编号
`vis[]`来记录这种菜有没有被卖完
`tree[].cnt`来记录价格为`tree[].v`的且没买完的菜有多少

``````#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=100000+10;
struct splay_node
{
int son[2],fa,size,cnt,v;
}tree[maxn];
int to[maxn],kind,vis[maxn];
int root,price,tot;
void update(int now)
{
if(!now)return ;
int lc=tree[now].son[0],rc=tree[now].son[1];
tree[now].size=tree[lc].size+tree[rc].size+1;
}
void rotate(int now)
{
int f=tree[now].fa,g=tree[f].fa;
int flag=tree[f].son[1]==now;
tree[now].fa=g;
tree[g].son[tree[g].son[1]==f]=now;
tree[f].son[flag]=tree[now].son[flag^1];
tree[tree[now].son[flag^1]].fa=f;
tree[f].fa=now;
tree[now].son[flag^1]=f;
update(f);update(now);
}
void splay(int now,int goal)
{
while(tree[now].fa!=goal)
{
int f=tree[now].fa,g=tree[f].fa;
if(g!=goal)
(tree[f].son[0]==now)^(tree[g].son[0]==f)?rotate(now):rotate(f);
rotate(now);
}
if(!goal)root=now;
}
void insert(int value)
{
int now=root,f=0;
while(now&&tree[now].v!=value)
{
f=now;
now=tree[now].son[tree[now].v<value];
}
if(now)
{
tree[now].size++;
tree[now].cnt++;
to[++kind]=now;
update(f);
}
else
{
now=++tot;
to[++kind]=now;
tree[now].cnt=1;
tree[now].size=1;
tree[now].v=value;
tree[now].fa=f;
tree[f].son[tree[f].v<value]=now;
update(f);
}
splay(now,0);
}
int find(int now,int k)
{
int lc=tree[now].son[0],rc=tree[now].son[1];
if(tree[now].size-tree[rc].size==k)return now;
else if(tree[lc].size>=k)return find(lc,k);
else if(tree[now].size-tree[rc].size>k&&k>tree[lc].size)return now;
else return find(rc,k-tree[lc].size-1);
}
inline void work(int x)
{
int pos=find(root,tot-x+1);
if(tree[pos].v>price)printf("Dui bu qi,Mei you.\n");
else if(tree[pos].v<=price&&tree[pos].cnt)printf("You. %d Yuan.\n",tree[pos].v);
else if(tree[pos].v<=price&&tree[pos].cnt==0)printf("Mei you. Zhe ge ke yi you. Zhe ge zhen mei you!\n");
splay(pos,0);
}
int op,x;
int main()
{
scanf("%d",&price);
while(~scanf("%d",&op)&&op)
{
scanf("%d",&x);
switch(op)
{
case 1:insert(x);break;
case 2:if(!vis[x])
{
tree[to[x]].cnt--;
vis[x]=1;
}break;
case 3:work(x);break;
}
}
return 0;
}
``````
• @ 2015-04-27 17:14:57

平板电视大法好。
因为不能插入重复节点，所以用1个`long long`存编号和价格，并且用hash存每个价格对应的没有卖完的个数。
用法见saffah神牛的WC课件
要加读入优化，否则会T掉。

``````#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#include <cstdio>
#include <cstring>
#ifdef LOCAL
#define null_type null_mapped_type
#endif
using namespace std;
using namespace __gnu_pbds;
const int MAXBUFLEN=1700000;
int h[1000001];
int pr[100001];
char buf[MAXBUFLEN];
int bufpos;
{
char c;
int val = 0;
for (; ((c = buf[bufpos]) < '0' || c > '9'); ++bufpos);
for (; (c = buf[bufpos]) >= '0' && c <= '9'; ++bufpos)
val = val * 10 + c - '0';
return val;
}
int main(){
buf[fread(buf, 1, MAXBUFLEN, stdin)] = '\0';
bufpos=0;
tree<long long,null_type,greater<long long>,rb_tree_tag,tree_order_statistics_node_update> bst;
int p,n,price,now=0;
memset(h,0,sizeof(h));
int t;
if (p==0) break;
switch (p){
case 1:now++;h[n]++;pr[now]=n;bst.insert(n*1000000LL+now);break;
case 2:h[pr[n]]--;break;
case 3:{
t=*(bst.find_by_order(n-1))/1000000;
if (t>price) puts("Dui bu qi,Mei you.");
if ((t<=price) && (h[t]>0)) printf("You. %d Yuan.\n",t);
if ((t<=price) && (h[t]<=0)) puts("Mei you. Zhe ge ke yi you. Zhe ge zhen mei you!");
break;
}
}
}
}
``````
• @ 2017-01-27 11:38:38

题意不清！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！看了别人的代码，为啥价格高于price的相同价格算作不同的第i贵，而小于等于price的相同价格就算做同样的第i贵！！！！！
#include <bits/stdc++.h>
#include <ext/pb_ds/tree_policy.hpp>
#include <ext/pb_ds/assoc_container.hpp>
using namespace std;

int x = 0, f = 1; char ch = getchar();
while (ch < '0' || ch > '9') { if (ch == '-') f = -f; ch = getchar(); }
while (ch >= '0' && ch <= '9') { x = x * 10 - '0' + ch, ch = getchar(); }
return x * f;
}

typedef pair<int, int> PII;
const int INF = INT_MAX;

struct Node {
Node *ch[2];
int v, w, sz, r;

Node(int v): v(v) {
ch[0] = ch[1] = NULL;
w = sz = v == INF ? 0 : 1;
r = rand();
}

int cmp(int x) const {
if (x == v) return -1;
return x < v ? 0 : 1;
}

void push_up() {
sz = ch[0]->sz + ch[1]->sz + w;
}
};

Node *null = new Node(INF);
Node *root = null;

inline void rotate(Node* &rt, int d) {
Node *k = rt->ch[d ^ 1];
rt->ch[d ^ 1] = k->ch[d];
k->ch[d] = rt;
rt->push_up(); k->push_up();
rt = k;
}

int tot = 0;

void Insert(int v, Node* &rt) {
if (rt == null) {
tot++;
rt = new Node(v);
rt->ch[0] = rt->ch[1] = null;
} else {
int d = rt->cmp(v);
if (d == -1) rt->w++;
else {
Insert(v, rt->ch[d]);
if (rt->ch[d]->r > rt->r) rotate(rt, d ^ 1);
}
}
rt->push_up();
}

PII kth(int k, Node *rt) {
if (rt == null || k <= 0 || k > rt->sz) return make_pair(0, 0);
int s = rt->ch[0]->sz;
if (k > s && k <= s + rt->w) return make_pair(rt->w, rt->v);
else if (k <= s) return kth(k, rt->ch[0]);
else return kth(k - s - rt->w, rt->ch[1]);
}

int price, p, n, sold[1000010], menu[1000010];

int main() {
int num = 0, cnt = 0;
if (p == 1) {
if (n > price) cnt++;
else Insert(n, root);
} else if (p == 2) sold[menu[n]]++;
else {
if (n <= cnt) printf("Dui bu qi,Mei you.\n");
else {
PII x = kth(tot - n + cnt + 1, root);
if (x.first - sold[x.second] >= 1) printf("You. %d Yuan.\n", x.second);
else printf("Mei you. Zhe ge ke yi you. Zhe ge zhen mei you!\n");
}
}
}
return 0;
}

• @ 2016-06-25 20:08:14

我靠！被第一个点坑惨
数据如下：
99
1 100
3 1
1 99
1 99
1 99
2 4
2 2
3 2
0
（mdzz）
输出应为
Dui bu qi,Mei you.
You. 99 Yuan.
（第二行不是Mei you. Zhe ge ke yi you. Zhe ge zhen mei you!）

• @ 2016-06-12 10:10:39

弱弱的Splay跑得相当慢……400+ms才跑完……
然而第一个点莫名其妙……Vijos的输出格式果然名不虚传……
```pascal
program Vijos_1647;
const
MaxM=1000000;
Inf=2000000;
var
cnt,price,c,n,root,x:longint;
data:array[1..MaxM] of longint;
emp:array[1..MaxM] of boolean;
l,r,p,size:array[1..MaxM] of longint; // Data To Save The Splay Tree

procedure maintain(x:longint);
begin
size[x]:=1;
if l[x]<>0 then size[x]:=size[x]+size[l[x]];
if r[x]<>0 then size[x]:=size[x]+size[r[x]];
end;

procedure rotate(x,dir:longint);
var y:longint;
begin
y:=p[x];
if dir=0 then begin
l[y]:=r[x];
if r[x]<>0 then p[r[x]]:=y;
end else begin
r[y]:=l[x];
if l[x]<>0 then p[l[x]]:=y;
end;
p[x]:=p[y];
if p[y]<>0 then begin
if y=l[p[y]] then l[p[y]]:=x else r[p[y]]:=x;
end;
p[y]:=x;
if dir=0 then r[x]:=y else l[x]:=y;
maintain(y);
maintain(x);
end;

procedure Splay(var x,S:longint);
var y,z:longint;
begin
z:=p[S];
while p[x]<>z do begin
y:=p[x];
if y=S then begin
if x=l[y] then rotate(x,0) else rotate(x,1);
break;
end;
if x=l[y] then begin
if y=l[p[y]] then begin
rotate(y,0);rotate(x,0);
end else begin
rotate(x,0);rotate(x,1);
end;
end else begin
if y=r[p[y]] then begin
rotate(y,1);rotate(x,1);
end else begin
rotate(x,1);rotate(x,0);
end;
end;
end;
S:=x;
end;

procedure insert(n:longint;var S:longint);
var x:longint;
begin
x:=S;
while true do begin
if n>=data[x] then begin
if l[x]<>0 then x:=l[x] else break;
end else begin
if r[x]<>0 then x:=r[x] else break;
end;
end;
inc(cnt);
l[cnt]:=0;
r[cnt]:=0;
p[cnt]:=x;
data[cnt]:=n;
size[cnt]:=1;
emp[cnt]:=false;
if n>=data[x] then l[x]:=cnt else r[x]:=cnt;
Splay(cnt,S);
end;

function Query(n:longint;var S:longint):longint;
var x:longint;
begin
x:=S;
while true do begin
if (l[x]<>0) and (n=size[l[x]]+1) or (l[x]=0) and (n=1) then break;
if (l[x]<>0) and (n<size[l[x]]+1) then x:=l[x]
else if (l[x]=0) or (n>size[l[x]]+1) then begin
if l[x]<>0 then n:=n-size[l[x]]-1 else n:=n-1;
x:=r[x];
end;
end;
Splay(x,S);
Query:=x;
end;

begin
root:=1;
cnt:=1;
data[root]:=Inf;
size[root]:=1;
l[root]:=0;
r[root]:=0;
p[root]:=0;
emp[root]:=false;

while c<>0 do begin
case c of
1:insert(n,root);
2:emp[n+1]:=true;
3:begin
x:=Query(n+1,root);
if data[x]>price then
writeln('Dui bu qi,Mei you.')
else
if not emp[x] then
writeln('You. ',data[x],' Yuan.')
else
writeln('Mei you. Zhe ge ke yi you. Zhe ge zhen mei you!');
end;
end;
end;
end.

• @ 2016-06-25 19:24:56

求解第一个点什么鬼啊！！！！！！！！！

• @ 2015-11-23 14:13:28
• @ 2013-07-28 22:26:46

第一次写SBT 挺慢的啊。。。
VijosEx via JudgeDaemon2/13.7.4.0 via libjudge
编译成功

测试数据 #0: Accepted, time = 0 ms, mem = 552 KiB, score = 10
测试数据 #1: Accepted, time = 0 ms, mem = 564 KiB, score = 10
测试数据 #2: Accepted, time = 0 ms, mem = 564 KiB, score = 10
测试数据 #3: Accepted, time = 0 ms, mem = 612 KiB, score = 10
测试数据 #4: Accepted, time = 7 ms, mem = 620 KiB, score = 10
测试数据 #5: Accepted, time = 0 ms, mem = 600 KiB, score = 10
测试数据 #6: Accepted, time = 202 ms, mem = 3164 KiB, score = 10
测试数据 #7: Accepted, time = 218 ms, mem = 4476 KiB, score = 10
测试数据 #8: Accepted, time = 62 ms, mem = 1212 KiB, score = 10
测试数据 #9: Accepted, time = 109 ms, mem = 2120 KiB, score = 10
Accepted, time = 598 ms, mem = 4476 KiB, score = 100
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

#define MAXN 100001

struct saver {
saver *next;
int v;
};

struct node {
node* left_child,*right_child;
saver *rank;
int price;
int s,size;
};

int p,n;
int price;
int r=0;

node *roof,*bank;

int right_ratote(node* &t){
int s0=(t).size,s1=((*(t).left_child).right_child).size;
int s2=(
(*t).left_child).size;
node *k=(*t).left_child;
(*t).size-=s2;
(*t).size+=s1;
(*k).size=s0;
(t).left_child=((*t).left_child).right_child;
(t).s=((t).left_child).s+((*t).right_child).s+1;
(*k).right_child=t;
(*k).s=(t).s+((*k).left_child).s+1;
t=k;
return 0;
}

int left_ratote(node* &t){
node *k=(*t).right_child;
int z=(*k).size;
(*k).size=(*t).size;
(*t).size-=z;
(t).size+=((*k).left_child).size;
(*t).right_child=(*k).left_child;
(t).s=((t).left_child).s+((*t).right_child).s+1;
(*k).left_child=t;
(*k).s=(t).s+((*k).right_child).s+1;
t=k;
return 0;
}

int maintain(node* &t){
if ((((t).left_child).left_child).s>((*t).right_child).s){
right_ratote(t);
maintain((t).right_child);
maintain(t);
return 0;
}
if ((
(*(t).right_child).right_child).s>((*t).left_child).s){
left_ratote(t);
maintain((t).left_child);
maintain(t);
return 0;
}
if ((
(*(t).left_child).right_child).s>((*t).right_child).s){
left_ratote((*t).left_child);
right_ratote(t);
maintain((*t).left_child);
maintain((t).right_child);
maintain(t);
return 0;
}
if ((
(*(t).right_child).left_child).s>((*t).left_child).s){
right_ratote((*t).right_child);
left_ratote(t);
maintain((*t).left_child);
maintain((*t).right_child);
maintain(t);
return 0;
}
return 0;
}

int INSERT(int key,int rank,node* &t){
if (t==bank){
t=new(node);
(*t).left_child=(*t).right_child=bank;
(*t).s=(*t).size=1;
(*t).price=key;
(t).rank=new(saver);
(
(t).rank).next=NULL;
(
(*t).rank).v=rank;
return 0;
}
(*t).size++;
if ((*t).price==key){
saver *p=new(saver);
(*p).v=rank;
(*p).next=(*t).rank;
(*t).rank=p;
return 1;
}
int flag;
if (key<(*t).price){
flag=INSERT(key,rank,(*t).left_child);
} else flag=INSERT(key,rank,(*t).right_child);
if (!flag) {
(*t).s++;
}
maintain(t);
return flag;
}

bool f[MAXN];

node* SELECT(int x,node t){
if (x>(
(*t).right_child).size&&x<=(t).size-((t).left_child).size){
return t;
}
if (x<=(
(*t).right_child).size){
return SELECT(x,(*t).right_child);
}
return SELECT(x-((t).size-((*t).left_child).size),(*t).left_child);
}

int main(){
memset(f,true,sizeof(f));
bank=new(node);
(*bank).s=(*bank).size=0;
roof=(*bank).left_child=(*bank).right_child=bank;
scanf("%d",&price);
while (1){
scanf("%d",&p);
if (!p){
break;
}
scanf("%d",&n);
if (p==1){
INSERT(n,++r,roof);
}
if (p==2){
f[n]=false;
}
if (p==3){
node *p=SELECT(n,roof);
if ((*p).price>price){
printf("Dui bu qi,Mei you.\n");
} else {
bool flag=false;
saver *q=(*p).rank;
while (q!=NULL){
if (f[(*q).v]){
flag=true;
break;
}
q=(*q).next;
}
if (flag){
printf("You. %d Yuan.\n",(*p).price);
} else printf("Mei you. Zhe ge ke yi you. Zhe ge zhen mei you!\n");
}
}
}
return 0;
}

• @ 2010-03-16 22:42:16

SBT

如果觉得处理重复价格麻烦，可以直接

procedure find(v,data:longint);

begin

if (v=0) then exit;

if (not flag) then exit;

if (tree[v].data=data) then

begin

if (not saleout[tree[v].no]) then

begin

write('You.',data,'Yuan.');

flag:=false;

exit;

end;

find(tree[v].left,data);

find(tree[v].right,data);

exit;

end;

if (tree[v].data>data) then find(tree[v].left,data);

if (tree[v].data

• @ 2009-11-09 17:48:59

编译通过...

├ 测试数据 01：答案正确... 0ms

├ 测试数据 02：答案正确... 0ms

├ 测试数据 03：答案正确... 0ms

├ 测试数据 04：答案正确... 0ms

├ 测试数据 05：答案正确... 0ms

├ 测试数据 06：答案正确... 0ms

├ 测试数据 07：运行超时|无输出...

├ 测试数据 08：运行超时|无输出...

├ 测试数据 09：运行超时|格式错误...

什么现象。。

一样的程序今天交。。

编译通过...

├ 测试数据 01：答案正确... 0ms

├ 测试数据 02：答案正确... 0ms

├ 测试数据 03：答案正确... 0ms

├ 测试数据 04：答案正确... 0ms

├ 测试数据 05：答案正确... 0ms

├ 测试数据 06：答案正确... 0ms

├ 测试数据 07：答案正确... 0ms

├ 测试数据 08：答案正确... 0ms

├ 测试数据 09：答案正确... 0ms

├ 测试数据 10：答案正确... 0ms

---|---|---|---|---|---|---|---|-

Accepted 有效得分：100 有效耗时：0ms

• @ 2009-10-27 16:09:13

输出.......

疯掉了....

想AC，用write，并把输出的句子里的空格全都去掉，程序结束前加个writeln

60>70>90>AC

我就是这么熬出来的..

• @ 2009-10-25 20:42:49

编译通过...

├ 测试数据 01：答案正确... 0ms

├ 测试数据 02：答案正确... 0ms

├ 测试数据 03：答案正确... 0ms

├ 测试数据 04：答案正确... 0ms

├ 测试数据 05：答案正确... 0ms

├ 测试数据 06：答案正确... 0ms

├ 测试数据 07：答案错误...程序输出比正确答案长

├ 测试数据 08：答案正确... 56ms

├ 测试数据 09：运行时错误...|错误号: -1073741819

├ 测试数据 10：答案正确... 88ms

---|---|---|---|---|---|---|---|-

Unaccepted 有效得分：80 有效耗时：144ms

无语中………………这题谁有数据啊，我受不了了 - -！

要么用SBT，要么用Treap，怎么会错了

另外有哪位大牛知道错误号: -1073741819 是什么意思，谢谢了

• @ 2009-10-22 21:22:23

此题WS之处：

1.可能末尾没有0

2.要去掉空格，换行，不然70

3.同样的价格...我不会处理，搞了个Hash，可见我之沙茶......

Treap AC

• @ 2009-10-08 11:35:28

90分。

├ 测试数据 01：答案错误...程序输出比正确答案长

强烈鄙视这道题。

先要把所有空格和换行去掉不然60.

然后不知道为啥第一个wa。难道是程序问题么。

如果有大牛发现了第一个数据的特殊性。

麻烦告诉一下。发消息。

• @ 2009-10-04 21:23:33

编译通过...

├ 测试数据 01：答案正确... 0ms

├ 测试数据 02：答案正确... 0ms

├ 测试数据 03：答案正确... 0ms

├ 测试数据 04：答案正确... 0ms

├ 测试数据 05：答案正确... 0ms

├ 测试数据 06：答案正确... 0ms

├ 测试数据 07：答案正确... 0ms

├ 测试数据 08：答案正确... 41ms

├ 测试数据 09：答案正确... 0ms

├ 测试数据 10：答案正确... 0ms

---|---|---|---|---|---|---|---|-

Accepted 有效得分：100 有效耗时：41ms

Treap！

其实想想很简单……

• @ 2009-10-03 15:13:44

编译通过...

├ 测试数据 01：答案正确... 0ms

├ 测试数据 02：答案正确... 0ms

├ 测试数据 03：答案正确... 0ms

├ 测试数据 04：答案正确... 0ms

├ 测试数据 05：答案正确... 0ms

├ 测试数据 06：答案正确... 0ms

├ 测试数据 07：答案正确... 0ms

├ 测试数据 08：答案正确... 0ms

├ 测试数据 09：答案正确... 0ms

├ 测试数据 10：答案正确... 0ms

---|---|---|---|---|---|---|---|-

Accepted 有效得分：100 有效耗时：0ms

强大的平衡树啊！！！我love it！！！！

• @ 2009-10-03 12:21:00

program p1659;

var

a,sum,left,right:array[1..1000000] of longint;

i,j,k,n,m,x,y,z:longint;

function max(x,y:longint):longint;

begin

if x>y then exit(x)

else exit(y);

end;

procedure creat(root,h,t:longint);

var

m:longint;

begin

if h>t then exit;

left[root]:=h;

right[root]:=t;

if h=t then sum[root]:=a[h]

else

begin

m:=(h+t) div 2;

creat(root*2,h,m);

creat(root*2+1,m+1,t);

sum[root]:=max(sum[root*2],sum[root*2+1]);

end;

end;

procedure change(root,h,t,num:longint);

begin

if (left[root]>t)or(right[root]t)or(right[root]=h)and(right[root]

• @ 2009-10-02 16:15:37

编译通过...

├ 测试数据 01：答案正确... 0ms

├ 测试数据 02：答案正确... 0ms

├ 测试数据 03：答案正确... 0ms

├ 测试数据 04：答案正确... 0ms

├ 测试数据 05：答案正确... 0ms

├ 测试数据 06：答案正确... 0ms

├ 测试数据 07：答案正确... 119ms

├ 测试数据 08：答案正确... 0ms

├ 测试数据 09：答案正确... 0ms

├ 测试数据 10：答案正确... 0ms

---|---|---|---|---|---|---|---|-

Accepted 有效得分：100 有效耗时：119ms

蛤蛤蛤蛤蛤！！！！！！！！！！！！！

终于AC了！！！！！！！！！！！！！！！！！！！！！！！！

竟然有相同的啊！！！！！！！！！！！！！！！！！！！！！！！！！！！！

21次终于AC 无法言表的愉快啊！！！

• @ 2009-09-27 21:56:38

第一个数据很特殊吗？好囧的测评结果！

编译通过...

├ 测试数据 01：答案错误...程序输出比正确答案长

├ 测试数据 02：答案正确... 0ms

├ 测试数据 03：答案正确... 0ms

├ 测试数据 04：答案正确... 0ms

├ 测试数据 05：答案正确... 0ms

├ 测试数据 06：答案正确... 0ms

├ 测试数据 07：答案正确... 25ms

├ 测试数据 08：答案正确... 0ms

├ 测试数据 09：答案正确... 0ms

├ 测试数据 10：答案正确... 0ms

• @ 2009-09-26 19:42:19

program buchaqian;

type q=record

data:longint;

wei:integer;

end;

var i,j,k,m,n,price,e,r,t:longint;

a:array[1..100000] of q;

b:array[1..100000] of boolean;

p:array[1..100000] of 0..4;

procedure pp(m:longint);

var sr:longint;

begin

for sr:=1 to k do

if a[sr].wei=m then begin t:=sr;exit; end;

end;

procedure paixu(e,r:longint);

var x,y,i1,j1:longint;

asd:boolean;

begin

i1:=e;x:=a[e].data;y:=a[e].wei; j1:=r; asd:=b[e];

while i1j1 do

begin

while (i1j1)and(a[j1].data>x) do j1:=j1-1;

if (i1j1)then begin a[i1].data:=a[j1].data; a[i1].wei:=a[j1].wei;b[i1]:=b[j1]; i1:=i1+1 end;

while (i1j1)and(a[i1].data=2 then paixu(e,i1-1);

if r-i1>=2 then paixu(i1+1,r);

end;

procedure run(n:longint);

begin

if a[k-n+1].data>price then writeln('Dui bu qi,Mei you.');

if (a[k-n+1].data

• @ 2009-09-23 11:36:11

竟然没有注意到优先值。

应该按照题目中说的那样，

输出格式 Output Format

对于每个p=3，

1如果第n贵的菜价格高于price，则输出“Dui bu qi,Mei you.”。

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

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

如果满足1，则输出第一个，否则

如果满足2，则输出第二个，否则

如果满足3，则输出第三个。

ID
1647

9

(无)

1881

135

7%

1